【问题标题】:Does Windows clear memory pages?Windows 是否清除内存页?
【发布时间】:2013-08-25 11:39:03
【问题描述】:

我知道 Windows 有一个选项可以在关闭时清除 页面文件

当实际物理/虚拟内存进入或超出范围时,Windows 是否会对它进行任何特殊处理?

例如,假设我运行应用程序 A,它将可识别的字符串写入内存中的变量,然后我关闭应用程序。然后我运行应用程序 B。它分配一大块内存,不初始化内容,然后搜索应用程序 A 写入的已知字符串。

应用程序 B 是否有可能获取应用程序 A 写入的字符串?还是 Windows 会在内存可用之前对其进行清理?

【问题讨论】:

  • 不,这是不可能的。内核使用零页线程来清理已释放的 RAM 页面,并将它们添加回准备再次重用的页面缓存。使用像 superuser.com 这样的网站来询问更多关于它的问题。
  • 在任何操作系统中,获取存储的两种方法是分页或请求归零页面是相当标准的。如果 Windows 有任何不同,我会感到非常惊讶。
  • 标题讲的是分页,但问题是关于释放和分配。请修正标题以匹配问题或问题以匹配标题。

标签: windows memory


【解决方案1】:

Windows “清理”进程返回的释放内存,然后再将其分配给其他进程。有一个内核线程专门用于这个任务。

零页线程以最低优先级运行,负责在将空闲页移动到零页列表之前将它们清零[1]


与其担心在页面文件中保留敏感数据,您应该首先担心继续将其保留在内存中(使用后)。关闭时清除页面文件不是默认行为。此外,系统故障转储将包含您在 RAM 中的“纯文本”中可能拥有的任何敏感信息。

Windows 确实“清理”内存,只要它被分配给一个进程(显然)。相反,它留给程序(mer)这样做。为此,可以使用SecureZeroMemory() 函数。

这个函数被定义为 RtlSecureZeroMemory() 函数(见WinBase.h)。 RtlSecureZeroMemory() 的实现是内联提供的,可以在任何版本的 Windows 上使用(请参阅WinNT.h

当您想确保您的数据将被及时覆盖时,请使用此函数而不是 ZeroMemory(),因为某些 C++ 编译器可以优化对 ZeroMemory() 的调用完全删除它。

WCHAR szPassword[MAX_PATH];

/* Obtain the password */
if (GetPasswordFromUser(szPassword, MAX_PATH))
{    
    UsePassword(szPassword);
}

/* Before continuing, clear the password from memory */
SecureZeroMemory(szPassword, sizeof(szPassword));

别忘了阅读 Raymond Chen 的这篇有趣的 article

【讨论】:

  • 您正在讨论的案例与 OP 提出的案例不同。 OP 关注跨进程免费/分配。您说的是单个应用程序重用自己的内存而不将其释放给操作系统。
  • @RaymondChen 我同意这个问题清楚地询问了跨进程免费/分配。但是,我想强调 OP,这是他最不担心的事情,并且存在其他更微妙的攻击向量。更新了答案以进一步澄清这一点。您的article on the topic 似乎完美地说明了我试图提出的观点,因此我与它联系起来。我希望你不要介意。 :-)
  • 我对“从磁盘或内核分配中读取的页面”这一行感到困惑,该行将空闲页面列表传输到进程工作集中。不是应该先被零页线程清零才能使用吗?
  • @caramel1995 The free page list can be used(即重用页面而不先将它们归零)如果内存要用于映射文件,因为数据将在进程看到之前被覆盖。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
相关资源
最近更新 更多