
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 सर्वर के रूप में पहुँच सके।
┌──────────┐ ┌───────────┐ ┌──────────────────┐ ┌──────────┐
│ SETUP │ ──► │ TRIGGER │ ──► │ STATE INSPECT │ ──► │ VERDICT │
│ │ │ │ │ │ │ │
│ Start │ │ Send DNS │ │ SSH to DUT: │ │ PASS: │
│ malicious│ │ query to │ │ - pidof dnsmasq │ │ survived │
│ DNS srv │ │ DUT→DUT │ │ - PID changed? │ │ │
│ on WAN │ │ forwards │ │ - dmesg crash? │ │ FAIL: │
│ interface│ │ to us→we │ │ - /var/log/msg │ │ crashed/ │
│ (10.0.0. │ │ reply w/ │ │ │ │ hung │
│ 211:53) │ │ exploit │ │ Liveness query │ │ │
│ │ │ payload │ │ (version.bind) │ │ │
└──────────┘ └───────────┘ └──────────────────┘ └──────────┘
NOTE: Tool does NOT modify DUT settings. User must set DNS to 10.0.0.211 via GUI.
paramiko स्थापित के साथ Python 3.6+ (pip install paramiko)परीक्षण लैपटॉप को DUT से दो केबलों के साथ कनेक्ट करें:
| लैपटॉप पोर्ट | किससे कनेक्ट होता है | उद्देश्य |
|---|---|---|
| LAN पोर्ट | DUT LAN पोर्ट | SSH एक्सेस + DUT को DNS क्वेरी भेजना |
| WAN पोर्ट | DUT WAN सबनेट (जैसे, अपस्ट्रीम स्विच/मॉडेम पोर्ट) | अपस्ट्रीम DNS सर्वर के रूप में कार्य करना |
कनेक्ट करने के बाद, अपने लैपटॉप के IP नोट करें:
# Find your IPs
ip addr show | grep "inet "
# Example output:
# inet 192.168.1.254/24 ... ← this is your LAN IP
# inet 10.0.0.211/24 ... ← this is your WAN IP (use this for --laptop)
http://192.168.1.1 या http://myrouter.local10.0.0.211)cd /path/to/dnsmasq-cve-2026/
# Run all 6 CVE tests:
sudo python3 dnsmasq_cve_verify.py --laptop <YOUR_WAN_IP> --dut <DUT_LAN_IP> --dut-pass <SSH_PASSWORD>
# Example:
sudo python3 dnsmasq_cve_verify.py --laptop 10.0.0.211 --dut 192.168.1.1 --dut-pass '12345Asdf@'
उपकरण निम्न कार्य करेगा:
परीक्षित सभी Linksys राउटर अपने प्रोडक्शन बिल्ड कॉन्फ़िगरेशन में 6 CVE में से किसी के लिए भी व्यावहारिक रूप से शोषण योग्य नहीं हैं। खतरनाक सुविधाएँ (DNSSEC, dnsmasq-माध्यम DHCPv6) या तो संकलित नहीं हैं या कॉन्फ़िगर नहीं की गई हैं। गहराई-में-बचाव के रूप में पैच फिर भी अनुशंसित हैं।
फिक्स-पूर्व (dnsmasq 2.78, बिना-DNSSEC बिल्ड):
फिक्स-पूर्व (DNSSEC सक्षम के साथ dnsmasq 2.90):
फिक्स-पश्चात (dnsmasq 2.92rel2 या बैकपोर्ट पैच लागू): सभी 6 CVE → PASS
paramiko के साथ Python 3.6+ (pip install paramiko)test_dnsmasq_cve_remote.py)केवल हल्का संस्करण जाँच — यह निर्धारित करने के लिए version.bind क्वेरी करता है कि
dnsmasq संस्करण फिक्स से नीचे है या नहीं। कोई SSH नहीं, कोई सेटअप नहीं, कोई शोषण पेलोड नहीं।
python3 test_dnsmasq_cve_remote.py 192.168.1.1
test_dnsmasq_cve_on_device.sh)SSH/सीरियल के माध्यम से सीधे DUT पर चलती है। बाइनरी संस्करण और संकलन विकल्पों की जाँच करती है।
scp test_dnsmasq_cve_on_device.sh [email protected]:/tmp/
ssh [email protected] "sh /tmp/test_dnsmasq_cve_on_device.sh"
malicious_dns_server.py)मैनुअल परीक्षण के लिए स्टैंडअलोन शोषण सर्वर। इसे चलाएँ, DUT के अपस्ट्रीम DNS को इसकी ओर
इंगित करें, फिर crash-5172.evil.test, crash-2291.evil.test आदि के लिए क्वेरी ट्रिगर करें।
sudo python3 malicious_dns_server.py --port 53
# Then on DUT: configure upstream → this host
# Then trigger: dig @192.168.1.1 crash-5172.evil.test
पैच लागू करने और नया फ़र्मवेयर फ्लैश करने के बाद, पुनः चलाएँ:
sudo python3 dnsmasq_cve_verify.py --laptop <YOUR_WAN_IP> --dut <DUT_LAN_IP> --dut-pass <SSH_PASS>
# Expected: all 6 PASS
| समस्या | समाधान |
|---|
| "DUT हमें क्वेरी अग्रेषित नहीं कर रहा" | सत्यापित करें कि चरण 2 सही ढंग से किया गया था। जाँचें कि लैपटॉप WAN IP GUI में दर्ज किए गए IP से मेल खाता है। |
| "DUT से कनेक्ट नहीं हो सकता" | SSH क्रेडेंशियल्स सत्यापित करें। मैन्युअल रूप से प्रयास करें: ssh [email protected]। |
| "पोर्ट 53 बाइंड नहीं हो सकता" | sudo के साथ चलाएँ। या --dns-port 5353 उपयोग करें (मैनुअल DUT कॉन्फ़िगरेशन आवश्यक है)। |
| "Version: unknown" | DUT में dnsmasq मानक पथ पर नहीं हो सकता। उपकरण फिर भी सही ढंग से परीक्षण करता है। |
| CVE | परिणाम | कारण |
|---|
| CVE-2026-2291 | PASS | DNSSEC संकलित नहीं |
| CVE-2026-4890 | PASS | DNSSEC संकलित नहीं |
| CVE-2026-4891 | PASS | DNSSEC संकलित नहीं |
| CVE-2026-4892 | PASS | dnsmasq DHCPv6 सेवा नहीं दे रहा (पृथक DHCPv6 सर्वर उपयोग में) |
| CVE-2026-4893 | PASS | केवल तर्क बग — कोई क्रैश नहीं |
| CVE-2026-5172 | PASS | शोषण से बच गया (असुरक्षित कोड पथ 2.78 में नहीं है) |
| CVE | परिणाम | कारण |
|---|
| CVE-2026-2291 | PASS | DNSSEC संकलित नहीं |
| CVE-2026-4890 | PASS | DNSSEC संकलित नहीं |
| CVE-2026-4891 | PASS | DNSSEC संकलित नहीं |
| CVE-2026-4892 | PASS | DHCPv6 संकलित नहीं |
| CVE-2026-4893 | PASS | केवल तर्क बग — कोई क्रैश नहीं |
| CVE-2026-5172 | PASS | शोषण वेरिएंट से बच गया |
| CVE | परिणाम | कारण |
|---|
| CVE-2026-2291 | PASS | DNSSEC संकलित नहीं — शोषण योग्य नहीं |
| CVE-2026-4890 | PASS | DNSSEC संकलित नहीं — शोषण योग्य नहीं |
| CVE-2026-4891 | PASS | DNSSEC संकलित नहीं — शोषण योग्य नहीं |
| CVE-2026-4892 | PASS/FAIL | DHCPv6 संकलित + dhcp-script सक्रिय |
| CVE-2026-4893 | PASS | तर्क बग — कोई क्रैश नहीं (केवल संस्करण-आधारित) |
| CVE-2026-5172 | PASS | blockdata_expand पथ 2.78 में नहीं है |
| CVE | परिणाम | कारण |
|---|
| CVE-2026-2291 | FAIL | एस्केप किए गए नामों से हीप ओवरफ्लो |
| CVE-2026-4890 | FAIL | इनफिनिट लूप (हैंग) |
| CVE-2026-4891 | FAIL | RRSIG OOB रीड क्रैश |
| CVE-2026-4892 | PASS/FAIL | DHCPv6 + स्क्रिप्ट कॉन्फ़िग पर निर्भर |
| CVE-2026-4893 | PASS | तर्क बग — कोई क्रैश नहीं |
| CVE-2026-5172 | FAIL | फ़र्ज़ी rdlen से OOB रीड |
| फ़्लैग | डिफ़ॉल्ट | विवरण |
|---|
--laptop | (आवश्यक) | लैपटॉप का WAN IP (यहाँ दुर्भावनापूर्ण DNS सर्वर बाइंड करता है) |
--dut | 192.168.1.1 | DUT का LAN IP (SSH + DNS क्वेरी यहाँ भेजी जाती हैं) |
--dut-user | root | DUT SSH उपयोगकर्ता नाम |
--dut-pass | (पूछा जाता है) | DUT SSH पासवर्ड |
--dns-port | 53 | दुर्भावनापूर्ण DNS सर्वर के लिए पोर्ट |
--cve | सभी 6 | परीक्षण हेतु विशिष्ट CVE (दोहराने योग्य) |
| उपकरण | Python | Root | SSH | नेटवर्क |
|---|
dnsmasq_cve_verify.py | 3.6+ paramiko | हाँ (पोर्ट 53) | हाँ (रीड-ओनली) | DUT के लिए LAN + WAN |
test_dnsmasq_cve_remote.py | 3.6+ stdlib | नहीं | नहीं | DUT के लिए UDP 53 |
test_dnsmasq_cve_on_device.sh | N/A (शेल) | नहीं | DUT पर चलाएँ | N/A |
malicious_dns_server.py | 3.6+ stdlib | हाँ (पोर्ट 53) | नहीं | DUT हमें अग्रेषित करता है |