
6 dnsmasq CVE (CVE-2026-2291, 4890, 4891, 4892, 4893, 5172) हेतु स्वचालित दोष सत्यापन उपकरण
6 dnsmasq कमजोरियों (मई 2026) के सत्यापन के लिए स्वचालित ब्लैक-बॉक्स उपकरण। लाइव DUT को आक्रमण पैकेट भेजता है और PASS/FAIL रिपोर्ट करता है — स्रोत कोड एक्सेस की आवश्यकता नहीं है।
# Set DUT DNS to your laptop's WAN IP via GUI first, then:
sudo python3 dnsmasq_cve_verify.py --laptop <YOUR_WAN_IP> --dut <DUT_LAN_IP> --dut-pass <SSH_PASS>
# Example:
sudo python3 dnsmasq_cve_verify.py --laptop 10.0.0.211 --dut 192.168.1.1 --dut-pass '12345Asdf@'
| CVE | CVSS | प्रकार | आक्रमण वेक्टर | प्रभावित सुविधा |
|---|---|---|---|---|
| CVE-2026-2291 | 9.2 | हीप बफर ओवरफ्लो | रिमोट | extract_name() — हमेशा सक्रिय |
| CVE-2026-5172 | 7.5 | OOB रीड / क्रैश | रिमोट | extract_addresses() — हमेशा सक्रिय |
| CVE-2026-4890 | 7.5 | इनफिनिट लूप DoS | रिमोट | NSEC बिटमैप पार्सिंग (--dnssec) |
| CVE-2026-4891 | 5.3 | हीप OOB रीड | रिमोट | RRSIG सत्यापन (--dnssec) |
| CVE-2026-4892 | 8.4 | हीप ओवरफ्लो → रूट | लोकल/सन्निकट | DHCPv6 CLID (--dhcp-script + DHCPv6) |
| CVE-2026-4893 | 5.3 | सत्यापन बाइपास | रिमोट | ECS स्रोत जाँच (--add-subnet) |
मूल कारण: union bigname char name[MAXDNAME] घोषित करता है, लेकिन एस्केप किए गए वर्ण किसी नाम को 2*MAXDNAME+1 बाइट्स तक विस्तारित कर सकते हैं, जिससे हीप ओवरफ्लो होता है।
परीक्षण विधि: उच्च-बिट वर्णों (0x80+) वाले डोमेन नामों वाली DNS क्वेरी भेजता है, जो आंतरिक रूप से \DDD एस्केप होते हैं (प्रति इनपुट बाइट 4 बाइट्स)। यदि dnsmasq क्रैश हो जाता है या प्रतिक्रिया देना बंद कर देता है, तो यह असुरक्षित है।
पैच के बाद का व्यवहार: अत्यधिक बड़े नामों को सुगमता से अस्वीकार करता है (FORMERR/REFUSED) या बढ़ाए गए बफर का उपयोग करता है।
मूल कारण: फ़र्ज़ी rdlen फ़ील्ड extract_name() को पॉइंटर को रिकॉर्ड के अंत से आगे बढ़ाने देता है। शेष-बाइट्स अंडरफ़्लो एक विशाल मान उत्पन्न करता है → बड़े पैमाने पर OOB रीड → क्रैश।
परीक्षण विधि: ऐसे CNAME रिकॉर्ड वाली DNS प्रतिक्रियाएँ भेजता है जहाँ rdlen वास्तविक एन्कोडेड नाम से छोटा होता है। यदि dnsmasq क्रैश होता है, तो यह असुरक्षित है।
पैच के बाद का व्यवहार: सत्यापित करता है कि extract_name() के बाद पॉइंटर घोषित rdlen सीमा के भीतर रहता है।
मूल कारण: NSEC टाइप बिटमैप पार्सिंग p[1]+2 के बजाय p[1] से आगे बढ़ती है (विंडो हेडर आकार गायब है)। bitmap_length=0 के साथ, पॉइंटर कभी आगे नहीं बढ़ता → इनफिनिट लूप।
परीक्षण विधि: window=0, bitmap_length=0 के साथ एक क्राफ्टेड NSEC रिकॉर्ड भेजता है। यदि dnsmasq सभी क्वेरी का उत्तर देना बंद कर देता है (हैंग हो जाता है, क्रैश नहीं), तो यह असुरक्षित है। RRSIG सत्यापन से पहले शोषण योग्य।
पैच के बाद का व्यवहार: p[1]+2 से आगे बढ़ता है और शून्य-लंबाई वाले बिटमैप को छोड़ देता है।
मूल कारण: RRSIG में rdlen को न्यूनतम आकार (18 + साइनर नाम) के विरुद्ध सत्यापित नहीं किया जाता। गणना की गई हस्ताक्षर लंबाई ऋणात्मक अंडरफ़्लो उत्पन्न करती है → विशाल मान के रूप में मानी जाती है → OOB रीड।
परीक्षण विधि: rdlen=10 वाले RRSIG रिकॉर्ड भेजता है (न्यूनतम 31+ बाइट्स से काफी नीचे)। क्रैश = असुरक्षित।
पैच के बाद का व्यवहार: हस्ताक्षर लंबाई की गणना करने से पहले rdlen >= fixed_fields + signer_name_length सत्यापित करता है।
मूल कारण: DHCPv6 CLID (अधिकतम 65535 बाइट्स) sprintf("%.2x") के माध्यम से daemon->packet (5131 बाइट्स) में हेक्स-एन्कोडेड होते हैं। 3000-बाइट CLID → 6000-बाइट हेक्स स्ट्रिंग → ओवरफ्लो। हेल्पर प्रक्रिया रूट के रूप में चलती है।
परीक्षण विधि: 3000-बाइट क्लाइंट आइडेंटिफ़ायर के साथ DHCPv6 SOLICIT भेजता है। IPv6 सन्निकटता और --dhcp-script कॉन्फ़िगर होना आवश्यक है। हेल्पर क्रैश = असुरक्षित।
पैच के बाद का व्यवहार: हेक्स एन्कोडिंग से पहले CLID लंबाई को ट्रंकेट करता है या सत्यापित करता है।
नोट: कुछ बिल्ड -DNO_DHCP6 के साथ संकलित होते हैं और इस CVE से प्रभावित नहीं होते हैं।
मूल कारण: process_reply() पूर्ण पैकेट लंबाई के बजाय OPT रिकॉर्ड लंबाई (~23 बाइट्स) check_source() को पास करता है। सभी सीमा जाँचें विफल हो जाती हैं → फ़ंक्शन हमेशा 1 (मान्य) लौटाता है।
परीक्षण विधि: स्पूफ किए गए स्रोत उपसर्गों वाले EDNS क्लाइंट सबनेट विकल्प के साथ DNS क्वेरी भेजता है। यदि dnsmasq बिना सत्यापन के ECS को वापस भेज देता है, तो यह असुरक्षित है।
पैच के बाद का व्यवहार: पूर्ण पैकेट लंबाई check_source() को पास करता है, जिससे RFC 7871 धारा 9.2 के अनुसार उचित सीमा जाँचें सक्षम होती हैं।
dnsmasq 2.92rel2 में अपग्रेड करें (अनुशंसित)
dnsmasq_cve_verify.py)प्राथमिक QA उपकरण। परीक्षण लैपटॉप पर चलता है, DUT को आक्रमण पैकेट भेजता है, और प्रत्येक CVE के लिए स्पष्ट PASS/FAIL रिपोर्ट करता है। स्थिति निरीक्षण के लिए केवल रीड-ओनली SSH एक्सेस के अलावा DUT में किसी संशोधन की आवश्यकता नहीं है।
┌─────────────────────────────────────────────────────────────────────┐
│ Testing Laptop │
│ │
│ LAN interface WAN interface │
│ <LAPTOP_LAN_IP> <LAPTOP_WAN_IP> │
│ │ │ │
│ │ ┌────┴──────────────┐ │
│ │ │ Malicious DNS │ │
│ │ │ Server (port 53) │ │
│ │ └────┬──────────────┘ │
│ │ │ │
└────────┼───────────────────────────────┼────────────────────────────┘
│ LAN subnet │ WAN subnet
│ │
┌────────┼───────────────────────────────┼────────────────────────────┐
│ │ │ │
│ LAN: <DUT_LAN_IP> WAN: <DUT_WAN_IP> │
│ (LAN gateway) (WAN uplink) │
│ │
│ DUT (Linksys Router) │
│ dnsmasq (any version < 2.92rel2) │
│ │
│ resolv-file=/etc/resolv.conf │
│ → nameserver <LAPTOP_WAN_IP> ← set via GUI, forwards to us │
│ │
└─────────────────────────────────────────────────────────────────────┘
Data flow:
1. Tool sends DNS query to DUT LAN IP (port 53)
2. DUT's dnsmasq can't resolve locally → forwards upstream to LAPTOP_WAN_IP
3. Our malicious server on WAN interface replies with exploit payload
4. DUT's dnsmasq processes the malicious response → crash/hang/survive
5. Tool checks DUT state via SSH (read-only)
उदाहरण सेटअप (आपके IP अलग होंगे):
| भूमिका | IP (उदाहरण) |
|---|---|
| लैपटॉप LAN | 192.168.1.254 |
| लैपटॉप WAN | 10.0.0.211 |
| DUT LAN | 192.168.1.1 |
| DUT WAN | 10.0.0.214 |
मुख्य आवश्यकता: लैपटॉप WAN IP और DUT WAN IP एक ही सबनेट पर होने चाहिए, ताकि DUT लैपटॉप को अपस्ट्रीम DNS सर्वर के रूप में पहुँच सके।