
EDK2 BrotliCustomDecompressLib सुरक्षा निष्कर्ष — समन्वित प्रकटीकरण
EDK2 के अपने Brotli डीकंप्रेशन ग्लू (MdeModulePkg/Library/BrotliCustomDecompressLib) में एक हीप-बफ़र-ओवरफ़्लो, जो 2017 से मौजूद है, 2026-10-25 तक HEAD पर अनफ़िक्स्ड है। प्रूफ़-ऑफ़-कॉन्सेप्ट और एक एंड-टू-एंड नियंत्रित-करप्शन डेमो के साथ ASAN द्वारा पुष्टि की गई।
EDK2 का Brotli रैपर हमलावर-नियंत्रित GUIDed सेक्शन हेडर से डीकंप्रेस्ड आउटपुट आकार पढ़ता है, उसे बिना किसी गार्ड के UINT64 → UINT32 में ट्रंकेट करता है, और उसे DXE कोर को पास करता है जो उस आकार का बफ़र आवंटित करता है। इसके बाद BrotliDecompressInternal उस बफ़र में अनबाउंडेड डीकंप्रेस करता है — यह तब तक चलता है जब तक Brotli स्ट्रीम समाप्त नहीं हो जाती, आवंटन से आगे लिखते हुए।
परिणाम: DXE चरण में हीप ओवरफ़्लो (राइट प्रिमिटिव), Secure Boot सत्यापन पूरा होने से पहले। एक हमलावर जो फ़र्मवेयर इमेज (फ़्लैश, कैप्सूल, या 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 प्रूफ़-ऑफ़-कॉन्सेप्ट: 64-बाइट बफ़र में 4096-बाइट स्ट्रीम |
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 के साथ करता है।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 से सार्वजनिक रहा है, ने इस निर्णय को सूचित किया।