![如何防止缓冲区交换](https://linux22.com/image/64372/%E5%A6%82%E4%BD%95%E9%98%B2%E6%AD%A2%E7%BC%93%E5%86%B2%E5%8C%BA%E4%BA%A4%E6%8D%A2.png)
这个问题特定于 Unix 和 Linux。但它也涉及编程和安全。
我的程序将通过几种方法之一获得明确的密码或解密密钥(解密密码文件、询问代理等),并且我想确保在使用后将其从内存中删除之前不能将其写入交换空间它。我认为这意味着获得不可交换的地址空间。但这通常需要root权限,而我的程序需要以非root身份运行。这可以在 Unix 中移植吗? Linux下有希望吗?
将系统配置为没有交换空间不是一个选项因为程序的用户可能没有这样的权限,虽然这可能会使系统更安全,但并非所有系统都能做到这一点。
我可以做这个部分在C中不过在 Python3 中实现这一点也很好。
我可以吗非根进程获取一些非交换页面为了安全?
我可以阻止此进程被暂停吗? 退出比写入交换的清晰密码更好。
答案1
在 Linux 上使用 mlockhttp://linux.die.net/man/2/mlock
mlock() 和 mlockall() 分别将调用进程的部分或全部虚拟地址空间锁定到 RAM 中,防止该内存被分页到交换区域。
手册页有更多详细信息。
答案2
我必须首先指出,我绝对不是安全方面的专家。
对于python部分,使用ctypes将mlock包装到python中似乎并不困难。从 man for mlock 的限制和权限部分来看,普通用户似乎可以锁定有限数量的内存。在我的系统上运行uname -a
给我的max locked memory (kbytes, -l) 64
应该足以存储密码(但你可能应该注意溢出)。
对于休眠,您无法处理该SIGSTOP
信号,但如果您的系统正常,您可能会收到SIGTSTP
(请参阅[linux下进程可以暂时冻结吗])。如果您只收到SIGSTOP
,[密码存储在内存中是安全的]似乎在说除非使用磁盘加密,否则你注定要失败,这对你来说可能不是一个有效的解决方案。然而,您也许可以通过处理来检测违规行为SIGCONT
,但这可能为时已晚。