# थ्रेट मॉडल — CVE-2026-111497 (Brotli डिकोडर out-of-bounds write)

यह दस्तावेज़ परिभाषित करता है कि टूल किसे उजागर मानता है, किसे स्पष्ट रूप से कवर नहीं करता, और
वर्गीकरण की रेखा कहाँ और क्यों खींची गई है। स्क्रिप्ट जो भी निर्णय लौटाती हैं, उनकी व्याख्या के
लिए यही संदर्भ है।

## 1. भेद्यता

| गुण | मान |
|---|---|
| पहचानकर्ता | CVE-2026-111497 |
| घटक | Google Brotli, डिकोडर (`c/dec/decode.c`) |
| दुर्बलता | CWE-787, out-of-bounds write |
| भेद्य upstream रिलीज़ | 1.0.3 … 1.0.9, 1.1.0, 1.2.0 |
| फ़िक्स वाली upstream रिलीज़ | 1.0.10, 1.1.1, 1.2.1 (21 अक्टूबर 2026) |
| आक्रमण वेक्टर | डिकोडर को सौंपा गया तैयार किया हुआ Brotli स्ट्रीम |
| प्रमाणीकरण आवश्यक | नहीं |
| प्रभाव | प्रक्रिया crash, मेमोरी भ्रष्टाचार, कुछ कॉन्फ़िगरेशन में दूरस्थ कोड निष्पादन |
| गंभीरता | परियोजना द्वारा प्रकाशित CVSS 4.0 9.2; distribution trackers में CVSS 3.x पैमाने पर 8.5 |

दोषपूर्ण पथ ब्लॉक ट्रांज़िशन पर डिकोडर की state machine है: विकृत स्ट्रीम आंतरिक काउंटरों को
निर्धारित सीमा से आगे धकेल देती है, और डिकोडर अवैध स्ट्रीम की शीघ्र रिपोर्ट करने के बजाय
आवंटित आउटपुट बफ़र से आगे लिख देता है। upstream फ़िक्स लिखने से पहले अवैध स्ट्रीम का पता लगाकर
रिपोर्ट करता है।

## 2. क्या उजागर है और क्या नहीं

यही भेद अधिकांश निर्णय तय करता है:

- **एनकोडर** (nginx `ngx_brotli`, `mod_brotli`, static asset pipelines) उस डेटा को संपीडित करता
  है जो सर्वर ने स्वयं बनाया। वह हमलावर-नियंत्रित Brotli कभी पार्स नहीं करता। वह आक्रमण-सतह
  नहीं है, भले ही वह वही पैकेज लिंक करता हो।
- **डिकोडर** बाहर से डेटा लेता है और उसे पार्स करता है। वही आक्रमण-सतह है।

| पथ | कब उजागर | टिप्पणियाँ |
|---|---|---|
| HTTP अनुरोध निकाय | एप्लिकेशन या प्रॉक्सी `Content-Encoding: br` को डीकंप्रेस करता है | जहाँ मौजूद है, वहाँ सर्वाधिक प्रभाव वाला वेक्टर |
| आउटबाउंड HTTP क्लाइंट | libcurl जिसमें `CURLOPT_ENCODING` खाली है, Node `fetch`, Brotli के साथ Python `httpx`/`requests` | दुर्भावनापूर्ण या समझौता किया गया तृतीय पक्ष `br` में उत्तर देता है |
| प्रॉक्सी से गुजरने वाली प्रतिक्रिया श्रृंखला | Envoy/Istio HTTP विडीकंप्रेसर सक्षम | प्रॉक्सी ही डिकोडर बन जाता है |
| फ़ाइल अपलोड या आयात | एप्लिकेशन Brotli आर्काइव या स्ट्रीम डीकंप्रेस करता है | ऑडिट में प्रायः अनदेखा रह जाता है |
| बंडल किया गया रनटाइम | Node.js, Bun, .NET अनुरोध विडीकंप्रेशन | फ़िक्स रनटाइम के साथ आता है, `libbrotli1` के साथ नहीं |

## 3. वास्तविक फ़्लीट में libcurl क्यों प्रधान है

तीन प्रोडक्शन होस्ट पर मापा गया: पहुँचने योग्य वेक्टर कभी "वेब सर्वर को अनुरोध" नहीं था, क्योंकि
nginx और Apache Brotli का उपयोग केवल संपीडन के लिए करते थे और किसी ने अनुरोध निकाय डिकोड नहीं
किए। प्रमुख पथ **libcurl के माध्यम से आउटबाउंड HTTP** था, जहाँ तक PHP एप्लिकेशन कोड से पहुँचा
जाता था।

`CURLOPT_ENCODING` को खाली स्ट्रिंग पर सेट करने से libcurl वह हर encoding विज्ञापित और स्वीकार
करता है जिसके साथ वह बना है, `br` सहित। वह एक ही आर्ग्युमेंट यहाँ मिलता है:

- WordPress `wp-includes/Requests/src/Transport/Curl.php`;
- WordPress SimplePie `File.php`;
- प्लगइन्स के भीतर भेजी जाने वाली Guzzle handler factories;
- प्रत्यक्ष `wp_remote_*` ट्रैफ़िक, RSS फ़ेच और vendor API calls।

एक होस्ट पर सूची में `CURLOPT_ENCODING` या `CURLOPT_ACCEPT_ENCODING` रखने वाली 164 PHP फ़ाइलें
गिनी गईं। साझा होस्टिंग बॉक्स पर उजागरपन का वास्तविक माप वही संख्या है — केवल पैकेज की उपस्थिति
नहीं।

## 4. हमलावर मॉडल

| हमलावर की स्थिति | क्षमता | परिणाम |
|---|---|---|
| दूरस्थ, अप्रमाणित | तैयार Brotli निकाय भेजता है या तैयार `br` प्रतिक्रिया परोसता है | crash, मेमोरी भ्रष्टाचार, डिकोडिंग प्रक्रिया में संभावित कोड निष्पादन |
| तृतीय-पक्ष सामग्री प्रदाता | उस endpoint को नियंत्रित करता है जिसे सर्वर फ़ेच करता है | परिधि को छुए बिना libcurl डिकोड पथ तक पहुँच जाता है |
| स्थानीय, अपविशेषाधिकार प्राप्त | वह फ़ाइल देता है जिसे एप्लिकेशन डीकंप्रेस करता है | वही डिकोडर, कम प्रभाव |

टूल यह मानता है कि हमलावर बाइट्स चुन सकता है और प्रक्रिया नहीं चुन सकता: ऑडिट का लक्ष्य यह
सुनिश्चित करना है कि किसी भी पहुँचने योग्य प्रक्रिया में कोई भी पहुँचने योग्य डिकोडर न बचे।

## 5. डिटेक्शन रणनीति

पैकेज की उपस्थिति उजागरपन नहीं है। इसलिए डिटेक्टर चार स्वतंत्र तथ्य दर्ज करता है और वर्गीकरण
केवल तब करता है जब चारों ज्ञात हों:

1. संस्थापित संस्करण, जिससे epoch और distribution revision हटाकर upstream संख्या निकाली जाती है;
2. क्या पैकेजित changelog पहले से CVE का नाम लेता है (distribution backport लागू);
3. क्या apt candidate संस्थापित संस्करण से नया है (कोई समर्थित फ़िक्स मौजूद है);
4. कौन-सी चालू प्रक्रियाएँ `libbrotlidec` मैप करती हैं, और किस रनटाइम के माध्यम से।

कोई होस्ट `VULNERABLE` तभी है जब upstream संस्करण भेद्य सीमा में हो **और** कोई backport मौजूद
न हो। कोई होस्ट `SAFE` तब है जब इनमें से कोई एक शर्त विफल हो — उस स्थिति सहित जहाँ distribution
revision भेद्य दिखने वाला upstream अंक रखते हुए फ़िक्स लिए हुए है।

## 6. दायरे से बाहर

| क्षेत्र | कारण |
|---|---|
| स्थिर रूप से लिंक की गई प्रतिलिपियाँ | `dpkg` को अदृश्य; प्रति फ़ाइल बाइनरी स्कैनिंग चाहिए होगी |
| कंटेनर इमेज | registry-पक्ष स्कैनिंग चाहिए, होस्ट-पक्ष निरीक्षण नहीं |
| Envoy, Istio, .NET, Bun, Deno | अलग निवारण जीवनचक्र; प्रलेखित, स्वचालित नहीं |
| Windows और macOS होस्ट | टूल केवल bash और apt है |
| एप्लिकेशन-स्तरीय शमन | `Content-Encoding: br` अवरुद्ध करना ऑपरेटर द्वारा लगाया गया अस्थायी उपाय है, फ़िक्स नहीं |

## 7. निवारण के बाद अवशिष्ट जोखिम

1. डेस्कटॉप और इन्फ्रास्ट्रक्चर प्रक्रियाएँ अगले लॉगिन या रीबूट तक पुरानी लाइब्रेरी मैप किए
   रहती हैं। वे सर्वर डिकोड पथ नहीं हैं; डिटेक्टर उन्हें `deferred` के रूप में दर्ज करता है।
2. निवारण के **बाद** संस्थापित किसी पैकेज से शुरू हुई प्रक्रिया, लाइब्रेरी बदलने से पहले शुरू
   हुई हो तो पैच की गई लाइब्रेरी ही पाएगी — `remediate.sh` के भीतर का क्रम उलटी स्थिति को
   रोकता है।
3. जो एप्लिकेशन कोड अपनी Brotli प्रतिलिपि साथ रखता है (vendored स्रोत, static build), वह पैकेज
   अद्यतन से अप्रभावित रहता है और उसे अलग से फिर बनाना होगा।

प्रक्रिया के लिए [PLAYBOOK.hi.md](PLAYBOOK.hi.md) देखें और ये तीन तथ्य वास्तविक होस्ट्स पर कैसे
दिखे, इसके लिए [FIELD-REPORT.hi.md](FIELD-REPORT.hi.md)।
