动态演变的安全格局
安全形势瞬息万变,攻击面不断演变。MSRC处理的各种案例中,任意内核指针读取这类原语尤为有趣。当内核模式代码未验证从攻击者控制输入读取的指针是否指向用户模式虚拟地址空间(VAS)时,往往会产生此类原语。攻击者可利用此类原语提供内核模式指针,随后被内核模式代码解引用。
MMIO攻击向量研究
我们重点探索的问题是:能否利用对外设驱动内存映射IO(MMIO)范围的读取进行攻击?MMIO范围的读取用于设备驱动与IO设备之间的双向通信,可以想象它们对MMIO空间内存读取的顺序、时间甚至大小都很敏感。我们将外部硬件设备逻辑视为受各种MMIO范围读写操作影响的抽象状态机。
目标设备定位策略
注册表/设备管理器探测
通过PowerShell脚本可提取设备MMIO范围信息:
$dnames = Get-WmiObject Win32_PnPEntity -Filter 'DeviceID like "PCI%"'
$idtable = @{}
$rangetable = @{}
$rangetable2 = @{}
ACPI MCFG表分析
使用ACPICA工具可提取PCI设备配置信息:
acpidump.exe > acpitabl.dat
acpixtract.exe -l acpitabl.dat
字符串扫描技术
扫描驱动文件中"MMIO"字符串:
$ascii_grep = Get-ChildItem -Recurse | Select-String "MMIO" -List -Encoding "ASCII" | Select Path
MmMapIoSpace拦截
通过WinDbg拦截内存映射调用:
bu nt!MmMapIoSpace ".block{ r $t1 = @rcx; r $t2 = @rdx; r $t3 = @r8; .printf /D \"[+] MmMapIoSpaceEx - Physical Address: %p, Size: %p, Cache Type: %p) \n\", @$t1, @$t2, @$t3}; gc"
典型驱动行为模式
Intel AVStream摄像头驱动
该驱动包含261处MMIO写操作和184处读操作位置,部分操作涉及设备固件镜像认证:
"Authenticating FW image from MMIO address 0x%08x"
Intel串行IO I2C驱动
采用动态MMIO设备注册模式,在设备添加时注册中断服务例程:
Dst[3] = (__int64)OnInterruptIsr;
Dst[4] = (__int64)OnInterruptDpc;
MMIO地址范围模糊测试
我们针对15个持久映射的MMIO地址范围进行了测试:
0xfffff67c84600000 // nt size 0x300000
0xffffe68063040000 // BOOTVID size 0x20000
0xffffe68063616000 // BasicDisplay size 0x20000
研究结论与展望
虽然基于当前认知,通用的MMIO盲读原语可利用性低于信息泄露或内核盲写漏洞,但理论可能性仍然存在。硬件生态系统的复杂性为这类攻击提供了潜在机会,特别是在移动设备等硬件碎片化较低的环境中更具研究价值。