地址空间隔离和 Linux 内核

作者:Zack Brown

来自 IBMMike Rapoport 发起了一项在 Linux 内核中实现地址空间隔离的提议。地址空间隔离源于虚拟内存的概念——系统将所有硬件设备的内存地址映射到一个干净的虚拟空间,以便它们看起来都像是一个连续的可用 RAM 范围。实现虚拟内存的系统还可以创建隔离的地址空间,这些空间仅对系统的一部分或某些进程可用。

正如 Mike 所表达的那样,这个想法是,如果怀有恶意的用户发现自己身处隔离的地址空间中,即使他们发现内核中可以被利用来获得系统控制权的漏洞,他们将获得的系统控制权也仅仅是他们有权访问的那一小块 RAM 区域。因此,他们或许能够搞砸他们自己的本地用户,但无法搞砸系统上的任何其他用户,也无法获得对根级别基础设施的访问权限。

事实上,Mike 发布了补丁来实施这个想法的一个要素,称为系统调用隔离 (SCI)。这将导致系统调用在各自隔离的地址空间中运行。因此,如果攻击者以某种方式能够修改存储在堆栈中的返回地址值,也不会有可用的位置可以返回。

他的方法相对直接。内核已经维护了一个“符号表”,其中包含所有函数的地址。Mike 的补丁将确保从堆栈中弹出的任何返回地址都与符号表中的条目相对应。并且由于“攻击都是关于跳转到 gadget 代码,而 gadget 代码实际上位于真实函数的中间,它们引发的跳转是跳转到没有外部符号的代码,因此它应该主要检测到它们何时发生。”

他承认,问题在于实现这一点会降低速度。他认为,如果不减慢内核速度,就无法执行和强制执行这些检查。出于这个原因,Mike 说,“它应该只为我们知道应该不受信任的进程或容器激活。”

对这个补丁没有太大的热情。正如 Jiri Kosina 指出的那样,Mike 的代码与其他安全项目(如 retpolines)不兼容,retpolines 试图防止某些类型的数据泄漏落入攻击者手中。

没有真正的讨论,也没有人对该补丁表示兴趣。速度下降、与现有安全项目的冲突,以及它试图防范的仅仅是假设的安全漏洞,而不是系统中实际存在的缺陷,这些因素可能共同导致这个补丁集对内核开发人员来说不太有趣。

这是内核开发不太令人愉快的一个方面。有人可能会在一个项目上投入大量时间,却无法预先知道最终可能会提出哪些反对意见。对于 Mike 和他的同事来说,速度下降是必然的这一点可能并不明显。与其他现有内核项目发生冲突的可能性总是很难预测,尤其是在只有当两个项目的成员开始公开辩论各种问题时,才能发现解决方法的情况下。

只有 Linus Torvalds 普遍不愿添加不解决现有安全漏洞的安全功能的态度是可以预测的。在这个问题上,他似乎非常一致,这让整个开源世界中注重安全的开发人员非常恼火。减小攻击面的想法对他们来说似乎是不言而喻的;而对 Linus 来说,不应该修复没有坏的东西似乎是不言而喻的,尤其是在修复会增加臃肿并增加整个项目的维护成本的情况下。我认为,即使 Jiri 和其他开发人员批准了 Mike 的补丁,Linus 也很可能在稍后反对。

注意:如果您在这篇文章中被提及并想发送回复,请将您的回复文本发送至 ljeditor@linuxjournal.com,我们将在下一期“读者来信”栏目中刊登,并在网站上作为对原始文章的补充发布。

Zack Brown 是 Linux JournalLinux Magazine 的技术记者,并且是“内核交通”周刊通讯和“学习 Plover”速记打字教程的前作者。他于 1993 年在他的 386 电脑上安装了 Slackware Linux,配备了 8MB 内存,并被开源社区彻底震撼。他是 Crumble 纯策略棋盘游戏的创造者,您可以用几块纸板自己制作。他还喜欢写小说、尝试动画、改革拉班舞谱、设计和缝制自己的衣服、学习法语以及与朋友和家人共度时光。

加载 Disqus 评论