# प्लेबुक — CVE-2026-111497 का निवारण

वह प्रक्रिया जिसे स्क्रिप्ट लागू करती हैं, इस तरह लिखी गई है कि मानव ऑडिटर हर चरण दोबारा कर
सके, जाँच सके या उसे ओवरराइड कर सके। प्रत्येक चरण अपना प्रमाण नाम लेकर बताता है: वह कमांड जिसका
आउटपुट निर्णय को उचित ठहराता है।

## चरण 0 — परिधि की सूची

तय करें कि कौन-से होस्ट दायरे में हैं और कुंजी के माध्यम से root पहुँच की पुष्टि करें।

```bash
for h in <host-alias-1> <host-alias-2>; do
  ssh "$h" 'grep PRETTY_NAME /etc/os-release; dpkg -l libbrotli1 2>/dev/null | tail -1'
done
```

स्वीकृति: प्रत्येक होस्ट OS का नाम और या तो पैकेज की पंक्ति या कुछ भी नहीं, लौटाता है।

## चरण 1 — डिटेक्शन (केवल-पठन)

`detect.sh` सिस्टम को बदले बिना यह एकत्र करती है:

1. होस्ट की पहचान और OS।
2. `libbrotli1` का संस्करण और भेद्य रिलीज़ matrix में उसका वर्गीकरण।
3. क्या distribution backport पहले से लागू है (changelog में CVE का नाम)।
4. `apt-get update` के बाद `-security` से apt candidate।
5. `/proc/*/maps` से `libbrotlidec` के जीवित उपभोक्ता।
6. डिकोड सतह: libcurl, Node, Python, PHP, `ngx_brotli`, `mod_brotli`।
7. वास्तविक `.so` फ़ाइलों का inode स्नैपशॉट, बाद की stale-mapping तुलना के लिए।

निर्णय: `SAFE` (0), `VULNERABLE` (1), `NOT_INSTALLED` (3), `ERROR` (10)।

स्वीकृति: `state.before` मौजूद है और उसमें `installed`, `candidate` तथा तीनों inodes हैं।

## चरण 2 — निवारण

`remediate.sh` कठोर क्रम में चलती है और पहले विफल invariant पर रुक जाती है:

1. **बैकअप** — पुराना `.deb`, वर्तमान `.so`, `dpkg -l` स्नैपशॉट
   `/root/cve-2026-111497-fix-<timestamp>/` में।
2. **Authenticity gate** — candidate डाउनलोड करें और उसके पैकेजित changelog में
   `CVE-2026-111497` अनिवार्य रूप से हो। केवल नया दिखने वाला candidate अस्वीकार होता है।
3. **Dry run** — `apt-get install --only-upgrade --dry-run`; अपेक्षित सेट ठीक Brotli पैकेज हैं
   और कुछ नहीं।
4. **संस्थापन** — `libbrotli1`, और `libbrotli-dev` यदि वह पहले संस्थापित था।
5. **उपभोक्ता का पुनः-प्रारंभ** — वह हर systemd unit जिसकी प्रक्रियाएँ `libbrotlidec` मैप करती
   हैं, `/system.slice/` के अंतर्गत सबसे भीतरी unit तक हल किया जाता है ताकि template
   instances भी पकड़ में आएँ; transient scopes के रूप में शुरू किए गए panel daemons अपने
   नियंत्रण टूल के माध्यम से पुनः चालू होते हैं।
6. **Inode जाँच** — कोई भी सर्वर उपभोक्ता पैच-पूर्व inode मैप किए हुए नहीं रह सकता।

स्वीकृति: exit 0 और एक `REMEDIATED:` पंक्ति जो पुराना और नया संस्करण बताए।

## चरण 3 — सत्यापन

`verify.sh` पाँच तथ्यों की पुष्टि करती है:

1. पैकेज का संस्करण बदला।
2. संस्थापित changelog `CVE-2026-111497` का उल्लेख करता है।
3. कोई सर्वर प्रक्रिया पैच-पूर्व inode मैप नहीं करती।
4. `systemctl --failed` खाली है।
5. कार्यात्मक डिकोड round-trip सफल होता है (स्थानीय `br` endpoint या `brotli` CLI)।

स्वीकृति: `VERIFY: PASS`, exit 0।

## मैनुअल क्रॉस-चेक (स्क्रिप्ट से स्वतंत्र)

```bash
dpkg -l | grep -E 'brotli'
apt-cache policy libbrotli1
zgrep -i CVE-2026-111497 /usr/share/doc/libbrotli1/changelog.Debian.gz
# no process may map the pre-patch decoder:
grep -l libbrotlidec /proc/[0-9]*/maps 2>/dev/null | wc -l
```

## रोलबैक

```bash
dpkg -i /root/cve-2026-111497-fix-<timestamp>/deb/libbrotli1_*.deb
# then restart every service listed in phase 2, step 5
```

रोलबैक परिभाषा से ही भेद्य संस्करण लौटा देता है। इसका उपयोग केवल तब करें जब पैच किया गया पैकेज
किसी निर्भरता को तोड़ दे, और उस निर्णय को दर्ज अवश्य करें।

## अस्थायी शमन जब कोई backport मौजूद न हो

`Content-Encoding: br` लिए हुए अनुरोध (जैसे `gzip, br` जैसे मिश्रित मान सहित) रिवर्स प्रॉक्सी या
WAF पर, एप्लिकेशन तक पहुँचने से पहले अस्वीकार करें और `415 Unsupported Media Type` लौटाएँ। यह
अस्थायी उपाय है, अद्यतन का विकल्प नहीं: यह केवल आने वाले निकायों की रक्षा करता है और हर
आउटबाउंड libcurl फ़ेच को उजागर छोड़ देता है।

## क्लोज़र के मानदंड

- दोबारा चलाने पर `detect.sh` 0 लौटाती है, या निवारण के बाद `verify.sh` `VERIFY: PASS` लौटाती है।
- बैकअप निर्देशिका मौजूद और खाली नहीं है।
- होस्टेड साइटें अपने परिवर्तन-पूर्व स्टेटस के साथ उत्तर देती हैं।
- स्थगित डेस्कटॉप उपभोक्ता रिपोर्ट में दर्ज हैं, इस अपेक्षा के साथ कि वे अगले लॉगिन या रीबूट
  पर पैच की गई लाइब्रेरी पुनः लोड कर लेंगे।
