缩小 Linux 攻击面
通常,内核开发者会尝试缩小针对 Linux 的攻击面,即使无法完全关闭它。这种补丁是否能进入内核通常是不确定的。Linus Torvalds 总是更喜欢真正能堵住漏洞的安全补丁,而不是仅仅让攻击者稍微难以得手的补丁。
Matthew Garrett 意识到用户空间应用程序可能在任何给定时间将秘密数据存储在 RAM 中,并且这些应用程序可能希望清除这些数据,以便无人可以查看它。
正如 Matthew 指出的那样,内核中已经有多种方法可以做到这一点。应用程序可以使用 mlock()
来防止其内存内容被推送到交换空间,在那里攻击者可能更容易读取它。应用程序还可以使用 atexit()
使其内存在应用程序退出时被彻底覆盖,从而在可用 RAM 的通用池中不留下任何秘密数据。
Matthew 指出,问题在于,如果攻击者能够在关键时刻(例如,在用户数据可以安全覆盖之前)重启系统。如果攻击者随后启动到另一个操作系统,他们可能能够检查仍然存储在 RAM 中的数据,这些数据是从先前运行的 Linux 系统遗留下来的。
正如 Matthew 也指出的,防止这种情况的现有方法是告诉 UEFI 固件在启动到另一个操作系统之前擦除系统内存,但这将大大增加重启所需的时间。如果好人战胜了攻击者,迫使他们等待很长时间才能重启可能会被认为是拒绝服务攻击——或者至少非常令人恼火。
Matthew 说,理想情况下,如果攻击者只能诱导干净的关机——而不是简单的冷启动——那么就需要有一种方法告诉 Linux 清除 RAM 中的所有数据,这样就不再需要 UEFI 来处理它,因此也就不需要在重启期间进行非常长的延迟。
Matthew 解释了他的补丁背后的理由。他说:
不幸的是,如果应用程序不干净地退出,其秘密可能仍然存在于 RAM 中。这在用户层中不容易修复(例如,如果 OOM killer 决定杀死持有秘密的进程,我们将无法避免这种情况),因此这个补丁向 madvise() 添加了一个新标志,允许用户层请求内核在页面引用计数达到零时清除覆盖的页面。由于 32 位系统上的 vm_flags 已经满了,因此它只能在 64 位系统上工作。
Matthew Wilcox 喜欢这个计划,并为 Matthew G 的补丁提供了一些技术建议,Matthew G 发布了更新版本作为回应。
Michal Hocko 也提出了一些技术建议,包括该补丁不仅应擦除 RAM,还应擦除任何交换空间,以增加保护。
但是,Christopher Lameter 回复 Matthew G 的补丁时说,即使它使攻击更难进行,但实际上并没有解决问题。正如他所说:
当页面重新分配给另一个进程时,页面无论如何都会被清除。这只是在重用之前更快地清除它。因此,如果程序中止并且无法运行其退出处理程序,它将减少页面包含秘密信息的时间。
这真的值得扩展系统调用并为此添加内核处理吗?考虑到我们目前对任何与“安全”相关的事情的关注,也许答案是肯定的。
Matthew G 指出,如果系统大部分时间处于空闲状态,则没有其他进程可能会声明仍然持有秘密数据的 RAM。在这种情况下,这些秘密将无人看管地存在。如果有人在那时重启系统,秘密数据将被暴露。
很多人贡献了技术建议,Matthew G 提交了几个新版本的补丁,然后讨论结束了。
显然有人对这个补丁感兴趣,但没有人为此欢呼雀跃。它显然代表了安全性的改进,因为它使攻击者利用暴露数据的时间窗口变得更短,但与此同时,该窗口仍然开放一段时间。即使使用 Matthew G 的补丁,怀有恶意的攻击者也可能利用这一点来获取特权数据。我不清楚这个补丁是否会进入内核。
注意:如果您在上面被提及并想在评论区上方发布回复,请将您的回复文本发送至 ljeditor@linuxjournal.com。