我注意到一些程序在使用后明确将零敏感内存分配。例如,OpenSSL有一种方法可以清除RSA密钥占用的内存:
“释放RSA结构rsa。此函数应始终用于释放RSA结构,因为它还可以通过首先清除内存来安全地释放子字段。”
如果任何(C / C ++)程序包含这样的敏感变量,你应该明确地将内存归零,如上所述吗? (或者,将记忆归为妄想或只是保护措施)?
此外,当程序完成时,任何分配的内存最终都会分配给另一个程序。在Linux系统上,是否在分配给另一个程序之前清理或清理了内存?或者,第二个程序可以读取第一个程序的一些旧内存吗?
答案 0 :(得分:3)
在Linux系统上,是否在分配给另一个程序之前清理或清理了内存?
是的,在任何可敬的桌面操作系统上,内存在从进程传递到另一个进程时都会被清理。您观察到的清理步骤是防止其他攻击,在同一地址空间中执行代码或获取允许其从目标进程的内存空间读取内存的权限。
如果任何(C / C ++)程序包含这样的敏感变量,你应该明确地将内存归零,如上所述吗?
只要您不再需要,就可以立即删除这些敏感数据。
答案 1 :(得分:1)
当具有敏感加密数据的GPG和OpenSSL等程序/库明确归零内存时,它与将内存“重新分配”到可以读取数据的其他程序的恐惧无关。由于多进程/多用户操作系统的工作方式,这基本上是不可能的。
归零数据的原因有两个:
如果代码是库,您希望防止调用程序不小心泄漏信息。即使包含敏感信息的内存无法重新分配给另一个进程,只要它仍在运行相同的程序映像(即只要它没有),就可以并且将在同一进程中重用已释放的内存不叫exec*
)。一个错误的程序可能会调用malloc
然后将缓冲区写入磁盘而不先填充整个分配的对象,在这种情况下,旧的潜在敏感信息可能会泄漏到磁盘。这类问题存在于像Microsoft Office这样的主要现实产品中(虽然它们现在可能已经修复)。
即使代码不是库而是独立程序,您可能希望在释放它之前将内存中的敏感数据归零,以避免偏执。如果联邦调查局破坏了您的门并将您的计算机拖走,他们随后可以检查交换分区上发生的任何事情。如果他们小心翼翼地将其移除,他们甚至可以检查ram内容。如果你对物理攻击感到偏执,你需要确保在使用它们之后在ram或磁盘上的任何地方不存在密码短语。许多加密程序甚至希望具有root访问权限,因此他们可以mlockall
他们的内存以防止任何东西被交换到磁盘(虽然在我看来这是愚蠢的 - 由于软件中的错误而导致根损害的严重风险关于物理攻击的偏执狂。)
如果您不担心物理攻击,或者您已经充分接触现实,并意识到物理攻击者可能有更好的方式来获取密码而不是交换分区取证,那么理由#2可能主要是虚假的,但是大多数软件无论如何只是为了保持坚果的快乐。 : - )
答案 2 :(得分:1)
从安全角度来看,您的记忆可能包含您不想留下的数据。如果进程崩溃并且核心文件将完全转储内存。可以深入研究这些核心文件和挖掘数据。对于支持呼叫,如果必须发送该核心文件,如果在使用后清理内存,则会感觉更安全。当我使用VMS时,一些敏感的客户甚至不会向我们提供转储文件(这使得调试非常困难)。
答案 3 :(得分:0)
在Linux系统上,是否在分配给另一个程序之前清理或清理了内存?
具体取决于详细信息,请参见mmap
手册页:
MAP_UNINITIALIZED(自Linux 2.6.33起)</ p>
Don't clear anonymous pages. This flag is intended to improve performance on embedded devices. This flag is only honored if the kernel was configured with the CONFIG_MMAP_ALLOW_UNINITIALIZED option. Because of the security implications, that option is normally enabled only on embedded devices (i.e., devices where one has complete control of the contents of user memory).
在将内存返回到操作系统之前将其归零是最好的,如果您的进程在有机会之前被信号杀死会发生什么?配置内核为您执行清理。