主要观点:使用 TPM2 和systemd-cryptenroll
或clevis
设置自动磁盘解锁,存在攻击者可通过短暂物理访问机器解密磁盘的风险,多数 TPM2 解锁设置未验证解密分区的 LUKS 身份,导致易受文件系统混淆攻击。
关键信息:
- TPM2 基于磁盘解密的原理是通过 PCRs 记录状态,只有 TPM 处于预定好的状态才能获取存储的 LUKS 密钥,多个 PCR 有特定用途,如 0 记录核心系统固件代码,2 记录扩展或可插拔代码等。
- 常见的设置是使用
systemd-cryptenroll
或clevis
将新生成的密钥添加到 LUKS 分区并密封在 TPM 中,但 initrd 执行系统init
二进制文件前不会进行签名检查,这给攻击者可乘之机。 - 攻击过程是替换加密分区为新的 LUKS 分区,让 TPM 解密失败后输入控制的密码,使 initrd 认为已正确解密并执行恶意
init
二进制文件,从而获取解密密钥。 - 要解决此问题,需在访问加密卷之前对其进行身份验证,
systemd-cryptsetup
可通过添加tpm2-measure-pcr=yes
到 crypttab 文件来实现,确保磁盘解密顺序确定性并比较 PCR15 的值。 - 很多关于 TPM2 磁盘解锁的指南未提及此问题,大多数用户设置可能受影响,ArchWiki 中
systemd-cryptenroll
的条目也有相关警告。 - 对 Fedora 和 NixOS 系统进行了概念验证攻击,展示了攻击的具体步骤和过程,包括获取系统信息、创建假分区、提取密钥等。
重要细节: - Fedora 系统中,因使用预签名图像,引导加载程序和 shim 计算内核和 initrd 的哈希并将其扩展到 PCR9,所以设置 TPM2 解锁时需包含 PCR9。
- NixOS 系统中,通过 lanzaboote 项目实现安全启动,内核和 initrd 都签名为 UKI 图像,使用
systemd-cryptenroll
创建令牌在 LUKS 头中,通过 gdb 调试可获取解密密钥。 - 目前没有简单的解决方案,建议添加 TPM PIN 来保护数据,设置 TPM2 自动解锁时需考虑多个方面,如签名验证、PCR 选择、解密顺序等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。