
EDK2 BrotliCustomDecompressLib Sicherheitsbefunde — koordinierte Offenlegung
Ein Heap-Buffer-Overflow in EDK2s eigener Brotli-Dekomprimierungs-Anbindung
(MdeModulePkg/Library/BrotliCustomDecompressLib), vorhanden seit 2017, nicht behoben
am HEAD-Stand mit Datum 2026-10-25. ASAN-bestätigt mit einem Proof-of-Concept und einer
End-to-End-Demo zur kontrollierten Speichermanipulation.
EDK2s Brotli-Wrapper liest die dekomprimierte Ausgabegröße aus einem
angreiferkontrollierten GUIDed-Section-Header, kürzt sie von UINT64 auf UINT32 ohne
Prüfung und übergibt sie an den DXE-Kern, der einen Puffer dieser Größe allokiert.
BrotliDecompressInternal dekomprimiert dann unbegrenzt in diesen Puffer — es
läuft, bis der Brotli-Stream endet, und schreibt über die Allokation hinaus.
Ergebnis: Heap-Overflow (Schreibprimitive) in der DXE-Phase, bevor die Secure-Boot- Verifikation abgeschlossen ist. Ein Angreifer, der das Firmware-Image kontrolliert (Flash, Capsule oder ESP), kann benachbarte Pool-Objekte — Funktionszeiger, Sicherheitsflags, Protokollstrukturen — mit gewählten Bytes überschreiben.
Dies ist das übersehene Brotli-Gegenstück zu CVE-2021-28211 (LZMA erhielt 2021
eine >MAX_UINT32-Prüfung; Brotli nie). Ein Varianten-Sweep bestätigt, dass Brotli
der einzige EDK2-Dekompressor ist, dem sowohl die Truncation-Prüfung als auch eine
Ausgabegrenze fehlen.
| Datei | Funktion |
|---|---|
BrotliDecompress.c:238 | Castet die dekomprimierte Größe von UINT64 auf UINT32 — keine MAX_UINT32-Prüfung |
BrotliDecompress.c:118–157 | Dekomprimiert in den Zielpuffer ohne Grenzprüfung |
GuidedSectionExtraction.c | Ruft GetInfo und dann Decompress auf — vertraut der deklarierten Größe |
CoreSectionExtraction.c:1597 | Allokiert den Zielpuffer in der deklarierten Größe |
Alle in tianocore/edk2, MdeModulePkg/Library/BrotliCustomDecompressLib.
| Artefakt | Beschreibung |
|---|---|
harness/edk2_brotli_overflow_poc.c | ASAN-Proof-of-Concept: 4096-Byte-Stream in 64-Byte-Puffer |
harness/asan_output.txt | ASAN-Ausgabe: heap-buffer-overflow bei BrotliDecompressInternal → memcpy |
harness/edk2_brotli_overflow_demo.c | End-to-End-Demo: kontrollierte Korruption benachbarter Pool-Objekte |
harness/demo_output.txt | Demo-Ausgabe: Funktionszeiger gekapert, Secure Boot deaktiviert |
harness/lvfs_brotli_scan.py | LVFS-Firmware-Scanner (Messung des Schadenspotenzials) |
harness/lvfs_scan_output.txt | Scan-Ergebnisse: 0/200 Firmware-Images verwenden Brotli |
evidence/ | Kopien der verwundbaren EDK2-Quelldateien am HEAD-Stand |
FINDINGS.md | Vollständige Ausarbeitung: Zeilenreferenzen, Prior-Art-Suche, Varianten-Sweep, LZMA-Audit |
Gering. Zwei unabhängige Erhebungen fanden null Plattformen, die Brotli-GUIDed- Sections in der Praxis verwenden:
BrotliCustomDecompressLib. Jeder Treffer ist MdeModulePkg.dsc selbst.Der verwundbare Code wird im EDK2-Baum ausgeliefert, ist heute aber toter Code — 2017 hinzugefügt, nie von IBVs oder OEMs übernommen. Der Bug ist real und prinzipiell ausnutzbar; falls die Brotli-Verbreitung zunimmt, wird er sofort erreichbar.
Zwei Änderungen, entsprechend dem, was LZMA und Tiano bereits haben:
MAX_UINT32-Prüfung hinzufügen in BrotliUefiDecompressGetInfo
(BrotliDecompress.c:238): dekomprimierte Größen > MAX_UINT32 ablehnen, wie es
LzmaDecompress.c:149 seit CVE-2021-28211 tut.BrotliDecompressInternal: geschriebene Bytes
mitverfolgen und bei DestinationSize stoppen, wie es der Tiano-Dekompressor mit
mOrigSize tut.Das PoC unter Linux mit libbrotli und GCC bauen:
# 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
Vollständige öffentliche Offenlegung, 2026-10-26. TianoCore wurde keine koordinierte Offenlegungsfrist gewährt. Der begrenzte Auswirkungsbereich (keine ausgelieferte Firmware betroffen) und die Tatsache, dass der verwandte LZMA-Fehler seit 2021 öffentlich ist, begründeten diese Entscheidung.