有许多程序提供加密和密钥管理。
据我所知,当一个文件保存在硬盘上时,有时(经常?)复制内存中的文件,甚至可能是硬盘上其他位置的副本。当在程序中输入密码/密钥短语来解锁数据库时,我猜密码至少会在内存中保存很短的时间。我听说过对VeraCrypt的审计,其中一个问题是在从内存(第9页)中清除敏感数据时使用memset。
我的一般问题是:像VeraCrypt、1个通、基帕斯、GPG、LastPass、AES密码等程序如何处理这些问题:文件的多个副本以及在内存或硬盘的其他地方有一个密码/密钥/数据的副本?这些都是安全问题吗?
比如,我们VeraCrypt,这是一个在审计中出现的普遍问题吗?
(我只是出于好奇问这个问题。)
发布于 2016-10-20 15:41:03
您在这里混合了不同的东西,即加密软件和密码管理器。对于这两种方法,都无法将密钥存储在内存中,问题可以归结为一个:
在任何一种情况下,密码都将在内存中保存一段有限的时间,您需要在使用它之后重写它,以确保它不会停留在那里。如果您只是简单地重新分配内存,它就不能保证永远被覆盖。
memset可以将内存块设置为您想要的任何内容,因此它可以在这里帮助我们。问题:如果您使用编译器优化,编译器可能会认为memset是无用的,并且为了更高的效率删除它。
这就是为什么VeraCrypt包括一些特殊的函数,比如RtlSecureZeroMemory及其包装方法burn,以确保内存将被重置,如下所示:
BootArgs = *bootArguments;
BootArgsValid = TRUE;
burn (bootArguments, sizeof (*bootArguments));当然,这并不能保证100%的删除,因为现在您必须确保没有可能的执行路径忘记调用此函数。
在最近对VeraCrypt的审计中,发现有一次在代码段之后调用burn,其中可以抛出TC_THROW_FATAL_EXCEPTION,从而导致敏感数据留在内存中。
这通常是设计安全可靠程序的问题之一,如果您实现了防止内存泄漏的方法,则必须确保没有办法阻止它们被调用。
发布于 2016-10-24 18:11:55
像VeraCrypt、1 password、keepass、GPG、LastPass、AES Crypt等程序如何处理多个文件副本以及在内存或硬盘的其他地方拥有密码/密钥/数据副本的问题?
这将因产品而异。这就是为什么第三方审计是有价值的--验证该方法是否安全并正确实施。
这些都是安全问题吗?
是也不是。将安全问题放到上下文中通常是很重要的。拥有密码数据库的额外副本并不理想,因为它使信息泄露的可能性更大,但如果对文件设置了适当的保护,并且数据库被加密,则不太可能被利用。
同样,如果您使用密码存储,内存中的密码也不是可选的。值得冒险吗?可能吧。
发布于 2016-10-24 18:54:43
在内存中拥有敏感数据本身并不是一个安全问题--在任何“适当”的系统中,其他进程都无法访问它,只能以适当的、安全的方式使用。
这确实意味着披露该数据的某种风险--即,在内存被解除分配之后留下一个临时副本,然后可能将其分配给另一个进程;或者如果内存区域被交换到磁盘,但可以通过相当简单的技术措施来减轻这些风险,例如,在使用后和取消分配之前覆盖内存区域,并标记内存页,这样就无法分别交换内存。在开发这样的软件时,您需要确保已经采取了这些步骤,并且敏感数据不会以这种方式“泄漏”。
除此之外,OS将强制进程隔离,以便其他进程无法访问此敏感数据(与所有其他数据一样)。您仍然应该采取措施,尽量减少敏感数据在内存中的时间,以减少软件或操作系统中出现妥协的风险(例如“心脏出血”openssl漏洞),因此这是一个安全问题,但在必要时将敏感数据保存在内存中是可以接受和安全的做法。
https://security.stackexchange.com/questions/140324
复制相似问题