为什么访问内核内存存在安全风险?

信息安全 操作系统 记忆 核心 崩溃
2021-08-17 21:56:34

很多关于 Meltdown 漏洞的新闻都在强调它允许程序读取应该禁止用户访问的内存。虽然我知道这不应该发生,但很少有消息来源准确解释访问内核​​内存是多么危险。

内核内存中存储了哪些信息?能够访问但不能修改内核内存允许攻击者做什么?

3个回答

为了了解 Meltdown 带来的威胁,您需要了解现代计算机中内存的组织方式。

对内存的幼稚看法是,每个内存地址对应于 RAM 中的一组特定单元。这被称为“物理寻址”,直到大约 1990 年代初,这一直是计算机中处理内存的最常见方式。在物理寻址下,如果您的程序从地址 17 读取一个字节,那么它每次都从同一组八个存储单元中读取。事实证明,寻址内存的“仅物理”方式会限制您可以做的事情,特别是在一次运行多个程序方面。

输入“虚拟寻址”。现在,您的程序的“内存地址 17”不再对应于物理内存的特定部分。相反,当 CPU 想要来自该地址的数据时,它会询问一个称为“内存管理单元”(MMU) 的组件,该组件与操作系统合作,找出如何满足该请求。

这允许许多效率和能力增益。最广为人知的可能是“swap”,俗称“虚拟内存”:17号地址可能会暂时存储在磁盘上,你的程序请求被搁置,而操作系统将部分物理内存的内容存储到磁盘,然后加载您的程序认为是“地址 17”的部分。由于可用虚拟地址的范围通常比物理内存的数量大得多,这让操作系统看起来像是一台具有比实际内存多得多的 RAM 的计算机。

然而,虚拟寻址的最大好处也完全对普通用户隐藏:它让操作系统给每个程序一个错觉,以为它是计算机上唯一运行的程序。您的程序的“地址 17”与其他程序的“地址 17”不同。这意味着程序无需担心相互隐藏秘密:例如,在您的网络浏览器中运行的 Javascript 无法读取密码管理器内存中的内容。

出于效率原因,Linux 内核在每个程序的内存视图中为自己分配一半的可用虚拟地址,并将所有物理内存分配为该地址范围的一部分(Windows 内核做类似的事情,尽管细节有所不同)。这让内核可以访问它需要的任何东西,而无需调整 MMU。然后内核保护它的地址空间,这样一个普通的程序试图读取内存就会崩溃。

进入 Meltdown:它允许程序间接读取内核内存而不会崩溃。它比直接读取慢得多(通常大约每秒 150 KB,其中直接读取以千兆字节每秒为单位),但它绕过了保护。因为所有物理内存都映射到内核的地址空间,所以使用 Meltdown 的攻击者可以打破“我是唯一的程序”的错觉。

一个普通的桌面用户没有很多程序需要相互保密,也不会运行太多不受信任的代码——Meltdown 的唯一主要威胁是恶意 Javascript 读取他们的密码管理器的内容,以及Meltdown 的工作原理使其难以从 Javascript 中使用。

来自 Meltdown 的最大威胁是云和共享托管服务提供商。这些计算机通常从不受​​信任的用户那里运行程序,并依靠“我是唯一的用户”的错觉来保证事情的安全。Meltdown 让拥有帐户的攻击者打破这种错觉,并执行诸如窃取其他用户的 SSL 私钥、用户名和密码、支付处理凭据和其他敏感信息之类的事情。

例如,您可以读取系统的 ssh 私钥,或任何数量的其他受保护资源。

这完全取决于我们在谈论什么样的系统。

如果您的计算机上没有恶意软件,什么都不会发生。如果您将台式机或笔记本电脑用作单个用户,并且您有恶意软件,那么您就输了。无需访问内核内存。因为该恶意软件可以读取您硬盘上的文件,所以它可以找出有关单个用户的所有信息。

但是在服务器上,如果“计算机上”有恶意软件,它实际上只为一个用户安装。那个用户输了。但是同一台服务器上的 100 个其他用户应该是安全的。现在,如果您可以访问内核内存,那么您就可以想办法攻击服务器上的其他 100 个用户。