我只是想知道是否有可能告诉 Linux/Ubuntu 在让下一个应用程序分配之前用零覆盖释放的内存?
如果没有,为什么这不可能?我知道安全关键程序会(可能)在释放内存之前自行覆盖内存,但我的猜测是,如果您有足够的可用 RAM,它甚至不会减慢系统速度。至少只要 free() 调用不被阻塞。
有什么想法吗?
当进程调用 free() 时,它不会立即将内存返回给系统,而是将其返回给该进程拥有的堆。堆要么对大块使用匿名内存映射,要么使用 sbrk() 来缩小或增加堆。当堆中的内存被取消映射或堆用 sbrk() 收缩时,它会返回给系统。此时页面可以被其他进程重用,当它们被重用时,在进程可以访问它之前,它们总是为零。[1]
由于性能问题,内存分配(例如 malloc)不会在将内存释放回堆时将内存归零。通常,敏感数据的最佳做法是在释放之前将其归零。但是,我猜您想对进程生命周期内释放的所有内存强制执行此策略。glibc 2.4 及更高版本有一个 MALLOC_PERTURB_ 环境选项,当设置为非零值时,将在分配内存和使用 free() 释放内存时将内存初始化为该值的补码。这样做的缺点是它可能会触发代码中的错误,这些错误错误地依赖于内存在分配时通常被初始化为零。
要使用 MALLOC_PERTURB_,例如将其设置为随机值..
export MALLOC_PERTURB_=$(($RANDOM % 255 + 1))
Run Code Online (Sandbox Code Playgroud)
并运行您的代码。
[1] 差不多。mmap() 使用 MAP_UNINITIALIZED 和配置了 CONFIG_MMAP_ALLOW_UNINITIALIZED 的内核允许非零内存,但这在 Ubuntu 上是不允许的。