
CVE-2026-111497 के लिए एडवाइज़री और विश्लेषण, जो Node.js HTTP डीकंप्रेशन के माध्यम से पहुँचने योग्य एक Brotli डिकोडर आउट-ऑफ़-बाउंड्स राइट है, जिसमें मूल कारण, पैच डिफ़, डिटेक्शन नियम और शमन उपाय शामिल हैं।
अंतिम सत्यापन तिथि: 2026-11-04 (KST)। प्रत्येक मान केवल नीचे References में दिए गए स्रोतों से सत्यापित मानों के रूप में दर्ज किया गया है, और जहाँ स्रोतों के बीच मान भिन्न हैं वहाँ सभी को साथ में दिया गया है।
c/dec/decode.c) गलत ब्लॉक स्विच (block switch) के त्रुटि रिटर्न मान को अनदेखा करता है, जिससे दूषित स्थिति में डिकोडिंग जारी रहती है और बफ़र सीमा के बाहर लेखन (Out-of-Bounds Write) होता है।Brotli/brotlicffi, Bun, .NET, Envoy, Istio आदि। प्रभावित होने के लिए ऐसा पथ होना आवश्यक है जो हमलावर-नियंत्रित Content-Encoding: br डेटा को डीकंप्रेस (decompress) करता हो।| आइटम | विवरण |
|---|---|
| CVE ID | CVE-2026-111497 (GHSA-9v8h-qqgm-4m35) |
| उपनाम | Node2Shell (Imperva द्वारा नामित), HTTP2Shell, Broccoli2Shell। नाम के विपरीत यह HTTP/2 प्रोटोकॉल दोष नहीं है |
| प्रकाशन तिथि | 2026-10-21 Node.js सुरक्षा रिलीज़ और Brotli पैच रिलीज़ / 2026-10-22 CVE रिकॉर्ड सार्वजनिक |
| खोजकर्ता | OpenAI Codex Security (Khai Tran, Sylvie Mayer) |
| प्रभावित उत्पाद/संस्करण | Google Brotli (libbrotlidec) 1.0.3 ~ 1.2.0 और इसे बंडल/लिंक करने वाले उत्पाद (नीचे तालिका देखें) |
| पैच संस्करण | Brotli 1.0.10 / 1.1.1 / 1.2.1, Node.js 22.23.4 / 24.22.1 / 26.12.1, Python Brotli 1.2.1, brotlicffi 1.2.1.0, Bun 1.4.4 |
| CVSS v4.0 (CNA: Google) | 9.2 Critical — CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N |
| CVSS v3.1 (NVD) | 9.8 Critical — CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CVSS v3.1 (Red Hat / Amazon Linux) | 8.1 — CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H (हमले की आवश्यकता AT:P और प्लेटफ़ॉर्म हार्डनिंग को प्रतिबिंबित करता है) |
| विक्रेता का स्वयं का ग्रेड | Node.js: High / Red Hat: Important |
| CWE | CWE-787 Out-of-bounds Write (NVD, Red Hat, कनाडा Cyber Centre) / CWE-252 Unchecked Return Value (CISA KEV विवरण, कुछ विश्लेषण लेखों में मूल कारण के रूप में साथ में उल्लिखित) |
| वास्तविक शोषण स्थिति | शोषण की पुष्टि। CISA KEV सूचीबद्ध 2026-10-27, संघीय एजेंसियों के लिए कार्रवाई की समय-सीमा 2026-11-10। हनीपॉट ऑपरेटरों (Previdian, ELLIO) ने 10-26~27 के दौरान शोषण के प्रयास देखे |
| घटक | प्रभावित संस्करण | सुधारित संस्करण |
|---|---|---|
| Google Brotli (C, libbrotlidec) | 1.0.3 ~ 1.2.0 | 1.0.10, 1.1.1, 1.2.1 |
| Node.js 26.x (Current) | 26.12.1 से कम | 26.12.1 |
| Node.js 24.x (LTS) | 24.22.1 से कम | 24.22.1 |
| Node.js 22.x (LTS) | 22.23.4 से कम | 22.23.4 |
| Node.js 25.x / 23.x / 20.x और उससे नीचे | सभी संस्करण (EOL) | कोई पैच नहीं → 22/24/26 पर स्थानांतरित करें |
| Bun | 1.4.3 और उससे नीचे | 1.4.4 |
Python Brotli (PyPI) | 1.2.0 और उससे नीचे | 1.2.1 |
Python brotlicffi | 1.2.1.0 से कम | 1.2.1.0 |
| .NET / PowerShell | विक्रेता सलाह देखें | Microsoft आपातकालीन .NET अपडेट (dotnet/announcements#494) |
| Envoy / Istio | विक्रेता सलाह देखें | अक्टूबर की शुरुआत में सुधारित रिलीज़ वितरित (दोष का उल्लेख किए बिना) |
| VMware SDDC Manager (VCF / vSphere Foundation) | Broadcom सलाह देखें | Broadcom सलाह देखें |
अप्रत्यक्ष एक्सपोज़र पथ: Python requests, urllib3, aiohttp[speedups], httpx यदि Brotli/brotlicffi स्थापित है तो br प्रतिक्रियाओं को स्वचालित रूप से डीकंप्रेस करते हैं। curl भी संपीड़न-विस्तार विकल्प का उपयोग करने पर इसी श्रेणी में आता है।
| तारीख | घटना |
|---|---|
| 02-27 | google/brotli रिपॉज़िटरी में सुधार कमिट शामिल (सुरक्षा मुद्दे के रूप में चिह्नित, जारी नहीं) |
| अक्टूबर की शुरुआत | Envoy / Istio सुधारित रिलीज़ जारी |
| 10-21 | Node.js सुरक्षा रिलीज़ (22.23.4 / 24.22.1 / 26.12.1), Google Brotli 1.0.10 / 1.1.1 / 1.2.1 रिलीज़ |
| 10-22 | CVE रिकॉर्ड सार्वजनिक, Imperva ने Node.js 24.22.0 (Linux arm64) पर कोड निष्पादन प्रदर्शित किया |
| 10-23 | पैच किया गया PyPI पैकेज वितरित |
| 10-25 | Microsoft .NET सलाह और अपडेट |
| 10-26 | ELLIO, शोषण ट्रैफ़िक की रिपोर्ट |
| 10-27 | CISA KEV में सूचीबद्ध (कार्रवाई की समय सीमा 11-10) |
⚠️ 24~28 अक्टूबर के बीच लिखे गए कुछ विश्लेषण लेखों में "वास्तविक हमला अप्रमाणित, KEV में सूचीबद्ध नहीं" कहा गया है, लेकिन यह KEV में सूचीबद्ध होने से पहले के समय के आधार पर है, इसलिए वर्तमान से भिन्न है।
BROTLI_FALSE रिटर्न मानBrotli डिकोडिंग एक स्टेट मशीन है। स्ट्रीम मेटाब्लॉक इकाइयों से बनी होती है, और प्रत्येक मेटाब्लॉक के भीतर लिटरल, इंसर्ट-एंड-कॉपी कमांड और दूरी के ब्लॉक टाइप को स्विच करने वाले निर्देश आते हैं।
DecodeBlockTypeAndLength() ब्लॉक स्विच को पार्स करता है और BROTLI_BOOL लौटाता है। समस्या यह है कि BROTLI_FALSE का उपयोग दो पूरी तरह भिन्न अर्थों में किया गया था।
| अर्थ | प्रकृति | सही प्रबंधन |
|---|---|---|
| इनपुट और चाहिए (needs more input) | पुनर्प्राप्त करने योग्य | अगले इनपुट की प्रतीक्षा करके फिर से शुरू करें |
| मेटाब्लॉक में केवल 1 ब्लॉक प्रकार होने के कारण स्विच ही असंभव | घातक प्रारूप त्रुटि | स्ट्रीम अस्वीकार करें |
कॉलर पक्ष ने इस रिटर्न मान की जाँच नहीं की।
DecodeCommandBlockSwitch) को static void के रूप में घोषित किया गया है, इसलिए यह रिटर्न मान को संरक्षित नहीं करता, और BROTLI_SAFE मैक्रो की non-safe शाखा भी केवल फ़ंक्शन को कॉल करती है और परिणाम को छोड़ देती है। (SonicWall विश्लेषण)DecodeLiteralBlockSwitch) में रिटर्न मान पूरी तरह से छोड़ दिया जाता है। विश्लेषण के अनुसार इंगित किया गया फ़ंक्शन भिन्न है, लेकिन वितरण पैच विवरण (TuxCare) के अनुसार लिटरल, कमांड, और दूरी तीनों ब्लॉक स्विच डिकोडर को त्रुटि कोड लौटाने के लिए संशोधित किया गया, इसलिए तीनों पथ संबंधित माने जा सकते हैं।परिणामस्वरूप, प्रारूप त्रुटि होने पर भी डिकोडर स्विच सफल होने की तरह आगे बढ़ता रहता है, ब्लॉक लंबाई काउंटर 0 रह जाता है, और स्थिति (position)·दूरी स्थिति उस पथ पर स्थानांतरित हो जाती है जिसे अस्वीकार किया जाना चाहिए था।
BrotliDecoderState) के स्थिति·दूरी फ़ील्ड अधिलेखित हो जाते हैं।ProcessCommandsInternal() का बैकवर्ड-रेफ़रेंस कॉपी copy_dst = &s->ringbuffer[pos] से गंतव्य की गणना करता है और memmove16 से 16-बाइट वेक्टर स्टोर करता है। चूँकि pos अब रिंग बफ़र सीमा तक सीमित नहीं है, आवंटित क्षेत्र के बाहर लिखना होता है।pos को नियंत्रित कर सकता है, इसलिए यह write-what-where प्रिमिटिव (primitive) बन जाता है।नीचे सार्वजनिक विश्लेषण (SonicWall, Redfox, TuxCare पैच विवरण) के वर्णन के आधार पर परिवर्तन का सार पुनर्गठित करते हुए बनाया गया संकल्पनात्मक कोड है। यह वास्तविक कमिट का मूल कोड नहीं है, और शर्तों आदि के विवरण अनुमान हैं। सटीक diff को google/brotli v1.2.1 रिलीज़ और Node.js
deps/brotliपरिवर्तनों में देखें। (इस दस्तावेज़ के लेखन के समय सुधार कमिट हैश को प्राथमिक स्रोत के रूप में सत्यापित नहीं किया जा सका।)
Before (भेद्य)
/* 형식 오류와 "입력 부족"이 같은 BROTLI_FALSE로 표현됨 */
static BROTLI_BOOL DecodeBlockTypeAndLength(int safe, BrotliDecoderState* s, int tree_type) {
...
if (/* 블록 타입이 1개뿐인 메타블록 */) {
return BROTLI_FALSE; /* 치명적 오류지만 복구 가능 신호와 구분 불가 */
}
...
return BROTLI_TRUE;
}