密码管理器是否会通过交换内存泄露信息?

信息安全 密码管理 记忆
2021-08-13 05:28:58

如何在内存中查找密码(密码管理器)文得出结论,如果您登录网站,密码将以明文形式显示。密码管理器倾向于将加密的密码存储在内存中,但他们需要对其进行解密才能登录。

内存转储要求目标机器正在运行并且受害者登录到一个帐户。密码可以以明文形式公开,并且可以创建内存转储(使用冷启动攻击或其他方式)。

但是交换呢?如果 RAM 容量不足并且内存被外包到磁盘,通常会使用它。外包容量可能包含未加密的密码,该密码将“永久”存储在磁盘上,直到被覆盖。运气好的话,攻击者可以稍后分析计算机的交换,而不需要目标使用计算机。

那么,交换是否容易受到这种攻击?


在阅读了答案后,我做了一些进一步的研究,并在 Askubuntu 上发现了一个类似的帖子,它建议加密交换分区。这应该避免交换内存中泄漏信息的问题。

2个回答

正如我在之前的评论中已经指出的那样,这种攻击已经被预见到并且已经被反击(大多数密码学使用应用程序)。

你这样做的方式是,你(开发人员)告诉操作系统(OS)不要换出内存的这个特定部分。操作系统通常会尊重这一点,并在内存管理器的某处“记下”,而不是把它换掉。然而,即使这个标记的区域也可能被换出(如果太多数据被声明为“不可交换”或内核模式程序需要“太多”内存),所以总比什么都不做(让它不可交换)但仍然不完美和告诉你不要标记所有不可交换的东西。

当您担心将秘密数据交换到磁盘时,您可能还担心许多操作系统提供的休眠状态,您实际上将当前的全部 RAM 写入磁盘,以便稍后可以更快地启动并恢复您的工作. 这种攻击场景不太常见,但应通过仔细处理(-> 在休眠/关机时擦除所有明文密钥/密码)和适当的数据加密来应对。

正如对另一个问题的评论中所问的那样,我还将快速提供(一些)概述,说明在哪里检查使用的(开源)程序是否易受攻击。


Windows:您需要检查代码的内存(密码管理)部分,并专门查找VirtualLock()VirtualUnlock

类 Unix 系统:检查与 Windows 相同的代码部分,但现在注意mlock()munlock(). 还要mlockall()随时在代码中查找,因为这会将内存全局锁定到 RAM 中。

您对这个假设是正确的:攻击者可以分析硬盘交换以查找密码。正是出于这个原因,写得体面的密码管理器确保密码始终保存在 RAM 中,并且永远不会在虚拟内存中交换。