这个问题是Unix和Linux特有的。但这也是编程和安全问题。
我的程序将通过几种方法(解密密码文件、询问代理等)获得明确的密码或解密密钥,我希望确保在使用该密码文件后可以将其从内存中删除之前,不能将其写入交换空间。我认为这意味着要有不可交换的地址空间。但这通常需要根权限,而我的程序需要作为非根程序运行。这能在Unix中移植吗?它在Linux中有希望吗?
将系统配置为没有交换空间不是一个选项,因为程序的用户可能没有这样的权限,虽然这可能使系统更安全,但并非所有系统都能做到这一点。
我可以用C语言完成这个部分,不过在Python3中这样做也很好。
我的非根进程可以获得一些非交换页面作为安全性吗?
我能阻止这个过程被暂停吗?最好是退出,而不是为交换而编写的清除密码。
发布于 2015-05-05 11:53:41
在Linux上使用mlock http://linux.die.net/man/2/mlock
mlock()和mlockall()分别将调用进程的虚拟地址空间的一部分或全部锁定到RAM中,从而防止将该内存分页到交换区域。
手册页有更多细节。
发布于 2015-05-05 12:10:36
首先,我必须指出,我绝对不是安全方面的专家。
对于python部分,使用ctype将mlock封装到python似乎并不困难。从mlock的限制和权限部分来看,普通用户似乎可以锁定有限的内存。在我的系统上运行uname -a可以为我提供max locked memory (kbytes, -l) 64,它应该足以存储密码(但您可能需要处理溢出问题)。
对于休眠,您不能处理SIGSTOP信号,但是如果您的系统很优雅,您可以接收到SIGTSTP (参见[进程可以在linux中暂时冻结吗?])。如果您只接收到SIGSTOP,[密码在内存中是安全的]似乎会说,除非使用磁盘加密,否则您将失败,这对您来说可能不是有效的解决方案。不过,您可以通过处理SIGCONT来检测漏洞,但这可能为时已晚。
https://unix.stackexchange.com/questions/200523
复制相似问题