程序如何防止数据泄露?

信息安全 密码管理 记忆 设计缺陷
2021-09-07 00:25:41

有许多提供加密和密钥管理的程序。

据我了解,当文件保存在硬盘驱动器上时,有时(通常?)内存中甚至硬盘驱动器上的其他位置都会有文件的副本。当一个人在程序中输入密码/关键短语来解锁数据库时,我猜密码将在内存中至少存在很短的一段时间。我听说过VeraCrypt 的审计,其中一个问题是memset从内存中清除敏感数据时的使用(此处为第 9 页)。

我的一般问题是:VeraCrypt1passwordkeepassGPGLastPassAES Crypt和许多其他程序如何处理这些文件的多个副本以及在内存或其他内存中有密码/密钥/数据副本的问题硬盘的地方?这些东西甚至是安全问题吗?

就像我们 VeraCrypt 一样,这是审计中出现的普遍问题吗?

(我只是出于好奇而问。)

3个回答

您在这里混合了不同的东西,即加密软件密码管理器对于这两种情况,没有办法将密钥存储在内存中,问题可以简化为一个:

  • 如果您想像在 KeePassX 中一样存储密码,您必须解锁密码数据库并保持打开状态(这样您就可以通过热键自动输入密码)。
  • 如果您加密文件,则必须输入一次主密码并保持文件打开。

在任何一种情况下,密码都会在内存中保留一段有限的时间,您需要在使用后覆盖它,以确保它不会留在那里。如果您只是重新分配内存,则不能保证永远被覆盖。

memset可以将内存块设置为您想要的任何内容,因此它可以在这里为我们提供帮助。问题:如果您使用编译器优化,编译器可能会认为 memset 无用,并删除它以提高效率。

这就是为什么例如 VeraCrypt 包含特殊功能,例如RtlSecureZeroMemory及其包装方法burn以确保内存将被重置,如下所示:

BootArgs = *bootArguments;
BootArgsValid = TRUE;
burn (bootArguments, sizeof (*bootArguments));

当然,这并不能保证 100% 的删除,因为现在您必须确保没有可能忘记调用此函数的执行路径。

在对 VeraCrypt 的最新审计中发现,有一次在可以抛出a 的代码段之后burn调用,从而导致敏感数据保留在内存中。TC_THROW_FATAL_EXCEPTION

这通常是设计安全程序的问题之一,如果你实现了防止内存泄漏的方法,你必须确保没有办法阻止它们被调用。

VeraCrypt、1password、keepass、GPG、LastPass、AES Crypt 和许多其他程序如何处理多个文件副本以及在内存或硬盘驱动器的其他位置拥有密码/密钥/数据副本的问题?

它会因产品而异。这就是为什么第三方审计很有价值的原因——验证该方法是否安全并正确实施。

这些东西甚至是安全问题吗?

是和不是。将安全问题置于上下文中通常很重要。拥有密码数据库的额外副本并不理想,因为它使信息泄露的可能性更大,但如果对文件采取适当的保护措施,并且数据库是加密的,它就不太可能被利用。

同样,如果您使用密码存储,则在内存中保存密码不是可选的。值得冒险吗?大概。

进程隔离

在内存中拥有敏感数据本身并不是一个安全问题 - 在任何“适当的”系统中,其他进程都无法访问它,并且只能以适当、安全的方式使用。

它确实意味着泄露该数据的一定风险——即在内存被释放后留下一个临时副本,然后可能分配给另一个进程;或者如果内存区域被换出到磁盘,但是可以通过相当简单的技术措施来缓解这些问题,例如在使用后和释放之前覆盖内存区域,并标记内存页面使其无法分别用于交换。在开发此类软件时,您需要确保已采取这些步骤并且敏感数据不会以这种方式“泄漏”。

除此之外,操作系统将强制执行进程隔离,以便其他进程无法访问此敏感数据(与所有其他数据一样)。您仍应采取措施尽量减少敏感数据在内存中的时间,以降低在您的软件或操作系统受到损害的情况下的风险(例如“heartbleed”openssl 漏洞),因此这是一个安全问题,但它是可以接受且安全的练习在必要时将敏感数据保存在内存中。