4. 度量代理漏洞:代理提权攻击、度量结果篡改、代理通信劫持
度量代理,说白了就是固件里那个负责收集、打包、上报度量数据的中间人。它夹在TPM/硬件安全模块和上层管理软件之间,位置很关键。我见过不少团队把精力全花在度量算法上,却忽略了代理本身的安全——结果代理一倒,整个信任链就崩了。
这一章我们重点聊三个方向:代理提权攻击、度量结果篡改、代理通信劫持。这三个问题我都在实际项目中撞见过,有的甚至是在客户现场才暴露出来的。
4.1 代理提权攻击
代理提权,说白了就是攻击者让度量代理以更高的权限运行,然后干它不该干的事。为什么会这样?因为很多固件在设计时,代理的权限边界画得不够清楚。
核心问题:度量代理通常运行在SMM(系统管理模式)或TEE(可信执行环境)中。如果代理的入口点没有严格校验调用者的身份,攻击者就能通过合法接口触发代理执行恶意操作。
我遇到过这样一个案例:某款服务器的度量代理暴露了一个调试接口,用于在开发阶段手动触发度量。结果这个接口在产品固件里没关掉,攻击者通过ACPI表注入一个调用,直接让代理以SMM权限执行了任意代码。嗯,这就是典型的提权路径。
常见提权路径
- 接口滥用:代理暴露的SMI(系统管理中断)处理函数没有做调用者校验,攻击者通过操作系统触发SMI,让代理执行提权操作。
- 缓冲区溢出:代理的输入参数没有做长度检查,攻击者构造超长输入覆盖返回地址,劫持控制流。
- 竞争条件:代理在初始化阶段和正常运行时存在时间窗口,攻击者利用这个窗口篡改代理的权限令牌。
我的习惯:在设计代理时,我会强制要求每个入口函数都做调用者身份校验。哪怕是在SMM里,也要检查调用来源的CPUID或段寄存器值。别嫌麻烦,这能挡住大部分提权攻击。
4.2 度量结果篡改
度量结果篡改,是代理最直接的攻击目标。攻击者不想让你知道固件已经被改了,那就干脆把度量报告改掉。你想想看,如果度量结果不可信,那整个远程证明体系就形同虚设。
我曾经在排查一个固件漏洞时发现,代理把度量结果写到了一个全局变量里,然后另一个组件通过共享内存读取这个变量。问题是——这个全局变量没有任何写保护。攻击者只需要找到这个变量的地址,就能随意修改度量值。
篡改手法分类
| 手法 | 原理 | 典型场景 |
|---|---|---|
| 内存篡改 | 度量结果存储在可写内存区域,攻击者直接修改 | 全局变量、共享缓冲区未加锁 |
| 寄存器劫持 | 代理依赖的硬件寄存器被攻击者重写 | MSR寄存器、MMIO区域未保护 |
| 时间戳伪造 | 攻击者篡改度量时间戳,让旧度量结果看起来是新的 | 日志回放攻击、重放攻击 |
| 签名绕过 | 代理的签名密钥被提取,攻击者伪造合法签名 | 密钥存储在固件镜像中未加密 |
避坑指南:我曾经在一个项目里发现,度量代理把签名密钥硬编码在固件二进制里,而且没有做任何混淆。攻击者用简单的binwalk工具就提取出来了。记住:密钥永远不要放在固件镜像里,要用硬件安全模块(如TPM或HSM)来管理。
4.3 代理通信劫持
代理通信劫持,发生在代理与外部实体(如管理平台、远程证明服务器)交换数据的过程中。攻击者可以拦截、修改、重放这些通信内容,让远程证明系统收到虚假的度量报告。
我记得有一次做渗透测试,发现代理和远程服务器之间用的是明文HTTP通信。度量结果在网络上裸奔,任何人都能抓包看到。更离谱的是,攻击者还能中间人攻击,把度量值改成自己想要的数字。嗯,这种问题在老旧固件里特别常见。
劫持攻击类型
- 中间人攻击:攻击者拦截代理与服务器之间的TLS握手,降级到弱加密套件或伪造证书。
- 重放攻击:攻击者记录一次合法的度量会话,然后在后续的认证过程中重复发送这个会话数据。
- 会话劫持:攻击者窃取代理的会话令牌或Cookie,冒充代理与服务器通信。
- 协议降级:攻击者强制代理使用不安全的通信协议(如从TLS 1.3降级到TLS 1.0)。
我的建议:代理通信必须使用双向TLS认证。服务器要验证代理的身份,代理也要验证服务器的身份。别只做单向认证,那等于没锁门。另外,一定要固定TLS版本和加密套件,别让攻击者有降级的机会。
4.4 攻击面全景图
下面这张图把度量代理的三个攻击面串起来了。你可以看到,攻击者可以从提权、篡改、劫持三个方向切入,最终目标都是破坏度量结果的完整性。
4.5 排查与加固清单
排查度量代理漏洞,我一般按这个顺序来。你可以在自己的项目里照着做一遍,大概率能发现几个隐藏问题。
- 审计代理入口点:列出所有SMI、SCI、ACPI方法等入口,检查是否有未授权的调用路径。
- 检查内存保护:度量结果存储区域是否设置了只读属性?是否使用了MPU或SMM保护机制?
- 验证通信加密:代理与远程服务器之间是否使用双向TLS?证书链是否完整?
- 测试抗重放能力:抓取一次度量会话,尝试重放给服务器,看是否被拒绝。
- 检查密钥管理:签名密钥是否存储在硬件安全模块中?固件镜像里有没有硬编码密钥?
- 模糊测试:对代理的输入接口做模糊测试,看是否存在缓冲区溢出或格式化字符串漏洞。
最后说一句:度量代理是固件安全链条上的薄弱环节,因为它既要和硬件打交道,又要和网络通信。我见过太多团队把代理当成一个简单的搬运工,结果被攻击者从三个方向同时突破。记住:代理的每一个接口、每一段通信、每一块内存,都可能是攻击者的突破口。