Garrett 提出用 TPM 密钥为 Linux 休眠数据签名
来源标题:Locking down hibernation in Linux
Garrett 提交补丁集,计划用仅内核可访问的加密密钥为休眠数据签名,以防范降级攻击。静态密钥可被伪造,因此方案选择将密钥存入 TPM,由内核阻止用户空间读取。TPM 还可配置为在不同内核启动时拒绝提供该密钥,但旧内核仍持有有效的安全启动签名,使这一限制并不简单。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
Garrett 的补丁集基本思路并不复杂:用只有内核才能访问的加密密钥对保存的休眠数据进行签名。问题在于如何获得这样一个密钥。一个静态的、已知的密钥对此毫无用处,因为它可以被用来伪造签名。存储在计算机可信平台模块(TPM)中的密钥是更好的选择。内核位于 TPM 和用户空间之间,因此它可以禁止用户空间读取所选密钥,从而保证其安全。此外,TPM 可以配置为在从不同内核启动时拒绝提供该密钥,尽管这并不像看起来那么简单,因为旧内核仍然会拥有正确的安全启动签名等。
引入 TPM 的主要动机是防止降级攻击。鉴于旧内核不会知道要禁止 TPM 访问,攻击者理论上可以:TPM 的核心功能之一是能够锁定机密,使其只能在硬件处于已知状态时被读取。TPM 依靠平台配置寄存器(PCR)来跟踪硬件状态。这些寄存器不能被直接写入。相反,TPM 在系统启动时将它们重置为零,然后系统上运行的软件可以提供值,这些值与 PCR 的当前状态一起进行哈希运算,产生新值。
因此,例如,当计算机固件开始执行时,它可以检查引导加载程序上的签名,并向特定 PCR 添加一个标记,以表明它已根据特定的安全启动密钥验证了该签名。然后引导加载程序可以对操作系统和附加硬件的状态做同样的事情,以此类推。理论上,这确保 PCR 只有在操作系统和硬件未被篡改时才能达到特定状态。
在实践中,实现更为复杂。有多个 PCR 用于不同目的。例如,systemd 使用 PCR 11 来指示系统处于哪个启动阶段。这可以用来确保存储在 TPM 中的密钥(例如磁盘加密密钥)仅在初始内存盘(initrd)运行时可访问。当系统即将过渡到正常的根文件系统时,systemd 向 PCR 写入“leave-initrd”,以一种在系统重启之前无法撤销的方式改变其哈希值。向 PCR 写入附加信息以使与其关联的密钥失效的过程称为“封顶”该 PCR。
如果内核有一个在启动用户空间之前封顶的 PCR,它可以用新值扩展该 PCR,将密钥绑定到所得的 PCR 状态,从而确保该密钥只能被新版本的内核读取,而不能被旧版本读取。然而,内核目前不封顶任何 PCR,将其留给用户空间。因此,在旧内核上运行的恶意用户空间应用程序仍然可以用新内核期望的值扩展 PCR,从而即使在旧内核上也将 TPM 置于“新内核”状态。
解决方案是 Garrett 想出的“某种可怕的东西”。PCR 5 被 UEFI 固件用于执行硬件测量,并在调用 ExitBootServices() 时被封顶,以防止后续组件伪造硬件信息。内核在 UEFI 退出之前开始执行其引导存根,因为它可能需要与固件通信以启动系统。因此,Garrett 在引导存根中添加了代码,在固件封顶 PCR 5 之前向其中插入一个标记,表明内核支持阻止用户空间访问 TPM 密钥。由于用户空间在此之后才启动,它无法伪造该标记,即使在旧内核上也是如此。
然而,仅凭这一点还不够。PCR 5 的状态只能证明计算机使用足够新的内核启动;它并不能阻止用户空间创建自己的密钥并将其绑定到 PCR 5 的该状态,然后用该密钥对休眠数据进行签名。休眠后新内核启动时,它会看到由绑定到 PCR 5 的密钥生成的签名,但仍然无法证明该密钥是在内核内部创建的(因此对用户空间隐藏)。
因此,Garrett 的补丁集更进一步。与 TPM 的交互可以分为单独的会话。他的代码允许对这些会话进行审计,生成签名的摘要。这些摘要由 TPM 本身签名,这意味着拥有签名摘要可以证明,在某个时刻,这些命令确实被发送到了那个特定的 TPM,并产生了那些特定的结果。
结合 PCR 5 的使用,生成签名休眠映像的整个过程变为:然后,在重启时,内核在加载休眠映像之前会经过一系列验证步骤:所有这些工作的最终结果是,运行锁定内核的用户应该能够启用休眠,并相信在计算机关闭和从休眠恢复之间内核不会被篡改。攻击者无法直接更改数据,因为数据已签名;无法访问用于签名的密钥,因为内核阻止了它;无法用旧内核绕过该限制,因为 TPM 将密钥绑定到只有新内核才能产生的状态;也无法创建自己的会被接受的密钥,因为他们无法伪造密钥创建记录。
Garrett 的补丁集收到了一些评论。James Bottomley 询问是否可以使用一种称为“局部性”的硬件功能(一种将操作限制在特定 CPU 特权级别的访问控制机制)来更简单地实现类似功能。Garrett 同意局部性“显然是处理此问题的正确方法”,但不认为内核可以利用它们,因为硬件支持通常仅限于专用设备。大多数消费设备具有
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。