
对技嘉 H510M K V2(`H510MKV2.F3`)BIOS 镜像的静态逆向工程:对 PI 规范 SMM Core 内存分配器进行完整的 UEFI 固件卷提取分析,并针对性地搜寻技嘉/Binarly 于 2025 年披露的四个 SMM 内存损坏漏洞(CVE-2025-7026 CVE-2025-7027 CVE-2025-7028 CVE-2025-7029)。
针对技嘉 H510M K V2(H510MKV2.F3)BIOS 镜像的静态逆向工程:完整地对 PI 规范 SMM Core 内存分配器进行 UEFI 固件卷提取分析,并定向搜寻 GIGABYTE/Binarly 于 2025 年披露的四个 SMM 内存破坏漏洞(CVE-2025-7026、CVE-2025-7027、CVE-2025-7028、CVE-2025-7029)。
状态:4 个 CVE 中已确认 1 个存在(CVE-2025-7027)。另外 3 个已在全部可访问固件中积极搜寻,但未找到。详见 未确认的 CVE 以了解这究竟意味着什么、不意味着什么。
这是一项 n-day 研究,而非 0-day 披露。此处引用的所有四个 CVE 均已由 GIGABYTE 公开披露并修复(修复固件于 2025-06-12 开始出货),并由 Binarly 和 CERT/CC 在本研究开始之前分配了 CVE 编号并撰写报告。本仓库中的内容并非新的漏洞发现——而是对先前已披露、已修复的漏洞类别是否存在于一个特定的、可公开下载的 BIOS 构建中的独立静态分析验证。
| 主板 | GIGABYTE H510M K V2 (H510MKV2) |
| BIOS 文件 | H510MKV2.F3 |
| 文件大小 | 16777216 字节(16 MB) |
| 文件日期 | 2023-12-20 |
| MD5 | a9bca8aeb55061824af1c3eedfb5c846 |
| SHA-256 | 934a935e5faba8d2cea4e1d51e9edb6aed86b32f412d0da5bae602bd9fd8f9f3 |
| 芯片组 | Intel H510 |
| 厂商补丁自 | 2025-06-12(此构建早于该日期约 18 个月) |
uefi-firmware-parser)——在 SMM/DXE 卷中枚举出 356 个 FFS 文件,其中 302 个具有可提取的 PE32/TE 镜像。PiSmmCore(PI 规范的 SMM Core),通过其硬编码的 "sphd"/"tail" 防护签名,确认并命名了真正的 SMM 池/页分配器(SmmAllocatePool/SmmFreePool/SmmAllocatePages/SmmFreePages 内部实现)——与 EDK2 开源的 MdeModulePkg/Core/PiSmmCore/Pool.c 完全匹配。GenericComponentSmmEntry 中发现并追踪了确切的易受攻击代码路径:一个 NVRAM 变量(SetupXtuBufferAddress)通过 GetVariable() 获取且未经任何验证,被直接用作可通过 SW SMI 0xB2 触达的写入指针——这与 Binarly 公开的根因描述逐点吻合。uefi_firmware(uefi-firmware-parser -e)以递归方式解包 BIOS 镜像:Intel Flash Descriptor 区域 → 固件卷 → FFS 文件 → 节(section),并解压其找到的每个 LZMA/Tiano 压缩固件卷。.ui(驱动显示名称)节和 .pe/.te 镜像节的 FFS 文件复制为独立的 PE32+/TE 二进制文件,命名为 <DriverName>__<GUID8>.<pe32|te>。ida-pro-mcp / idalib 无头工作器接口)配合 Hex-Rays 反编译器,每个模块一个数据库。仅使用自动分析 + Hex-Rays——此环境中没有可用的 FLIRT 签名或 EDK2 类型库(在下方备注为局限性)。BIOS 镜像包含四个 Intel Flash Descriptor 区域;只有 region-bios 包含 GIGABYTE/OEM 代码(region-me.fd、region-gbe.fd、region-pdr.fd 是 Intel Management Engine / GbE / 描述符固件——独立组件,超出范围,未予探索)。
在 region-bios 内发现并提取了四个固件卷:
| 卷(容器 FFS GUID) | 内容 | 提取文件数 |
|---|---|---|
file-9e21fd93-... → volume-ee4e5898-... | 主 DXE/SMM 驱动卷——所有 Smm* 驱动、平台 DXE 驱动 | 302 |
file-f641ac56-... → volume-ee4e5898-... | 上述内容的重复/PEI 阶段副本(较小的子集:PiSmmCommunicationPei、IT8728FSmmFeaturesPei 等) | 22 |
file-3417f275-... → volume-3417f275-... | 早期 PEI/DXE 启动卷(DxeIpl、FspS3Notify ...) | 21(2 个含镜像) |
file-05ca020b-... → volume-05ca020b-... | 小型辅助卷,无任何可执行镜像 | 2 |
四个卷均被提取并进行了标记扫描(参见 未确认的 CVE)。
SMM/
├── README.md this file
├── CVE_ANALYSIS.md full technical deep-dive (code-level detail confidence notes)
├── flash.fd copy of the extracted 16MB BIOS image
├── regions/ raw recursive extraction (every FV/FFS/section as produced by uefi_firmware)
├── smm_modules/ PiSmmCore isolated + fully analyzed (.pe32 + Hex-Rays .i64 renames applied)
├── smm_modules_all/ all 51 `Smm*`-named drivers as standalone PE32/TE + manifest.txt
│ (4 extra ones PiSmmCpuDxeSmm SmmAccess SmmControl SmmLockBox
│ FlashSmiSmm FlashDriverSmm have auto-analyzed .i64 databases)
├── all_modules/ every extractable module from the main DXE/SMM volume (302 not just Smm*-named)
├── extra_volumes_modules/ modules from the two smaller auxiliary firmware volumes
└── f641_pei_modules/ modules from the duplicate PEI-phase volume copy
| CVE | Binarly ID | CVSS | 公开根因摘要 |
|---|---|---|---|
| CVE-2025-7026 | BRLY-2025-008 | 8.2 | SW SMI 处理程序(SwSmiInputValue 0xB2)在 Binarly 称为 CommandRcx0 的函数中将 RBX 寄存器视为未检查的指针;如果 *RBX 匹配 '$DB$'/'2DB$',该处理程序将执行任意 SMRAM 写入。 |
| CVE-2025-7027 | BRLY-2025-009 | 8.2 | 双重指针解引用:未经验证的 NVRAM 变量(SetupXtuBufferAddress)与攻击者控制的、源自 RBX 的指针结合 → 任意 SMRAM 写入。 |
| CVE-2025-7028 | BRLY-2025-010 | 8.2 | 缺乏对源自 RBX/RCX 的函数指针结构(FuncBlock)的验证,这些结构可通过 ReadFlash/WriteFlash/EraseFlash/GetFlashInfo 触达。 |
| CVE-2025-7029 | BRLY-2025-011 | 8.2 | 未检查地使用 RBX 来控制攻击者影响的 OcHeader 指针,位于电源/热(超频)配置逻辑中 → 任意 SMRAM 写入。 |
这四个漏洞的共同主线是:软件 SMI 处理程序将寄存器或源自 NVRAM 的值视为指向内存的指针,却未验证其实际是否位于 SMRAM 之外,从而允许 ring-0(管理员/root)攻击者将普通的 SW SMI 触发转换为 SMM 特权(ring -2)的任意读写——固件完全沦陷、Secure-Boot 绕过以及操作系统之下的持久化。
并非漏洞——这是背景研究,通过证明工具链(提取 → PE 隔离 → IDA/Hex-Rays → 手动逆向)确实能够还原可验证源码的 EDK2 内部实现,为后续工作奠定了基础,之后才将矛头指向安全漏洞。
PiSmmCore(GUID e94f54cd-81eb-47ed-aec3-856f5dc157a9)是 PI 规范的 SMM Core:它拥有 SmmAllocatePool/SmmFreePool/SmmAllocatePages/SmmFreePages 以及 SMI 处理程序分发表。
调用链(地址位于 smm_modules/PiSmmCore.pe32.i64 内):
_ModuleEntryPoint (0x1184)
-> SmmCoreEntryPointHelper (0x14D4) writes the "SMST" table signature
-> SmmInternalAllocatePool_wrapper (0x95EC)
-> InternalAllocPoolByIndex_sphd_tail (0x57A8) <- the allocator
-> SmmAllocateZeroedPool (0x961C) alloc + zero wrapper
SmmFreePool_wrapper (0x9714)
-> SmmIsBufferInsideSmram (0x95A8) decides SMRAM-resident vs not
-> SmmInternalFreePool_sphd_tail (0x591C) validates sphd/tail frees
-> InternalFreePages (0x6A2C) page-granularity free + coalesce
InternalFindFreePages (0x6820) page-granularity alloc (mirror of InternalFreePages)
InternalAllocPoolByIndex_sphd_tail(0x57A8)被确认为真正的 EDK2 MdeModulePkg/Core/PiSmmCore/Pool.c 分配器:它硬编码了字面 ASCII 签名 "sphd"(SMM_POOL_HEAD_SIGNATURE)和 "tail"(SMM_POOL_TAIL_SIGNATURE)——正是开源实现中的魔法常量。大小 ≤ 0x800 字节的请求通过大小类别空闲链表子分配器处理;更大的请求则遍历页面空闲链表,并在返回的块上包裹头部/尾部防护签名。释放侧对应函数(SmmInternalFreePool_sphd_tail)在将内存归还空闲链表之前会验证相同的签名。
所有重命名都已固化在 smm_modules/PiSmmCore.pe32.i64 中——在 IDA 中打开它并配合 Hex-Rays 即可直接查看。
模块: GenericComponentSmmEntry(GUID 9caa3071-3459-4c5b-bbf0-ee68fe4dd46d)
文件: smm_modules_all/GenericComponentSmmEntry__9caa3071.pe32(+ 已分析的 .i64)
对每个提取的模块(先是 51 个 Smm* 命名模块,然后是主卷中的所有 302 个,接着是辅助卷)进行了针对 SetupXtuBufferAddress 的字节/字符串扫描——这是 Binarly 的 CVE-2025-7027 报告所引用的确切 NVRAM 变量名。它在 GenericComponentSmmEntry 内部以 UTF-16LE 字符串形式匹配(其 DXE 对应物 GenericComponentDxeEntry 也可能设置/暴露该变量)。