
EDK2 BrotliCustomDecompressLib 보안 취약점 발견 사항 — 조정된 공개
EDK2 자체의 Brotli 압축 해제 글루 코드
(MdeModulePkg/Library/BrotliCustomDecompressLib)에 존재하는 힙 버퍼 오버플로로,
2017년부터 존재해 왔으며 2026-10-25 기준 HEAD에서도 미수정 상태입니다. 개념 증명
(PoC)과 엔드투엔드 제어된 손상 데모로 ASAN에서 확인되었습니다.
EDK2의 Brotli 래퍼는 공격자가 제어하는 GUIDed 섹션 헤더에서 압축 해제된 출력 크기를
읽고, 아무런 가드 없이 UINT64 → UINT32로 잘라낸 뒤, 해당 크기의 버퍼를 할당하는 DXE
코어에 전달합니다. 그런 다음 BrotliDecompressInternal이 그 버퍼로 무제한으로
압축을 해제합니다 — Brotli 스트림이 끝날 때까지 계속 실행되며 할당된 범위를 넘어
씁니다.
결과: Secure Boot 검증이 완료되기 전인 DXE 단계에서의 힙 오버플로(쓰기 프리미티브). 펌웨어 이미지(플래시, 캡슐 또는 ESP)를 제어하는 공격자는 인접한 풀 객체 — 함수 포인터, 보안 플래그, 프로토콜 구조체 — 를 선택한 바이트로 덮어쓸 수 있습니다.
이것은 CVE-2021-28211의 간과된 Brotli 형제 격입니다(LZMA는 2021년에
>MAX_UINT32 가드를 받았지만, Brotli는 결코 받지 못했습니다). 변형 전수 조사 결과
Brotli는 잘림 가드와 출력 경계를 모두 갖추지 못한 EDK2의 유일한 압축
해제기임이 확인되었습니다.
| 파일 | 역할 |
|---|---|
BrotliDecompress.c:238 | UINT64 디코딩 크기를 UINT32로 캐스팅 — MAX_UINT32 가드 없음 |
BrotliDecompress.c:118–157 | 경계 검사 없이 대상 버퍼로 압축 해제 |
GuidedSectionExtraction.c | GetInfo를 호출한 뒤 Decompress 호출 — 선언된 크기를 신뢰 |
CoreSectionExtraction.c:1597 | 선언된 크기로 대상 버퍼 할당 |
모두 tianocore/edk2, MdeModulePkg/Library/BrotliCustomDecompressLib에 위치합니다.
| 산출물 | 설명 |
|---|---|
harness/edk2_brotli_overflow_poc.c | ASAN 개념 증명: 4096바이트 스트림을 64바이트 버퍼로 |
harness/asan_output.txt | ASAN 출력: BrotliDecompressInternal → memcpy에서 heap-buffer-overflow |
harness/edk2_brotli_overflow_demo.c | 엔드투엔드 데모: 인접 풀 객체의 제어된 손상 |
harness/demo_output.txt | 데모 출력: 함수 포인터 탈취, Secure Boot 비활성화 |
harness/lvfs_brotli_scan.py | LVFS 펌웨어 스캐너 (영향 범위 측정) |
harness/lvfs_scan_output.txt | 스캔 결과: 200개 펌웨어 이미지 중 0개가 Brotli 사용 |
evidence/ | HEAD 시점의 취약한 EDK2 소스 파일 사본 |
FINDINGS.md | 전체 분석 문서: 라인 참조, 선행 사례 검색, 변형 전수 조사, LZMA 감사 |
좁음. 두 개의 독립적인 조사에서 실제로 Brotli GUIDed 섹션을 사용하는 플랫폼이 전혀 없음을 확인했습니다:
BrotliCustomDecompressLib를 참조하는
플랫폼 DSC 파일이 0개. 모든 검색 결과는 MdeModulePkg.dsc 자체입니다.취약한 코드는 EDK2 트리에 포함되어 출하되지만 현재는 죽은 코드입니다 — 2017년에 추가되었으나 IBV나 OEM에 의해 채택된 적이 없습니다. 버그는 실제이며 원칙적으로 악용 가능합니다; Brotli 채택이 늘어나면 즉시 도달 가능해집니다.
LZMA와 Tiano가 이미 갖추고 있는 것과 일치하는 두 가지 변경:
MAX_UINT32 가드 추가 — BrotliUefiDecompressGetInfo
(BrotliDecompress.c:238)에서: CVE-2021-28211 이후 LzmaDecompress.c:149가
하는 것처럼 MAX_UINT32보다 큰 디코딩 크기를 거부.BrotliDecompressInternal에서: 기록된 바이트 수를 추적하고
Tiano 압축 해제기가 mOrigSize로 하는 것처럼 DestinationSize에서 중단.libbrotli와 GCC를 사용하여 Linux에서 PoC를 빌드:
# ASAN proof (aborts at the overflow)
gcc -fsanitize=address -g -O1 -o poc harness/edk2_brotli_overflow_poc.c \
-lbrotlienc -lbrotlidec
./poc
# Controlled-corruption demo (completes the overflow, shows the damage)
gcc -g -O1 -o demo harness/edk2_brotli_overflow_demo.c \
-lbrotlienc -lbrotlidec
./demo
완전한 공개 공개, 2026-10-26. TianoCore에는 조정된 공개 기간이 주어지지 않았다. 좁은 영향 범위(출하되는 펌웨어 중 영향받는 것 없음)와 형제 LZMA 버그가 2021년부터 공개되어 왔다는 사실이 이 결정에 영향을 주었다.