
Static reverse-engineering of a GIGABYTE H510M K V2 (`H510MKV2.F3`) BIOS image: full UEFI firmware-volume extraction analysis of the PI-spec SMM Core memory allocator and a targeted hunt for the four SMM memory-corruption vulnerabilities GIGABYTE/Binarly disclosed in 2025 (CVE-2025-7026 CVE-2025-7027 CVE-2025-7028 CVE-2025-7029).
GIGABYTE H510M K V2(H510MKV2.F3)BIOSイメージの静的リバースエンジニアリング: PI仕様のSMM Coreメモリアロケータの完全なUEFIファームウェアボリューム抽出分析、およびGIGABYTE/Binarlyが2025年に開示した4件のSMMメモリ破壊の脆弱性(CVE-2025-7026 CVE-2025-7027 CVE-2025-7028 CVE-2025-7029)を対象とした的を絞った探索。
ステータス: 4件中1件のCVE(CVE-2025-7027)が存在することを確認。残り3件はアクセス可能な全ファームウェアにわたって積極的に検索したが発見されず、それが何を意味し何を意味しないかの正確な内容は未確認のCVEを参照。
これはn-dayリサーチであり、0-day開示ではありません。ここで参照する4件のCVEはすべて、このリサーチが始まる前に、GIGABYTEによってすでに公開開示・パッチ適用済み(パッチ済みファームウェアは2025-06-12に出荷開始)であり、BinarlyとCERT/CCによってCVEが割り当てられ文書化されていました。このリポジトリの内容は新しい脆弱性の発見ではありません。これは、特定の公開ダウンロード可能なBIOSビルドに、以前に開示・パッチ適用済みのバグクラスが存在するかどうかを検証する独立した静的解析です。
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 経由で到達可能な書き込みポインタとして直接使用されています。これはBinarlyの公開された根本原因の説明と細部に至るまで一致します。uefi_firmware (uefi-firmware-parser -e) がBIOSイメージを再帰的に展開: Intel Flash Descriptor領域 → ファームウェアボリューム → FFSファイル → セクション。見つかったすべてのLZMA/Tiano圧縮ファームウェアボリュームを解凍しました。.ui(ドライバ表示名)セクションと.pe/.teイメージセクションを持つすべてのFFSファイルを、<DriverName>__<GUID8>.<pe32|te>という名前のスタンドアロンPE32+/TEバイナリとしてコピーしました。ida-pro-mcp / idalibヘッドレスワーカーインターフェース経由)。モジュールごとに1つのデータベース。自動解析 + Hex-Raysのみ。この環境ではFLIRTシグネチャやEDK2型ライブラリは利用できませんでした(後述の制限事項に記載)。BIOSイメージには4つのIntel Flash Descriptor領域が含まれています。GIGABYTE/OEMコードを含むのはregion-biosのみです(region-me.fd region-gbe.fd region-pdr.fdはIntel Management Engine / GbE / ディスクリプタファームウェアであり、別コンポーネントのためスコープ外として調査していません)。
region-bios内で4つのファームウェアボリュームが見つかり抽出されました:
4つすべてを抽出しマーカースキャンしました(未確認の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
4件すべてに共通する点: Software SMIハンドラが、レジスタまたはNVRAM由来の値を、実際にSMRAMの外にあるかを検証せずにメモリへのポインタとして信頼しています。これによりring-0(Administrator/root)の攻撃者が、通常のSW SMIトリガーをSMM特権(ring -2)の任意読み取り/書き込みに変換し、ファームウェア全体の侵害、Secure Bootのバイパス、OSより下の層への永続化を実現できます。
これは脆弱性ではありません。セキュリティバグに向けられる前に、ツールチェーン(抽出 → PE分離 → IDA/Hex-Rays → 手動RE)が実際にソースで検証可能な本物の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に組み込まれています。Hex-Raysを備えたIDAで開いて直接確認できます。
モジュール: GenericComponentSmmEntry (GUID 9caa3071-3459-4c5b-bbf0-ee68fe4dd46d)
ファイル: smm_modules_all/GenericComponentSmmEntry__9caa3071.pe32 (+ 解析済み.i64)
抽出したすべてのモジュール(51個のSmm*命名ドライバ、次にメインボリュームの全302個、そして補助ボリューム)を、BinarlyのCVE-2025-7027解説書が引用する正確なNVRAM変数名SetupXtuBufferAddressについてバイト/文字列スキャンしました。GenericComponentSmmEntry内(および、おそらくそれを設定/公開するDXE側のGenericComponentDxeEntry内)でUTF-16LE文字列として一致しました。
1. GetXtuBufferAddress_FromNvram (0x1F270) は gRT->GetVariable(L"SetupXtuBufferAddress" &Guid NULL &Size=8 &OutBuffer) を呼び出します(ランタイムサービス形式テーブルのオフセット+72 = GetVariable)。このNVRAM変数に保存された生の8バイト値を返します。その値が実際に何であるかの検証は一切ありません。
2. SUSPECTED_CVE_2025_7027_UnvalidatedXtuPtrWrite (0x18400) は上記を呼び出してv3(NVRAM由来の「アドレス」)を取得し、その後(自身の入力構造体a1[3]から取得したカウントで上限が決まる)ループで以下を実行します:
*(WORD *)(v3 + 2 * v7 + 12) = v9; // v3 = raw NVRAM value v9 = attacker-influenced data
v3は書き込みターゲットとして使用される前に、実際の範囲内かつSMRAM外のアドレスであることが決してチェックされません。SetupXtuBufferAddressは(このビルドではSMMロックされていない)通常のNVRAM変数であり、ring-0攻撃者はSMIをトリガーする前にSetVariable()で任意のアドレス(例: SMRAMアドレス、または重要なカーネル/ハイパーバイザー構造体)に設定でき、制御されたSMM特権のwrite-what-whereを引き起こせます。
3. ComponentDispatch_KeymapOrXtu (0x18590) はディスパッチコールバックです。内部コンポーネントデータベースからコンポーネントタイプのバイトを取得し、type == 1の場合は上記の脆弱な関数を呼び出します。タイプ0はSetupVar_SafeKeymapWrite_bounded(0x18234)に進みますが、こちらは対照的に、実際のSetup NVRAM変数に対して適切なサイズ対容量の境界チェックを行います。この対照こそが、XTUパスを異常な未チェック経路として際立たせています。
4. sub_18698 はComponentDispatch_KeymapOrXtuをディスパッチ値**0xB2(10進数178)**に対して登録します。これはBinarlyのアドバイザリがこのバグクラスについて挙げている正確なSwSmiInputValue 0xB2です。これにより、ソフトウェアSMIトリガーポートが脆弱なディスパッチパスに直接結び付けられます。
SetupXtuBufferAddress)。逐語的に一致。0xB2)。RBXレジスタがComponentDispatch_KeymapOrXtu/a1[3]に到達するコンポーネント選択入力にどう供給されるかは、生のCPUセーブステート読み取りまで完全には追跡できませんでした。そのためには、GenericComponentSmmEntryの登録済みコールバックを呼び出す前に、登録済み0xB2値でディスパッチする処理をもう一巡追跡する必要があります。これは、CVEに記載された脆弱なパターンがこのBIOSビルドに存在するという静的解析による確認であり、実働するエクスプロイトやPoCではありません。SMRAMの内容、セーブステートのレイアウト、実行時の動作は一切検証されていません。
Binarlyのこれら3件のCVEに関する公開解説書に記載されているすべてのマーカー($DB$ 2DB$ SwSmi OcHeader FuncBlock CommandRcx0 ReadFlash WriteFlash EraseFlash GetFlashInfo)を、リテラルバイトシーケンスとして、および(該当する場合)UTF-16LE文字列として、以下に対して検索しました:
flash.fdイメージ。all_modules/)。extra_volumes_modules/)。f641_pei_modules/)。これらのマーカーはどこにも見つかりませんでした。 一致したのはSetupXtuBufferAddress(CVE-2025-7027)と、一般的なOverClock UIテキスト文字列(無関係なBIOSセットアップメニューのラベル)のみです。
SetupXtuBufferAddressは、GetVariable()に渡される実際のNVRAM変数名であるため、リテラル文字列として現れる必要がありました。この文字列は機能的に必須です。対照的にCommandRcx0 OcHeader FuncBlockは、Binarlyがリバースエンジニアリングした匿名/ストリップ済み関数に対するBinarly自身の内部ラベルのように読め、バイナリに埋め込まれた識別子ではありません。文字列として存在しないことは、基盤となるコードが存在するかどうかについて何も証明しません。$DB$/2DB$マジック定数は、存在すればバイトレベルの一致として現れるはずですが(コンパイルされた比較文字列の即値オペランドとして現れるかどうか)、存在しないことはやや意味があるものの、やはり決定的ではありません(異なる即値エンコーディング、モデル別のファームウェアバリアント、または若干異なるチェック順序はすべて、生の部分文字列スキャンをすり抜ける可能性があります)。
FlashSmiSmm(GUID 6c289241-...)とFlashDriverSmm(GUID 0c375a90-...)が最有力候補です。名前がReadFlash/WriteFlash/EraseFlash/GetFlashInfoとほぼ完全に一致します。両方とも抽出・自動解析済み(smm_modules_all/内の.i64データベースでHex-Rays対応)ですが、手動トレースは未実施です。それぞれ174関数と243関数で、区別可能な静的マーカーがなく、CVE-2025-7027で実施したのと同じ種類の手動ディスパッチャートレースが必要です(SW SMI 0xB2相当の登録を見つけ、関数ポインタテーブルのディスパッチまで追跡し、テーブルポインタが検証されているかを確認する)。OcHeader)。 有力候補: GenericComponentSmmEntry自体(このまさにそのモジュールで未チェックポインタバグの発生源であることが実証済み)、、、、。いずれもまだ手動トレースされていません。これらは今回のパスでは完了していません。ギャップが「チェック済み・問題なし」と暗黙に示されるのではなく、明確に見えるようここに明示的にフラグ付けしています。
このボード(またはこのアドバイザリの対象となる240以上のGIGABYTEモデル)をお持ちの場合: GIGABYTEのサポートサイトから最新のBIOSに更新してください。 GIGABYTEは2025-06-12にパッチ済みファームウェアの出荷を開始しました。ここで解析したビルド(H510MKV2.F3、2023-12-20付)はそれより約18か月前であり、未パッチであることと整合します。これは理論上の推奨ではありません。このリサーチは、CVE-2025-7027の実際の脆弱コードパスがこの特定のビルドに存在することを発見しました。
.til)を利用できなかったため、SMMシステムテーブル(gSmst)/プライベートデータ構造体のフィールドをHex-Raysで自動マッピングできませんでした。解析における一部の構造体オフセットの解釈は、適用された型情報ではなく手動トレースに基づいています。region-me.fd region-gbe.fd region-pdr.fd(Intel ME / GbE / ディスクリプタ領域)は調査していません。スコープ外です(GIGABYTE/OEMのSMMコードではなく、別のファームウェアコンポーネント)。| ボード | 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か月前) |
0xB2| ボリューム (コンテナ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 | 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から派生しReadFlash/WriteFlash/EraseFlash/GetFlashInfo経由で到達可能な関数ポインタ構造体(FuncBlock)の検証欠如。 |
| CVE-2025-7029 | BRLY-2025-011 | 8.2 | 電源/熱(オーバークロック)構成ロジックにおいて、RBXの未チェックな使用が攻撃者の影響を受けるOcHeaderポインタを制御し、任意のSMRAM書き込みにつながります。 |
PowerMgmtSmmRealTimePowerSmmThermalFanCtrSmmPpamPlatformSmm$DB$/2DB$シグネチャチェック)。 Binarlyの解説書によればSwSmiInputValue 0xB2は少なくともCVE-2025-7026とCVE-2025-7027で共有されており、またこのダンプによって0xB2がGenericComponentSmmEntry内で実際に使用されている本物のディスパッチ値であることが証明されたため、次のステップは、メインボリューム内で0xB2に対するコールバックを登録しているすべてのドライバを列挙し(すでに見つかった1つだけでなく)、それぞれについて未チェックポインタ+マジック値パターンをチェックすることです。