是否可以在特定应用程序的生命周期结束后随机化或粉碎其内存,或者更好的是,每当它释放一些内存时?
像这样的命令行实用程序将是完美的:
shred-memory [选项] [{应用程序的参数...}]
答案1
Linux(我希望像任何现代多进程操作系统一样)确保进程在分配内存时只将页面清零。因此一个进程无法读取另一个进程以前使用的内存。
在 Linux 下,清零发生在分配页面时,而不是释放页面时。这就留下了两种读取进程以前使用的内存的方法:
- 利用内核错误
- 转储 RAM 或交换区的内容(需要 root 或物理访问权限)
有人提出了一个 Linux 内核补丁,允许在释放页面后立即将其清零(sanitize_mem
第1集,sanitize_mem
第2集),但据我所知不被接受。
在实践中,最大的攻击窗口是交换空间(它可以长时间保留数据),即使这对于攻击者来说也不是小事(他们需要窃取磁盘,并整理混乱的页面)。这也是最容易修复的:使用 加密交换空间dm-crypt
。
答案2
除了吉尔斯的回答之外:
- 您可以内存中的锁定页面防止交换(除非您知道自己在做什么 - 例如存储密码 - 这是坏主意,它可能会影响系统的性能)
- 您可以
free
使用以下方法重写函数来手动清理内存LD_LIBRARY_PRELOAD
答案3
有一些实用程序可以擦除内存,但需要在相关程序退出并释放其内存之后进行。我不知道有什么可以专门擦除特定程序分配的内存。
从“secure_delete”套件中查看“smem”(以及其他),网址为thc.org用于擦除实时系统的可用内存。