在具有自动 TPM2 解锁功能的系统上绕过磁盘加密

主要观点:使用 TPM2 和systemd-cryptenrollclevis设置自动磁盘解锁,存在攻击者可通过短暂物理访问机器解密磁盘的风险,多数 TPM2 解锁设置未验证解密分区的 LUKS 身份,导致易受文件系统混淆攻击。
关键信息

  • TPM2 基于磁盘解密的原理是通过 PCRs 记录状态,只有 TPM 处于预定好的状态才能获取存储的 LUKS 密钥,多个 PCR 有特定用途,如 0 记录核心系统固件代码,2 记录扩展或可插拔代码等。
  • 常见的设置是使用systemd-cryptenrollclevis将新生成的密钥添加到 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 选择、解密顺序等。
阅读 7
0 条评论