
IPv4 SYN, IP विकल्पों के साथ, प्रति रन एक लैब लक्ष्य, CVE-2026-98432 अनुसंधान के लिए। हेडर-ऑफ़सेट पार्सर, रिग्रेशन परीक्षण, और एक टूटे हुए ऑटो-एक्सप्लॉइटर का पोस्टमॉर्टम।
अक्टूबर 2026 में पैच किए गए Linux kernel IPv4 TCP use-after-free, CVE-2026-98432, के लिए एक single-target probe।
यह एक IPv4 SYN बनाता है जो IP options ले जाता है (डिफ़ॉल्ट रूप से 24 NOP bytes, जो IHL को 11 तक बढ़ाता है), इसे एक host पर भेजता है, और pattern matching के बजाय header offset द्वारा उत्तर पढ़ता है। packet logic offline भी चलता है: एक dry run crafted packet को प्रिंट और पुनः-पार्स करता है, hex analyzer captured traffic को पार्स करता है, और test suite को न तो root चाहिए और न ही network।
यहाँ कोई target list handling नहीं है, कोई Shodan integration नहीं है, और कोई batch mode नहीं है। प्रति run एक address, और CLI lab ranges के बाहर किसी भी चीज़ से इनकार कर देता है जब तक आप --allow-public पास न करें। यह tool मानता है कि target आपका है या आपके पास इसे test करने की लिखित अनुमति है।
python3 -m pip install -e ".[test]"
Python 3.9 या नया। केवल standard library।
Dry run, कोई privileges नहीं, कोई packet नहीं भेजा गया:
synipopt --dry-run --target 192.0.2.10
मूल script के log से packet पार्स करें, जिसे उसने SYN-ACK बताया था:
synipopt --analyze-hex "$(cat docs/fixtures/original-log-packet.hex)"
एक lab VM को probe करें और option-carrying SYNs की तुलना plain SYNs से करें:
sudo synipopt --target 192.168.56.101 --dport 443 --retries 3 --compare --log probe.jsonl
डिफ़ॉल्ट craft, wire पर 64 bytes:
0x01 NOP filleroptions ले जाने वाला SYN ही ireq->ireq_opt को request socket पर रखता है। kernel option block को compile करता है, और शुद्ध NOP filler एक खाली block में compile हो जाता है, इसलिए डिफ़ॉल्ट craft को मिलने वाला SYN-ACK बिना IP options के वापस आता है। payload ले जाने वाले options, उदाहरण के लिए record route, echo होते हैं। development के दौरान एक listening socket के विरुद्ध मापा गया:
| SYN options | SYN-ACK IP header | echoed options |
|---|---|---|
| 24 NOP bytes | 20 bytes (IHL 5) | कोई नहीं |
| Record Route, 12 bytes | 32 bytes (IHL 8) | 12 bytes |
| कोई नहीं | 20 bytes (IHL 5) | कोई नहीं |
दोनों तथ्य lab work के लिए मायने रखते हैं: reply की header length बताती है कि stack ने option block रखा या नहीं, और एक सही parser TCP header को IHL * 4 पर शुरू करता है, offset 20 पर नहीं।
इस repo के पीछे घूमने वाली script (cve_2026_98432_auto.zip) अपना run log साथ लेकर आई थी। उस log में हर "successful" SYN-ACK में reply_sport=257 और tcp_seq=16843009 है। ये NOP filler bytes हैं: 0x0101 यानी 257 और 0x01010101 यानी 16843009। parser ने packet में कहीं भी flag bits के लिए scan किया और offset 55 पर पहुँचा, जो option padding के अंदर है। उस 84-byte packet का सही parse IHL 5, protocol TCP, और एक TCP segment पाता है जिसका flags byte 0x00 है, न SYN और न ACK।
payload script का अपना crafted SYN है (offset 20 पर 0x4b)। बाहरी header kernel का है: script ने कभी IP_HDRINCL सेट नहीं किया, इसलिए Linux ने अपना IPv4 header बनाया और crafted packet को payload के रूप में लिया। जो कुछ उसने बनाया वह कभी packet के रूप में transmit नहीं हुआ। दो विफलताएँ एक साथ हुईं: packet कभी डिज़ाइन के अनुसार बाहर नहीं गया, और parser ने filler bytes को reply के रूप में पढ़ा।
dork stage बिना key के निष्क्रिय था। यह --shodan-key या SHODAN_KEY पढ़ता था; दोनों में से कोई न होने पर, यह 192.168.56.101 (एक VirtualBox host-only default) को targets.txt में लिखता और आगे बढ़ जाता। key के साथ यह public hosts के लिए Shodan query करता और उन पर fire करता, जिसकी किसी lab tool को आवश्यकता नहीं है और जिससे repos हटा दिए जाते हैं।
synipopt single-packet wire idea रखता है, targeting stage हटाता है, heuristic parser को header-offset parsing से बदलता है, और पुराने log मानों को tests/test_packet.py में एक regression test में बदल देता है।
CVE-2026-98432, Linux kernel IPv4 networking, use-after-free, Linux CNA से CVSS 3.1 9.8। Red Hat इसे Critical (RHSB-2026-016) आंकता है और RHEL 8, 9, 10, और OpenShift को प्रभावित उत्पादों में सूचीबद्ध करता है।
जैसा कि फिक्स कमिट में वर्णित है: tcp_v4_syn_recv_sock() ireq->ireq_opt को बिना कॉपी किए चाइल्ड सॉकेट (newinet->inet_opt) में स्थानांतरित करता है। कोई अन्य CPU उसी रिक्वेस्ट सॉकेट के लिए पुनःप्रेषित SYN को प्रोसेस कर सकता है और tcp_check_req() से SYN-ACK भेज सकता है। tcp_v4_send_synack() और inet_csk_route_req() ireq->ireq_opt को केवल rcu_read_lock() के अंतर्गत पढ़ते हैं, और फिर ip_build_and_send_pkt() और ip_options_build() opt->optlen को दो बार पढ़ते हैं। चूँकि रिक्वेस्ट सॉकेट लिसनर लॉक के बिना प्रोसेस होते हैं (कमिट 079096f103fa), SYN-ACK अभी बन ही रहा होता है तब चाइल्ड फ्री हो सकता है। चाइल्ड सॉकेट में SOCK_RCU_FREE नहीं होता, और inet_sock_destruct() ने inet_opt को सादे kfree() से फ्री किया था, इसलिए ip_options_build() मुक्त की गई मेमोरी पढ़ सकता था।
मेनलाइन फिक्स कमिट e3f33b0a1d89d738e2b913dab519226eaf76e15b है, "ipv4: free inet_opt and ireq_opt after an RCU grace period" (Eric Dumazet, 2026-10-05 को मर्ज किया गया)। यह inet_sock_destruct() और tcp_v4_reqsk_destructor() में kfree() को kfree_rcu() से बदल देता है। वही कमिट रिक्वेस्ट सॉकेट माइग्रेशन (net.ipv4.tcp_migrate_req=1 या कोई BPF reuseport प्रोग्राम) के माध्यम से एक दूसरे पथ का भी उल्लेख करता है, जहाँ inet_reqsk_clone() पुराने रिक्वेस्ट सॉकेट और उसके क्लोन के बीच ireq_opt साझा करता है।
Red Hat का अस्थायी शमन उन इनबाउंड IPv4 TCP पैकेट्स को गिरा देता है जिनमें IP विकल्प होते हैं:
table inet cve_2026_98432 {
chain input {
type filter hook input priority -310; policy accept;
ip protocol tcp ip hdrlength > 5 counter drop
}
}
--compare ठीक उसी फ़िल्टर की जाँच करता है: विकल्प-युक्त SYN अनुत्तरित रहते हैं जबकि सादे SYN को उत्तर मिलता है।
स्रोत:
वायर प्रोब मेमोरी करप्शन साबित नहीं कर सकते। वे जो दिखा सकते हैं: क्या कोई होस्ट IP विकल्प ले जाने वाले SYN का उत्तर देता है, क्या SYN-ACK उन विकल्पों को प्रतिध्वनित करता है, और क्या पथ में hdrlength फ़िल्टर मौजूद है।
uname -r जाँचें।tcpdump -ni eth0 'tcp and (ip[0] & 0x0f) > 5'sudo synipopt --target VM_IP --dport 22 --retries 5 --compare --log run.jsonlreply_kind उत्तर को वर्गीकृत करता है और tcp ब्लॉक पार्स किया गया हेडर रखता है। ip_options_len प्रतिध्वनि दिखाता है, जो पेलोड वाले विकल्प ब्लॉक्स (record route, timestamp) के लिए प्रकट होता है; शुद्ध NOP फ़िलर कंपाइल होकर हट जाता है और 20-बाइट हेडर के रूप में वापस आता है।dmesg पर नज़र रखें। वायर केवल पैकेट हैंडलिंग दिखाता है।उन होस्ट्स का परीक्षण करें जिनके आप स्वामी हैं या जिनके परीक्षण के लिए आप अधिकृत हैं। डिफ़ॉल्ट गार्ड RFC 1918, loopback, link-local, CGNAT, और दस्तावेज़ीकरण रेंजों के बाहर के पतों को अस्वीकार करता है। --allow-public उन होस्ट्स पर अधिकृत कार्यों के लिए मौजूद है जिन्हें आप नियंत्रित करते हैं। तीसरे पक्षों पर तैयार किए गए SYN दागना इस टूल का उद्देश्य नहीं है।
python3 -m pytest -q
यह सूट चेकसम गुणों, बिल्ड और पार्स राउंडट्रिप्स, विकल्प लंबाई सीमाओं, उत्तर वर्गीकरण (SYN-ACK, RST, ICMP, गलत फ़्लो), CLI गार्ड और ड्राई रन, और रिग्रेशन फ़िक्स्चर के रूप में मूल लॉग पैकेट को कवर करता है। CI Python 3.10 और 3.12 चलाता है।