文章总结: 该文档揭示了通过滥用PCIe高级错误报告(AER)和端到端CRC(ECRC)校验机制实现DMA重定向的攻击方法。攻击者利用ECRC错误触发事务层数据包(TLP)重传机制,在重放过程中替换物理地址字段,绕过IOMMU权限检查非法写入受保护内存区域。文档详细分析了TLP结构、AER/ECRC工作机制、攻击流程及QEMU仿真验证,并提出了IOMMU强制重映射等防御策略。 综合评分: 78 文章分类: 漏洞分析,红队,内网渗透,安全工具,解决方案
通过 AER 滥用和 ECRC 劫持实现 DMA 重定向
原创
Snow狼 Snow狼
Ghost Wolf Lab
2026年6月24日 00:00 北京
在小说阅读器读本章
去阅读
摘要
PCI Express 链路上传输的每一条 DMA 读写请求都被封装为 TLP(事务层数据包),携带设备标识符和目标物理地址。IOMMU 通过 BDF 编号和地址转换表对这些请求进行合法性检查,阻止未经授权的内存访问。然而,TLP 层存在一个容易被忽视的攻击面:高级错误报告(AER)允许设备向根复合体报告各类错误,而端到端 CRC(ECRC)本用于检测传输过程中的比特翻转,却可能被恶意设备主动操纵,迫使接收端进入错误恢复流程。在错误恢复的重传机制中,如果攻击者能够制造 TLP 的“合法重放”,并将其中的物理地址字段替换为攻击目标,便能在 IOMMU 检查之前完成 DMA 重定向。
PCIe TLP 与 DMA 的权限模型
TLP 的结构与路由
PCIe 采用分层协议,事务层负责在设备与主机之间传输数据。
每个 TLP 包含:
- TLP 前缀(可选):用于扩展头信息。
- TLP 头:包含格式(Fmt)和类型(Type)字段,决定 TLP 是存储器读写、配置读写、消息还是完成包。对于存储器写 TLP,头中还有地址字段(32 位或 64 位物理地址)。
- 数据载荷:实际传输的有效数据。
- TLP 摘要:可选字段,包含 32 位的 ECRC,用于检测端到端的比特错误。
在 DMA 操作中,设备主动向主机内存发起读写请求。主机芯片组中的根复合体(Root Complex)根据 TLP 头中的 Requester ID(Bus/Device/Function,BDF)和地址进行路由,并由 IOMMU 根据设备所属的源标识执行地址转换和权限校验。
IOMMU 的保护与盲区
IOMMU 使用设备专属的 DMA 重映射表,将设备看到的“客户物理地址”转换为主机物理地址,同时检查访问权限。其检查依据是 TLP 头中的 BDF 号和客户地址。如果 BDF 与 TLP 的内容不一致(例如地址字段被篡改),只要转换结果对应的主机物理地址对该设备是允许的,则写入操作成功——这正是 DMA 攻击的传统模型。
然而,IOMMU 的检查发生在根复合体内部,位于数据链路层的处理之后。如果攻击者能够在数据链路层或物理层介入,在 IOMMU 看到 TLP 之前修改其地址字段,则可以实现对受保护内存区域的非法写入。本文讨论的 AER/ECRC 劫持正是此类攻击的一种具体实现方式。
AER与 ECRC 机制
AER 结构
AER 是 PCIe 的一项可选扩展,允许设备向根复合体报告可纠正和不可纠正错误。
其配置空间包含:
- AER Capability Header:表明该设备支持 AER。
- Uncorrectable Error Status Register:记录不可纠正错误(如 ECRC 错误、数据链路协议错误)。
- Uncorrectable Error Mask Register:屏蔽特定错误报告。
- Uncorrectable Error Severity Register:设置错误的严重程度,决定是否触发 NMI 或系统中断。
- Correctable Error Status Register:记录可纠正错误(如重放计时器超时)。
当 PCIe 设备检测到内部错误或接收到带有 ECRC 错误的 TLP 时,会更新相应状态寄存器,并可选择向主机发送错误消息(ERR_COR、ERR_NONFATAL、ERR_FATAL 等)。主机随后进入错误处理流程,通常会触发 AER 驱动程序介入。
ECRC 的生成与校验
ECRC 是 TLP 摘要字段中的 32 位循环冗余校验码,覆盖 TLP 的所有头和数据载荷(但不包含前缀)。它由发送端计算并附加,接收端(通常是根复合体或设备)可选择是否校验。如果接收端启用了 ECRC 校验,且发现 ECRC 不匹配,则视为不可纠正错误(ECRC Error),并更新 AER 相关寄存器。
攻击者可以利用 ECRC 校验的这一机制,故意发送一个带有错误 ECRC 的有效 TLP。接收端检测到 ECRC 错误后,将丢弃该 TLP 并向发送端报告错误。根据 PCIe 规范,在某些情况下(例如 Completion Timeout 或 ECRC 错误),发送端可以选择重放该 TLP。如果攻击者能够控制重放时的 TLP 内容,将原始的合法地址替换为恶意地址,便可完成 DMA 重定向,而这一切在 IOMMU 看来都是“合法重放”。
TLP 中间人攻击模型
攻击者定位
在本攻击模型中,攻击者已控制一个恶意的 PCIe FPGA 设备(如基于 Xilinx 或 Intel FPGA 的开发板)插入目标主机的 PCIe 插槽,或者利用已遭入侵的现有设备(如智能网卡)进行固件级注入。该设备具有正常的事务层和物理层能力,能够主动生成和发送任意 TLP。
攻击流程
- 初始化:恶意设备向根复合体注册 DMA 地址空间,并获取对应的 IOMMU 映射。此时设备被允许访问某块合法的内存区域(例如 0x10000000-0x10010000)。
- 构造合法 TLP:设备生成一个标准的存储器写 TLP,目标物理地址为合法区域内的某个地址(0x10000000),并附带正确的 ECRC。该 TLP 会被 IOMMU 正常通过。
- 注入 ECRC 错误:设备在物理层输出此 TLP 时,故意修改 ECRC 字段,使其错误。同时保留原始 TLP 的其余部分不变。
- 触发错误恢复:根复合体接收 TLP,检测到 ECRC 错误,丢弃该 TLP。同时根复合体向设备发送错误消息(Error Message),告知发生 ECRC 错误。设备收到后,根据 PCIe 协议,标记该事务为“待重试”。
- 重放恶意 TLP:设备在重试队列中,将原 TLP 的地址字段替换为攻击目标地址(例如 0x20000000,属于内核或其他敏感区域)。然后重新计算正确的 ECRC,并将此恶意 TLP 发送出去。由于根复合体将此视为之前失败事务的重试,可能不会再次进行 IOMMU 严格的重映射(或者在某些实现中,重试沿用原 TLP 的事务 ID 和权限上下文),从而导致该恶意 TLP 被接受并写入非法区域。
- DMA 重定向成功:攻击者的恶意设备成功写入受保护的内存,达成权限提升或数据篡改。
攻击的可行性条件
- PCIe 设备支持 AER 和 ECRC 校验(根复合体侧需开启 ECRC 检查,通常在现代系统 BIOS 中默认启用)。
- 硬件平台允许 Error Severity 被配置为非致命的,从而系统不会直接崩溃,而是交由 AER 驱动处理。
- 攻击者能在错误恢复的重试间隙中修改 TLP 内容,这通常要求设备有足够的硬件灵活性(FPGA)来实现 TLP 缓冲和动态修改。
QEMU 环境下的 AER 注入与 TLP 重放模拟
由于真实硬件的 PCIe 攻击需要专用 FPGA 设备,本文以 QEMU 虚拟机下的 PCIe 仿真为基础,使用 Python 脚本与 QEMU 的 QMP 接口交互,模拟向虚拟 PCIe 设备注入 AER 错误并观察 DMA 行为。
QEMU 虚拟机 PCIe 拓扑如下,可以看到 AER 注入点:
以下代码片段展示如何通过 QEMU 的 AER 注入功能触发错误,并结合虚拟 IOMMU 观察地址转换。
#!/usr/bin/env python3
"""
aer_inject_sim.py — QEMU AER 错误注入与 DMA 重定向模拟
依赖: QEMU >= 6.0 (支持 AER), py-qmp
启动 QEMU 示例命令:
qemu-system-x86_64 -M q35 -enable-kvm -m 4G \
-device pcie-root-port,port=0,chassis=1,id=pcie.1 \
-device virtio-net-pci,bus=pcie.1,id=net0 \
-qmp unix:/tmp/qmp.sock,server,nowait
"""
import json
from qmp import QEMUMonitorProtocol
definject_aer_error(qemu_socket, device_id, error_type="ecrc"):
"""通过 QMP 向指定 PCIe 设备注入 AER 错误"""
qemu = QEMUMonitorProtocol(qemu_socket)
qemu.connect()
# 获取设备的 PCIe 地址
result = qemu.cmd("query-pci", {})
device_bus = None
for dev in result['return']:
if device_id in dev['qdev_id']:
device_bus = dev['bus']
break
ifnot device_bus:
print("Device not found")
return
# 注入 AER 错误 (需要 QEMU 支持 aer-inject 命令)
cmd_args = {
"advisory-non-fatal": True,
"ecrc-error": Trueif error_type == "ecrc"elseFalse
}
# QEMU 的 aer-inject 命令需要设备的 PCI 地址,格式如 "0000:00:01.0"
pci_addr = f"0000:{device_bus:02x}:00.0"
inject_cmd = {
"execute": "aer-inject",
"arguments": {
"device": pci_addr,
"errors": [
{
"type": "uncorrectable",
"ecrc": True
}
]
}
}
ret = qemu.cmd_raw(json.dumps(inject_cmd))
print(f"Injected AER error on {pci_addr}: {ret}")
if __name__ == "__main__":
# 假设虚拟网卡的 qdev_id 为 "net0"
inject_aer_error("/tmp/qmp.sock", "net0", "ecrc")
说明:上述代码利用 QEMU 的 QMP 接口注入 AER 错误,模拟了攻击的第一步——触发 ECRC 错误。在实际攻击中,恶意设备将在此后利用重试机制替换地址。
防御策略
IOMMU 强制重映射
确保 IOMMU 在重试事务时仍然执行完整的地址转换,不因事务 ID 相同而放松检查。现代操作系统中的 IOMMU 驱动(如 Intel VT-d 和 AMD-Vi)已具备此类防护,但需确认固件和内核配置开启了严格模式。
以下是Intel VT-d DMA 重映射架构的数据流向与层次抽象图:
┌────────────────────────────────────────────────────────┐
│ CPU 视角 │
│ │
│ Guest VM Memory Host Physical Memory │
│ (Guest PA) (Host PA = HPA) │
│ │ ^ │
│ └─────────┐ ┌──────────┘ │
└───────────────────┼───────┼────────────────────────────┘
│ │
v │ (DMA 写入/读取)
┌───────────────────┼───────┼────────────────────────────┐
│ VT-d Hardware│(Root-Complex 内置) │
│ v │
│ [ PCIe Request ] ───> [ 硬件查表逻辑 ] ───────────────┤
│ (包含 Source-ID & │ │
│ DMA 原生地址) v │
│ +──────────────+ │
│ │ Context Entry│ │
│ +──────┬───────+ │
│ │ │
│ v │
│ +──────────────+ │
│ │ IOMMU 页表 │ │
│ │ (映射转换基准)│ │
│ +──────┬───────+ │
│ │ │
│ v │
│ [ 地址重映射完成 ] │
└────────────────────────────────────────────────────────┘
限制 AER 错误处理的特权
将 AER 错误处理限制在内核 AER 驱动中,并确保错误严重性设置为“致命”(Fatal)对于关键设备,使系统在检测到不可纠正错误时直接冻结或重置设备,避免给予攻击者重试窗口。
硬件信任根与 TLP 认证
未来 PCIe 规范(如 PCIe 6.0/7.0 引入的 IDE – Integrity and Data Encryption)通过消息认证码(MAC)保护 TLP 完整性,从根本上防止内容篡改。部署支持 IDE 的平台可彻底杜绝此类攻击。
结语
PCIe 的 DMA 安全长期依赖 IOMMU 和地址转换表,而 AER 错误恢复机制在保证可靠性的同时,却为攻击者留下了重放篡改的窗口。TLP 中间人攻击利用了 ECRC 错误处理路径中的重试信任假设,规避了 IOMMU 基于 BDF 的静态检查。随着 PCIe 链路速率提升和分布式计算场景的增加,这一物理层的“幽灵漏洞”将愈发值得硬件设计师和安全研究者警惕。在完整部署 IDE 之前,严格配置 IOMMU、妥善管理 AER 错误严重等级,以及监控异常重试行为,是弥合这一攻击面的务实的防线。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:Ghost Wolf Lab Snow狼 Snow狼《通过 AER 滥用和 ECRC 劫持实现 DMA 重定向》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论