Linux 的 Lockdown 与休眠,再说一次
来源:codon.org.uk — 2026-10-13
📋 概述
Matthew Garrett 重写旧文,讲 Linux lockdown 与休眠的冲突以及新的解法。Lockdown 之所以必要,是因为 UEFI Secure Boot 让「限制固件往 ring 0 里塞什么」变得有意义——否则 root 可以随意加载内核模块、通过 PCI 设备 DMA 改写内核,或经 /dev/msr 改 MSR 来突破边界。但 lockdown 顺带挡住了休眠:内核把系统状态存进 swap 并改头部标记,下次启动时没有任何机制保证这份镜像由内核写出,于是有 root 权限的攻击者可以自己写一份并让内核恢复进去,而磁盘加密在这里救不了场。TPM 能加密密钥证明镜像出自本机,却分不清密钥来自内核还是用户态,作者最后落在 PCR 5 上才把这条路封住。
🔑 核心要点
- Lockdown 的意义来自 Secure Boot:如果 root 还能事后往 ring 0 里加代码,限制固件加载什么就没有意义
- 传统上 root 与 ring 0 近乎等价:可加载内核模块、可映射 PCI 设备内存做 DMA、可经 /dev/msr 改 MSR
- 休眠被 lockdown 挡住的根源:没有任何机制保证 swap 里的休眠镜像确实由内核写出
- 用 TPM 加密密钥只能证明镜像出自本机,但 root 可以做同样的事,因此区分不出内核与用户态
- PCR 23 可被重置,限制它又会妨碍真实用户,作者于是取 TPM 的一段非易失存储当额外 PCR,并用审计会话证明密钥在内核中生成
- 最终落脚在 PCR 5:它包含 UEFI ExitBootServices() 的测量结果,在调用前写入断言,用户态无法事后伪造
💡 金句
这一切相当复杂,但我想了很久,也没能想出一个更干净的方案。
👍 0
👎 0
← 返回 Lobsters 首页