问题很简单,但我找不到答案。
如果内存中有一个页面已被内核换出到磁盘,然后它的所有者进程在内存中的该页面上调用 mlock(2) 或 VirtualLock,会发生什么?
它会立即交换回物理内存吗?它会从磁盘上擦除吗?如果将敏感信息写入页面的时间延迟到调用 mlock(2) 之后,是否可以保证它不会被写入磁盘?
作为一个次要的后续问题,您将采取什么措施来减轻这种可能性?
答案1
在 Linux 内核的当前上游版本中,它将强制将发生故障的页面重新放入,但似乎会在交换区中留下副本。
我相信大多数 BSD 系统和其他 UNIX 系统的行为类似,但不确定 Windows 是否如此。
延迟写入任何内容直到调用 mlock() 之后将阻止数据被换出,但不能保证数据不会被写入磁盘,除非无法实现 ACPI S4 和 OS 介导的休眠并且您不在 VM 中(如果您在 VM 中,您可能处于 1 型虚拟机管理程序下,因此受到主机系统的虚拟内存限制,这是您无法控制的)。
因此,适当的缓解措施包括:
- 在应用程序级别进行处理,以防止敏感数据在 RAM 中驻留的时间超过其需要的时间,即使该区域被锁定。
- 在系统级别处理以禁用 ACPI S4(通常仅在 OEM 系统上需要)、防止操作系统介导的休眠,并确保在 VM 中运行时对主机系统的信任。