
GIGABYTE H510M K V2(`H510MKV2.F3`) BIOS 이미지의 정적 리버스 엔지니어링: PI-spec SMM Core 메모리 할당자의 전체 UEFI 펌웨어 볼륨 추출 분석과 GIGABYTE/Binarly가 2025년에 공개한 4가지 SMM 메모리 손상 취약점(CVE-2025-7026 CVE-2025-7027 CVE-2025-7028 CVE-2025-7029)을 겨냥한 표적 탐색.
GIGABYTE H510M K V2(H510MKV2.F3) BIOS 이미지의 정적 리버스 엔지니어링: PI-spec SMM Core 메모리 할당자에 대한 전체 UEFI 펌웨어 볼륨 추출 분석과 GIGABYTE/Binarly가 2025년에 공개한 4가지 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 공개가 아닙니다. 여기서 언급된 4개 CVE는 모두 이 연구가 시작되기 이전에 이미 GIGABYTE에 의해 공개적으로 공개·패치되었고(패치 펌웨어는 2025-06-12부터 배포 시작), Binarly와 CERT/CC가 CVE를 지정하고 문서화한 것들입니다. 이 저장소의 어떤 내용도 새로운 취약점 발견이 아닙니다 — 이는 이전에 공개되고 이전에 패치된 버그 클래스가 특정 공개 다운로드 가능 BIOS 빌드에 존재하는지 여부를 확인하는 독립적인 정적 분석 검증입니다.
| 보드 | GIGABYTE H510M K V2 (H510MKV2) |
| BIOS 파일 | H510MKV2.F3 |
| 파일 크기 | 16777216바이트(16MB) |
| 파일 날짜 | 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-spec 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 파일 → 섹션 순서로, 발견된 모든 LZMA/Tiano 압축 펌웨어 볼륨을 해제했습니다..ui(드라이버 표시 이름) 섹션과 .pe/.te 이미지 섹션을 가진 모든 FFS 파일을 <DriverName>__<GUID8>.<pe32|te> 이름의 독립형 PE32+/TE 바이너리로 복사했습니다.ida-pro-mcp / idalib 헤드리스 워커 인터페이스 경유). 모듈당 데이터베이스 하나씩. 자동 분석 + Hex-Rays만 사용했으며, 이 환경에서는 FLIRT 시그니처나 EDK2 타입 라이브러리를 사용할 수 없었습니다(아래 한계로 기록됨).BIOS 이미지에는 4개의 Intel Flash Descriptor 영역이 포함되어 있으며, region-bios만 GIGABYTE/OEM 코드를 담고 있습니다(region-me.fd, region-gbe.fd, region-pdr.fd는 Intel Management Engine / GbE / 디스크립터 펌웨어로, 별도 구성 요소이며 범위 밖이라 탐색하지 않았습니다).
region-bios 내에서 4개의 펌웨어 볼륨이 발견되어 추출되었습니다:
| 볼륨(컨테이너 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 |
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
| CVE | Binarly ID | CVSS | 공개 근본 원인 요약 |
|---|---|---|---|
| CVE-2025-7026 | BRLY-2025-008 | 8.2 | Binarly가 CommandRcx0라고 부르는 함수 내부에서 SW SMI 핸들러(SwSmiInputValue 0xB2)가 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 쓰기가 발생합니다. |
4개 모두의 공통점: 소프트웨어 SMI 핸들러가 레지스터 또는 NVRAM에서 비롯된 값을 메모리 포인터로 신뢰하되, 그 값이 실제로 SMRAM 외부에 있는지 검증하지 않아서 링-0(관리자/루트) 공격자가 일반적인 SW SMI 트리거를 SMM 권한(링 -2)의 임의 읽기/쓰기로 바꿀 수 있습니다 — 완전한 펌웨어 손상, Secure Boot 우회, OS 아래에서의 지속성 확보로 이어집니다.
취약점이 아니라 배경 조사입니다 — 보안 버그를 조사하기 전에 도구 체인(추출 → PE 분리 → IDA/Hex-Rays → 수동 RE)이 실제로 소스로 검증 가능한 진짜 EDK2 내부 구조를 복구할 수 있음을 입증함으로써 나머지 작업의 기반을 마련했습니다.
PiSmmCore(GUID e94f54cd-81eb-47ed-aec3-856f5dc157a9)는 PI-spec 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)