应用程序在嵌入式电池供电的 PC 上运行,某些受限公众可以访问,该 PC 将机密存储在 RAM 中。为了防止冷启动攻击和 PC 被盗以提取其秘密,它具有防回火传感器。如果检测到篡改,则应用程序存在(但在执行此操作之前不会擦除所有进程内存)。我无法改变这种行为。
Linux内核是否默认擦除释放的进程内存?有任何 Linux 发行版可以做到吗?有补丁可以做到吗?
擦除是指零填充或多次重写。
应用程序在嵌入式电池供电的 PC 上运行,某些受限公众可以访问,该 PC 将机密存储在 RAM 中。为了防止冷启动攻击和 PC 被盗以提取其秘密,它具有防回火传感器。如果检测到篡改,则应用程序存在(但在执行此操作之前不会擦除所有进程内存)。我无法改变这种行为。
Linux内核是否默认擦除释放的进程内存?有任何 Linux 发行版可以做到吗?有补丁可以做到吗?
擦除是指零填充或多次重写。
Linux 清零(即用零填充)所有内存页不是在它们被释放时而是在它们被分配给另一个进程时。因此,任何进程都不能从另一个进程中获取数据摘录。但是,这些页面将保留其旧内容,直到它们被重新使用。我不知道有任何补丁会在页面发布时进行归零(编辑:正如@user2313067 在他的回答中指出的那样,PaX补丁提供了这个选项,其代价可能是也可能不是任何给定系统的问题);一般来说,这会损害性能,因为它会用零填充缓存,驱逐更多“有用”的数据(这还不包括您的嵌入式设备可能缺少的交换空间,但大多数 Linux 系统都有交换空间) .
您可以通过简单地从另一个进程分配每个可能的页面来强制清除数据。像这样的东西:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main(void)
{
for (;;) {
void *x = malloc(2000);
if (x == NULL) {
break;
}
memset(x, 'T', 2000);
}
return 0;
}
如果你运行这个程序root
,那么它会抓取所有可用内存并填充它(为了强制实际分配),只有在没有剩余内存时才退出。根据需要运行,root
因为内核将最后几页保留给root
.
请注意,内存被填满会触发OOM 条件,此时内核会感觉允许拍摄进程以腾出一些空间。这仅在没有剩余空闲页面时才会发生,即您想要达到的状态(没有剩余空闲页面意味着所有旧页面都已重新分配,因此归零)。这对操作系统来说是一种自杀,因为 OOM 处理代码可能会杀死一些基本进程(它试图不这样做,但是嘿,这些只是启发式方法)。但是,这在您的情况下似乎是合适的:如果检测到篡改,则设备除了光荣的开膛外别无选择。
所以你只需要在一个包装器(一个简单的脚本)中启动你的关键应用程序,当关键应用程序退出时(可能是因为检测到篡改),它会启动上述程序。
Grsecurity 有 PAX_MEMORY_SANITIZE 来执行此操作。请参阅此页面上的选项。