EDK2 自带的 Brotli 解压胶水代码(MdeModulePkg/Library/BrotliCustomDecompressLib)中存在一个堆缓冲区溢出,自 2017 年起就存在,截至 2026-10-25 在 HEAD 上仍未修复。已通过概念验证和端到端受控破坏演示经 ASAN 确认。
EDK2 的 Brotli 封装从攻击者控制的 GUIDed 节头中读取解压后输出大小,将其从 UINT64 截断为 UINT32 且没有任何防护,然后将其传递给 DXE 核心,由后者分配该大小的缓冲区。随后 BrotliDecompressInternal 向该缓冲区解压时不受限制——它会一直运行到 Brotli 流结束,从而写出分配范围之外。
结果: 在 DXE 阶段、Secure Boot 验证完成之前发生堆溢出(写原语)。控制固件镜像(flash、capsule 或 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 | 扫描结果:0/200 个固件镜像使用 Brotli |
evidence/ | HEAD 上存在漏洞的 EDK2 源文件副本 |
FINDINGS.md | 完整报告:行号引用、先前技术检索、变体扫描、LZMA 审计 |
狭窄。 两项独立调查发现,实践中没有任何平台使用 Brotli GUIDed 节:
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 所做的那样。在 Linux 上使用 libbrotli 和 GCC 构建 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 年起就已公开这一事实,促成了这一 决定。