
Результаты анализа безопасности EDK2 BrotliCustomDecompressLib — скоординированное раскрытие
Переполнение буфера кучи в собственном связующем коде распаковки Brotli в EDK2
(MdeModulePkg/Library/BrotliCustomDecompressLib), присутствует с 2017 года, не исправлено
в HEAD по состоянию на 2026-10-25. Подтверждено ASAN с proof-of-concept и
сквозной демонстрацией контролируемого повреждения памяти.
Обёртка Brotli в EDK2 считывает размер распакованного вывода из
заголовка GUIDed-секции, контролируемого атакующим, усекает его UINT64 → UINT32 без
проверки и передаёт в ядро DXE, которое выделяет буфер такого размера.
Затем BrotliDecompressInternal распаковывает данные в этот буфер без ограничений —
процесс идёт до конца потока Brotli, записывая за пределы выделенной памяти.
Результат: переполнение кучи (примитив записи) на этапе DXE, до завершения проверки Secure Boot. Атакующий, контролирующий образ прошивки (flash, capsule или ESP), может перезаписать соседние объекты пула — указатели на функции, флаги безопасности, структуры протоколов — выбранными байтами.
Это упущенный «собрат» Brotli для CVE-2021-28211 (LZMA получил
проверку >MAX_UINT32 в 2021 году; 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 | Proof-of-concept для ASAN: поток 4096 байт в буфер 64 байта |
harness/asan_output.txt | Вывод ASAN: heap-buffer-overflow в BrotliDecompressInternal → memcpy |
harness/edk2_brotli_overflow_demo.c | Сквозная демонстрация: контролируемое повреждение соседних объектов пула |
harness/demo_output.txt | Вывод демонстрации: перехват указателей на функции, отключение Secure Boot |
harness/lvfs_brotli_scan.py | Сканер прошивок LVFS (измерение масштаба поражения) |
harness/lvfs_scan_output.txt | Результаты сканирования: 0/200 образов прошивок используют Brotli |
evidence/ | Копии уязвимых исходных файлов EDK2 в HEAD |
FINDINGS.md | Полный отчёт: ссылки на строки, поиск prior-art, обзор вариантов, аудит LZMA |
Узкий. Два независимых исследования не нашли ни одной платформы, использующей GUIDed-секции Brotli на практике:
BrotliCustomDecompressLib. Все совпадения — сам MdeModulePkg.dsc.Уязвимый код поставляется в дереве EDK2, но сегодня это мёртвый код — добавлен в 2017 году, так и не был принят IBV или OEM. Ошибка реальна и в принципе эксплуатируема; если распространение Brotli возрастёт, она станет немедленно достижимой.
Два изменения, соответствующие тому, что уже есть в LZMA и Tiano:
MAX_UINT32 в BrotliUefiDecompressGetInfo
(BrotliDecompress.c:238): отклонять размеры распакованных данных > MAX_UINT32, как
это делает LzmaDecompress.c:149 начиная с CVE-2021-28211.BrotliDecompressInternal: отслеживать записанные байты и
останавливаться на DestinationSize, как это делает декомпрессор Tiano с mOrigSize.Соберите PoC в Linux с libbrotli и GCC:
# 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 года, легли в основу этого решения.