
CVE-2022-34302를 시연한다. 이는 New Horizon Datasys가 서명한 부트로더의 내장 커스텀 PE/COFF 로더가 서명되지 않은 UEFI 애플리케이션을 실행함으로써 발생하는 Secure Boot 우회 취약점이다.
New Horizon Datasys Reboot Restore 부트 로더 - 취약한 UEFI 애플리케이션 직접 가져오기(BYOVUA) - 서명된 부트로더에 내장된 커스텀 PE/COFF 로더를 통해 서명되지 않은 UEFI 애플리케이션을 로드하여 Secure Boot를 우회합니다.
이 저장소는 New Horizon Datasys 부트 로더의 Secure Boot 우회 취약점인 CVE-2022-34302를 악용하여 BYOVUA (Bring Your Own Vulnerable UEFI Application) 기법을 시연합니다.
UEFI Shell 기반 취약점(CVE-2022-34301 및 CVE-2022-34303)과 달리, 이 부트로더는 UEFI Shell을 노출하지 않습니다. 대신 shdloader.efi는 자체적인 커스텀 PE/COFF 로더를 구현하여 2단계 바이너리(shdmgr.ef_)를 펌웨어의 LoadImage() 함수를 사용하지 않고, 어떠한 서명 검증도 수행하지 않은 채 로드합니다. 공격자는 shdmgr.ef_를 호환되는 임의의 UEFI 애플리케이션으로 교체하기만 하면 Secure Boot가 활성화된 상태에서 임의 코드 실행을 달성할 수 있습니다.
이는 "One Bootloader to Load Them All" 연구에서 공개된 세 가지 취약점 중 가장 위험한 것입니다. Eclypsium이 지적했듯이, 이 우회는 내장되어 있고 완전히 은밀하며 화면에 어떠한 시각적 표시도 남기지 않습니다 - 따라서 모니터가 있는 시스템에서도 보이지 않고, 서버나 산업 장비와 같은 헤드리스 시스템에서는 탐지할 수 없습니다.
BYOVUA는 커널 수준에서 사용되는 BYOVD(Bring Your Own Vulnerable Driver) 기법의 UEFI 버전입니다. 취약점이 있는 서명된 커널 드라이버를 가져오는 대신, 공격자는 Secure Boot를 무력화할 수 있는 기능을 포함한 서명된 UEFI 애플리케이션을 가져옵니다.
shdloader.efi는 Microsoft가 신뢰하는 인증서로 서명되어 있기 때문에 Secure Boot에서 의심 없이 허용되며, 이 인증서를 Secure Boot 데이터베이스(db)에 포함하는 모든 시스템 - 지난 10년간 출시된 거의 모든 UEFI 지원 PC - 에서 신뢰됩니다. 일단 실행되면, 내장된 커스텀 PE 로더는 공격자에게 운영체제가 로드되기 전에 임의의 서명되지 않은 코드를 로드하고 실행할 수 있는 능력을 제공하며, 이 환경에서는 현대적인 보안 제어(ASLR, DEP, 커널 보호)가 존재하지 않습니다.
shdloader.efi는 New Horizon Datasys의 시스템 복원 및 복구 제품(Reboot Restore Rx, RollBack Rx)의 일부로 배포되는 UEFI 부트 로더입니다. 정상적인 부팅 체인에서의 역할은 운영체제가 시작되기 전에 스냅샷 및 복원 작업을 처리하는 사전 OS 관리 구성 요소(shdmgr.ef_)를 로드하는 것입니다.
| 속성 | 값 |
|---|---|
| 파일 | shdloader.efi = EFI/Boot/bootx64.efi |
| 제조사 | New Horizon Datasys Inc |
| 제품 | Reboot Restore Rx / RollBack Rx |
| CVE | CVE-2022-34302 |
| 서명 | Microsoft Windows UEFI Driver Publisher → Microsoft Corporation UEFI CA 2011 |
| 발견 | Eclypsium (Mickey Shkatov, Jesse Michael) - 2022년 8월 |
| 발표 | DEF CON 30 - "One Bootloader to Load Them All" |
| 폐기 | Microsoft KB5012170을 통해 DBX에 추가됨 (2022년 8월) |
이 취약점은 부트 로더 아키텍처의 설계 결함입니다. Secure Boot 서명 검증을 강제하는 펌웨어의 LoadImage() 및 StartImage() 부트 서비스를 사용하는 대신, shdloader.efi는 자체적인 커스텀 PE/COFF 로더를 구현하여 원시 디스크 바이트에서 shdmgr.ef_를 직접 읽고, 재배치하고, 실행함으로써 펌웨어의 보안 검사를 완전히 우회합니다.
핵심 문제: Secure Boot에서 신뢰하는 서명된 바이너리가 서명을 검증하지 않는 자체 이미지 로더를 포함하고 있습니다. 펌웨어는 shdloader.efi를 서명된 것으로 검증하지만, 일단 실행되면 shdmgr.ef_를 어떠한 검증도 없이 로드합니다. shdmgr.ef_를 임의의 UEFI 애플리케이션으로 교체하면 해당 애플리케이션이 전체 하드웨어 접근 권한으로 실행되며, Secure Boot는 활성화된 것으로 보고됩니다.
이는 공격자가 UEFI Shell과 상호작용하고 검증을 비활성화하기 위해 gSecurity2를 수동으로 손상시켜야 하는 CVE-2022-34301 및 CVE-2022-34303과 근본적으로 다릅니다. 여기서는 우회가 자동적이고 은밀하게 이루어집니다 - 사용자 상호작용도, 가시적인 출력도, 셸 프롬프트도 없습니다.
서명된 shdloader.efi는 자체적인 PE/COFF 이미지 로더 구현을 포함하고 있습니다. Security Architectural Protocols를 호출하고 Secure Boot 데이터베이스에 대해 이미지의 서명을 검증하는 펌웨어의 LoadImage() 부트 서비스를 호출하는 대신, 이 부트로더는 다음과 같이 동작합니다:
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL을 사용하여 \EFI\Boot\shdmgr.ef_를 엽니다.reloc 섹션을 처리하고 기본 재배치를 적용합니다이 과정의 어느 시점에서도 로더는 이미지의 Authenticode 서명을 검증하거나, Secure Boot 데이터베이스(db/dbx)를 확인하거나, EFI_SECURITY2_ARCH_PROTOCOL을 호출하지 않습니다. 이미지는 순전히 PE/COFF 구조적 유효성만을 기준으로 로드됩니다.```c
// Pseudocode of what shdloader.efi does internally
//
// NOTE: This is a simplified representation. The actual
// implementation was derived from reverse engineering.
EFI_STATUS LoadShdmgr(VOID) { // Step 1: Open the file File = OpenFile(L"\EFI\Boot\shdmgr.ef_");
// Step 2: Read raw bytes (no signature check)
ReadFile(File, &Buffer, &Size);
// Step 3: Parse PE/COFF headers
DosHeader = (EFI_IMAGE_DOS_HEADER *)Buffer;
PeHeader = (EFI_IMAGE_NT_HEADERS *)(Buffer + DosHeader->e_lfanew);
// Step 4: Allocate memory and copy sections
ImageBase = AllocatePages(...);
CopySections(ImageBase, Buffer, PeHeader);
// Step 5: Apply base relocations from .reloc
Delta = ImageBase - PeHeader->OptionalHeader.ImageBase;
ApplyRelocations(ImageBase, PeHeader, Delta);
// Step 6: Jump to entry point
// NO SIGNATURE VERIFICATION ANYWHERE
EntryPoint = ImageBase + PeHeader->OptionalHeader.AddressOfEntryPoint;
((EFI_IMAGE_ENTRY_POINT)EntryPoint)(ImageHandle, SystemTable);
}
---
<div id='LoadImageVsCustomLoader'/>
### ***LoadImage vs 커스텀 로더***
펌웨어의 `LoadImage()`와 커스텀 로더 간의 차이는 핵심적인 보안 격차입니다:```
┌─────────────────────────────────────────────────────────────────────────┐
│ Firmware LoadImage() - How legitimate boot chains work │
│ │
│ bootx64.efi ──> LoadImage("shdmgr.ef_") │
│ │ │
│ ├── Parse PE/COFF headers │
│ ├── Verify Authenticode signature │
│ ├── Check signature against db (allowed) │
│ ├── Check hash against dbx (revoked) │
│ ├── Call gSecurity2->FileAuthenticationState() │
│ │ │ │
│ │ ├── Signature valid? ── YES ──> Load image │
│ │ └── Signature invalid? ── NO ──> REJECT │
│ └── StartImage() │
│ │
├─────────────────────────────────────────────────────────────────────────┤
│ Custom PE Loader - What shdloader.efi does │
│ │
│ shdloader.efi ──> OpenFile("shdmgr.ef_") │
│ │ │
│ ├── ReadFile() into buffer │
│ ├── Parse PE/COFF headers │
│ ├── Allocate memory │
│ ├── Copy sections │
│ ├── Apply .reloc relocations │
│ ├── *** NO SIGNATURE CHECK *** │
│ └── Jump to EntryPoint │
│ │
│ Result: ANY valid PE/COFF EFI application runs, signed or not │
└─────────────────────────────────────────────────────────────────────────┘
사용자 정의 PE 로더는 단순화된 구현이며 특정 PE/COFF 레이아웃을 기대합니다. 이를 준수하지 않는 바이너리는 오류와 함께 거부됩니다:``` Reloc table overflows binary Relocation failed Invalid entry point
이 중 하나라도 누락된 바이너리는 커스텀 로더에 의해 거부됩니다.
| 필드 | 필수 값 | 이유 |
|-------|---------------|--------|
| *Machine* | `0x8664` (x64) | 로더는 x86-64 이미지만 지원합니다 |
| *Subsystem* | `10` (EFI Application) | EFI Application이어야 합니다 |
| *.reloc 섹션* | 유효한 기본 재배치 항목이 있는 `.reloc`이 존재해야 함 | 로더가 자체적으로 이미지 재배치를 수행합니다. .reloc이 없으면 "Reloc table overflows binary" 오류와 함께 실패합니다 |
| *Relocation Directory* | `VirtualAddress` != 0, Size != 0 (DATA_DIRECTORY[5]) | 디렉터리 항목이 유효한 재배치 데이터를 가리켜야 합니다 |
배포 전 호환성 확인을 위한 검증 스크립트(Scripts/VerifyPE.py)가 제공됩니다.
---
<div id='BYOVD'/>
### ***커널 BYOVD와의 병렬성***
UEFI BYOVUA와 커널 BYOVD 사이의 구조적 병렬성은 정확히 일치합니다. 다만 CVE-2022-34302는 가장 직접적인 형태를 나타냅니다 - 서명된 구성 요소 **자체**가 검증을 비활성화하는 프리미티브를 제공하는 것이 아니라, 서명되지 않은 코드를 로드합니다:```
┌──────────────────────────────────────────────────────────────┐
│ UEFI BYOVUA - CVE-2022-34302 (Custom PE Loader) │
│ │
│ Signed Bootloader ──> Custom PE Loader ──> Load unsigned │
│ (trusted by (no sig check) UEFI apps │
│ Secure Boot) │
├──────────────────────────────────────────────────────────────┤
│ UEFI BYOVUA - CVE-2022-34301/34303 (Shell + gSecurity2) │
│ │
│ Signed Shell ─ mm ─> gSecurity2 = NULL ─> Load unsigned │
│ (trusted by (Security2 Protocol) UEFI apps │
│ Secure Boot) │
├──────────────────────────────────────────────────────────────┤
│ Kernel BYOVD (DSE Bypass) │
│ │
│ Signed Driver ─ IOCTL ─> g_CiOptions = 0 ─> Load unsigned │
│ (trusted by (CI.dll) kernel drivers │
│ DSE / CI) │
└──────────────────────────────────────────────────────────────┘
CVE-2022-34302는 우회가 부트로더 설계 자체에 내재되어 있어 공격자가 보안 메커니즘을 손상시켜야 하는 중간 단계가 존재하지 않기 때문에 가장 위험한 변종입니다. 서명된 구성 요소가 정상 동작의 일환으로 서명되지 않은 코드를 직접 로드합니다.
서명된 shdloader.efi가 기본 부트 로더로 EFI 시스템 파티션(ESP)에 배치됩니다. Microsoft의 UEFI 드라이버 게시자 인증서로 서명되어 있기 때문에 Secure Boot가 문제없이 검증하고 로드합니다.```
EFI System Partition (ESP)
└── EFI/
└── Boot/
└── bootx64.efi (shdloader.efi) ← Signed by Microsoft Windows UEFI Driver Publisher
└── shdmgr.ef_ (PAYLOAD) ← Unsigned, loaded by shdloader's custom PE loader
시스템이 부팅되면, 펌웨어는 다음을 수행합니다:
1. ESP에서 `bootx64.efi`를 읽습니다
2. `LoadImage()`를 호출하여 Secure Boot 데이터베이스에 대해 Authenticode 서명을 검증합니다
3. 서명이 `db`의 Microsoft UEFI CA 2011 인증서와 일치함 → 이미지가 수락됨
4. `StartImage()`를 호출하여 실행을 `shdloader.efi`로 이전합니다
---
<div id='Phase2'/>
### ***Phase 2 - 사용자 정의 PE 로더 활성화***
`shdloader.efi`가 제어권을 획득하면, 진단 메시지를 출력하고 즉시 사용자 정의 PE/COFF 로더를 활성화합니다:```
Booting in insecure mode
부트로더는 그런 다음:
\EFI\Boot\shdmgr.ef_를 연다.text, , 등)을 할당된 메모리에 복사한다.data.relocLoadAddress - ImageBase)를 계산하고 .reloc 섹션의 모든 기본 재배치를 적용한다LoadAddress + AddressOfEntryPoint를 실행 대상으로 결정한다이 과정의 어느 시점에서도 서명 검증은 발생하지 않는다. 로더는 LoadImage()를 호출하지 않고, gSecurity2->FileAuthenticationState()를 호출하지 않으며, db 또는 dbx 데이터베이스를 확인하지 않는다. 파일은 순전히 구조적 유효성만을 기준으로 로드된다.
파일을 찾을 수 없는 경우, 부트로더는 다음을 보고한다:``` Failed to open \EFI\Boot\shdmgr.ef_ - 800000000000000E Failed to load image
---
<div id='Phase3'/>
### ***Phase 3 - 서명되지 않은 코드 실행***
커스텀 로더가 `shdmgr.ef_`의 진입점으로 점프합니다. 이제 서명되지 않은 UEFI 애플리케이션이 다음과 같은 환경에서 실행됩니다:
- 전체 하드웨어 접근 (직접 메모리, I/O 포트, PCI, MMIO)
- 운영체제가 아직 로드되지 않음
- ASLR, DEP 또는 커널 보호 기능 없음
- EDR 또는 엔드포인트 보안 모니터링 없음
- 이후의 모든 OS 쿼리에 Secure Boot가 **활성화됨**으로 보고됨
이 공격은 완전히 은밀합니다. 눈에 보이는 UEFI Shell 프롬프트를 표시하는 CVE-2022-34301 및 CVE-2022-34303과 달리, 이 익스플로잇은 "Booting in insecure mode" 메시지 외에는 어떠한 시각적 출력도 생성하지 않습니다 (이 메시지는 정상적인 시스템에서는 잠시 나타났다가 빠르게 OS 부팅 화면으로 대체됩니다). 헤드리스 시스템(서버, IoT, 산업 장비)에서는 어떠한 징후도 없습니다.
---
<div id='Phase4'/>
### ***Phase 4 - 지속성***
이 공격은 기본적으로 지속적입니다. `shdloader.efi`가 `\EFI\Boot\bootx64.efi`에 남아 있고 공격자의 페이로드가 ESP의 `\EFI\Boot\shdmgr.ef_`에 남아 있는 한, 서명되지 않은 페이로드가 매 부팅 시 실행됩니다.
`startup.nsh` 스크립트가 필요하지 않습니다. 펌웨어 업데이트 전반에 걸쳐 gSecurity2 주소를 재계산할 필요도 없습니다. 커스텀 PE 로더는 발견한 `shdmgr.ef_`를 무조건 로드합니다.
시스템은 계속해서 Secure Boot를 "활성화됨"으로 보고합니다 - 오직 부트로더 수준에서만 신뢰 체인이 깨진 것입니다. 이로 인해 이 공격은 OS 수준의 Secure Boot 상태 쿼리와 Secure Boot 증명에 의존하는 모든 보안 소프트웨어에 보이지 않게 됩니다.
> **중요:** 지속성은 `shdloader.efi`에 대한 폐기 항목(KB5012170)으로 DBX가 업데이트될 때만 깨집니다. 이 경우 커스텀 로더가 활성화되기 전에 펌웨어가 `shdloader.efi` 자체를 거부하게 됩니다.
---
---
---
<div id='Exploit'/>
## ***익스플로잇***
`Exploit/` 디렉터리에는 호환되는 `shdmgr.ef_`를 빌드하는 데 필요한 모든 것이 포함되어 있습니다:```
Exploit/
|
├── README.md ← Build guide and PE/COFF requirements
|
├── PayloadShdmgr/
| |
│ ├── ForceReloc.nasm ← Force .reloc section generation
│ ├── shdmgr.ef_.c ← UEFI application source (EDK2)
│ ├── shdmgr.ef_.inf ← EDK2 module definition
│ ├── shdmgr.ef_.dsc ← EDK2 platform build configuration
│ └── shdmgr.ef_.dec ← EDK2 package declaration
|
└── Scripts/
└── VerifyPE.py ← PE/COFF compatibility verifier
서명된 부트로더는 KB5012170(2022년 8월)을 통해 Microsoft의 DBX 폐기 목록에 추가되었습니다. 업데이트된 시스템에서는 커스텀 PE 로더가 활성화되기 전에 Secure Boot에 의해 부트로더가 거부됩니다.
랩 환경을 위해서는 다음 조건을 충족하는 시스템이 필요합니다:
QEMU UEFI Research Environment에서 이를 위한 자동화된 설정을 제공합니다.
CVE-2022-34302는 CVE-2022-34301 및 CVE-2022-34303보다 악용하기 더 간단합니다:
| 측면 | CVE-2022-34302 (커스텀 로더) | CVE-2022-34301/34303 (Shell) |
|---|---|---|
| 기법 | shdmgr.ef_를 페이로드로 교체 | mm 명령으로 gSecurity2 손상 |
| 상호작용 | 없음 (완전 자동) | 수동 shell 명령 또는 startup.nsh |
| 가시성 | 은밀함 ("Booting in insecure mode") | UEFI Shell 프롬프트 노출 |
| 펌웨어 의존성 | 없음 (페이로드가 자체 포함) | gSecurity2 주소가 펌웨어 빌드마다 변경됨 |
| 복잡도 | 낮음 (파일 교체) | 중간 (메모리 스캔 및 패칭) |
| 은닉성 | 높음 (헤드리스에서 시각적 출력 없음) | 낮음 (화면에 shell 노출) |