
CVE-2026-98432 के लिए केवल-प्रमाण PoC, एक Linux IPv4/TCP ireq_opt use-after-free: रेस ट्रिगर और heap-reuse oracle जो कोड निष्पादन के बिना UAF की पुष्टि करता है।
ireq_opt use-after-free PoCCVE-2026-98432 (CVSS 9.8) के लिए केवल-प्रमाण proof of concept: Linux IPv4/TCP स्टैक में दूरस्थ रूप से ट्रिगर होने वाला use-after-free।
केवल अधिकृत सुरक्षा परीक्षण के लिए। इसे उन सिस्टमों के विरुद्ध चलाएँ जिनके आप स्वामी हैं या जिनका परीक्षण करने की आपके पास स्पष्ट अनुमति है।
यह PoC उस रेस को ट्रिगर करता है और उसका पता लगाता है जब कर्नेल किसी मुक्त किए गए ip_options_rcu ऑब्जेक्ट से बाइट्स को SYN-ACK में कॉपी करता है। यह उपयोगकर्ता या फ़ाइलें नहीं बनाता, और यह कोड-एग्ज़िक्यूशन चेन लागू नहीं करता।
एक हिट का अर्थ है कि सर्वर ने अपने SYN-ACK में किसी अन्य एलोकेशन के मार्कर को लौटाया — एक सही कर्नेल ऐसा नहीं कर सकता। Ubuntu 24.04.5 पर कर्नेल 6.8.0-147-generic (Ubuntu द्वारा असुरक्षित सूचीबद्ध; फ़िक्स 6.8.0-149 में कतारबद्ध) के साथ एक नियंत्रित परीक्षण में, 180-सेकंड के लूपबैक रन ने 320,829 प्रयासों में 21 हिट उत्पन्न किए, और 300-सेकंड के रन ने 616,911 प्रयासों में 22 हिट उत्पन्न किए। कर्नेल साफ़ रहा (tainted=0, कोई oops नहीं)।
उस होस्ट से कोई पैकेट कैप्चर या लॉग यहाँ शामिल नहीं हैं; PoC का अपना आउटपुट ही साक्ष्य है।
IPv4 विकल्पों वाला एक SYN कर्नेल को रिक्वेस्ट सॉकेट के लिए एक ip_options_rcu (72 बाइट्स, kmalloc-96) बनाने पर मजबूर करता है। जब हैंडशेक पूरा होता है, तो tcp_v4_syn_recv_sock() उस ऑब्जेक्ट को बिना कॉपी किए चाइल्ड सॉकेट को सौंप देता है, फिर रिक्वेस्ट सॉकेट में पॉइंटर को साफ़ कर देता है। एक दूसरा CPU जो पहले ही रिक्वेस्ट सॉकेट को खोज चुका है, अभी भी tcp_check_req() → tcp_v4_send_synack() → ip_build_and_send_pkt() → ip_options_build() के अंदर हो सकता है, और उसी ऑब्जेक्ट को पढ़ रहा हो सकता है। चाइल्ड सॉकेट SOCK_RCU_FREE नहीं हैं, और inet_sock_destruct() inet_opt को एक साधारण kfree() से मुक्त करता है, इसलिए यदि उस विंडो में चाइल्ड को तोड़ दिया जाए तो रीडर मुक्त मेमोरी को डीरेफ़रेंस करता है।
रिक्वेस्ट-सॉकेट माइग्रेशन (net.ipv4.tcp_migrate_req=1 या एक BPF reuseport प्रोग्राम) के साथ एक दूसरा प्रकार भी मौजूद है; फ़िक्स inet_sock_destruct() और tcp_v4_reqsk_destructor() दोनों में kfree_rcu() का उपयोग करता है।
Linux 4.4 (079096f103fa) में पेश किया गया; mainline 7.3 में ठीक किया गया और 5.10.272, 5.15.223, 6.1.190, 6.6.159, 6.12.113, 6.18.56 और 7.2.10 में बैकपोर्ट किया गया। प्रभावित: Linux 4.4 और बाद के संस्करण, अनपैच्ड।
प्रभाव दूरस्थ क्रैश (DoS) से लेकर कर्नेल मेमोरी डिस्क्लोज़र और, एक पूर्ण एक्सप्लॉइट चेन के साथ, कोड एग्ज़िक्यूशन तक फैला है। यह रिपॉज़िटरी use-after-free को सिद्ध करने तक ही सीमित है।
प्रति प्रयास:
ireq_opt वाला रिक्वेस्ट सॉकेट; लक्ष्य अपने SYN-ACK में विकल्प को प्रतिध्वनित करता है।inet_opt विरासत में लेता है, रिक्वेस्ट सॉकेट अपना पॉइंटर छोड़ देता है।Oracle। प्रत्येक प्रयास विकल्प ऑफ़सेट 16..23 पर एक अद्वितीय 32-बिट मैजिक और एक चेक टैग एम्बेड करता है। उपयोगकर्ता-स्पेस रीडर के विकल्प देखने से पहले तीन रीराइट होते हैं:
| चरण | स्लॉट |
|---|---|
SYN पर सर्वर ip_options_compile() | 4..7 (TS) / 3..6 (RR) |
SYN-ACK के लिए सर्वर ip_options_build() | 8..11 (TS) / 7..10 (RR) |
SYN-ACK पर प्राप्तकर्ता होस्ट ip_options_compile() | 12..15 (TS) / 11..14 (RR) |
मार्कर इन तीनों से आगे रहता है। एक SYN-ACK जो किसी भिन्न एलोकेशन के मैजिक को प्रतिध्वनित करता है (tag == magic ^ 0x5a5a5a5a के साथ) यह सिद्ध करता है कि रीडर ने मुक्त-और-पुनःउपयोग किए गए ऑब्जेक्ट से कॉपी किया।
CAP_NET_RAW; स्वचालित RST फ़िल्टर के लिए CAP_NET_ADMIN (root) आवश्यक है।accept() करता हो।iptables/nftables।--proof एक ही होस्ट पर आत्म-निहित है: यह एक लूपबैक लिसनर शुरू करता है और उसके साथ रेस करता है।
python3 poc_cve_2026_98432.py --selftest
sudo python3 poc_cve_2026_98432.py --check
चल रहे कर्नेल, फ़िक्स्ड-रिलीज़ तालिका और प्रासंगिक sysctls को प्रिंट करता है।
sudo python3 poc_cve_2026_98432.py --proof 9000 \
--duration 180 --workers 6 --spray 2 --spray-rate 1000 \
--pcap /tmp/proof.pcap
127.0.0.1:9000 पर एक लिसनर शुरू करता है, रेस चलाता है, एक निर्णय प्रिंट करता है, लिसनर को रोकता है, और अस्थायी फ़ायरवॉल नियम को हटा देता है। होस्ट पर कुछ भी नहीं बनाया जाता — केवल क्षणिक TCP स्थिति।
sudo python3 poc_cve_2026_98432.py --probe <TARGET>:<PORT>
एक SYN: रिपोर्ट करता है कि लक्ष्य MPTCP लिसनर है या नहीं और क्या यह IPv4 विकल्प को प्रतिध्वनित करता है (जो oracle के लिए आवश्यक है)।
sudo python3 poc_cve_2026_98432.py <TARGET>:<PORT> \
--workers 16 --spray 4 --duration 600 --pcap hits.pcap
सार्वजनिक पतों को अस्वीकार कर दिया जाता है जब तक कि --allow-public न दिया गया हो। बेयर-RST
फ़िल्टर स्वचालित रूप से इंस्टॉल हो जाता है और बाहर निकलने पर हटा दिया जाता है।
python3 poc_cve_2026_98432.py --listen 9000 --mptcp
127.0.0.1 पर बाइंड होता है; केवल किसी रिमोट हमलावर होस्ट के लिए --listen-any जोड़ें। लिस्नर प्रत्येक कनेक्शन को स्वीकार करता है और तुरंत SO_LINGER(0) के साथ बंद कर देता है, जिससे चाइल्ड तेज़ी से मुक्त हो जाता है।
| फ़ील्ड | अर्थ |
|---|---|
attempts | शुरू किए गए हैंडशेक |
synacks | देखे गए SYN-ACK (प्रति प्रयास लगभग दो) |
hits | SYN-ACK में किसी अन्य एलोकेशन का मार्कर था → UAF की पुष्टि |
anomalies | मार्कर पार्स हुआ लेकिन टैग मेल नहीं खाया (आंशिक करप्शन) |
leaks | इको किए गए बाइट्स में कर्नेल-पॉइंटर जैसा दिखने वाला मान |
noopt | इको किए गए विकल्प के बिना SYN-ACK (syncookies/क्यू फुल/स्ट्रिपिंग) |
stale | देर से आया SYN-ACK रीट्रांसमिशन फ़िल्टर किया गया (हिट नहीं) |
malformed | ihl < 5 वाला SYN-ACK (स्टेल-optlen अंडरफ़्लो सिग्नेचर) |
timeouts | --timeout के भीतर कोई SYN-ACK नहीं |
spray | भेजे गए हीप-स्प्रे SYN |
नमूना हिट:
[!] UAF ORACLE HIT #1 at attempt sport=63042 (expected magic f815ca68 tag a24f9032)
tcp <TARGET>:9000 -> <CLIENT>:63042 seq=c20ed8ef ack=d212b2b1 flags=0x12
SYN-ACK echoed magic d4bcdcc7 tag 8ee6869d, belongs to another allocation
ip options:
44 28 11 00 03 71 b0 b5 03 71 cc 73 03 71 cc 73
d4 bc dc c7 8e e6 86 9d 00 00 00 00 00 00 00 00
0x8ee6869d == 0xd4bcdcc7 ^ 0x5a5a5a5a: टैग संबंध सिद्ध करता है कि प्रतिध्वनित
बाइट्स किसी भिन्न आवंटन से एक वैध मार्कर हैं।
एग्ज़िट कोड: 0 = साक्ष्य देखा गया, 3 = कोई नहीं, 2 = सेटअप त्रुटि,
1 = उपयोग/रनटाइम त्रुटि।
यह रेस संभाव्यात्मक है। परीक्षण होस्ट पर, कम से कम 3 मिनट के लिए --workers 6 --spray 2 --spray-rate 1000 ने इसे पुनरुत्पादित किया; उसी होस्ट पर
--workers 4 --spray 1 --spray-rate 500 के साथ 60-सेकंड के रन ने शून्य हिट उत्पन्न किए।
किसी छोटे रन से "असुरक्षित नहीं" का निष्कर्ष न निकालें।
--duration — अधिक प्रयास; प्रकाशित शोध में कई दसियों मिनट लगे।--workers — अधिक समवर्ती प्रयास (LAN पर 8–16)।--spray / --spray-rate — kmalloc-96 को लगातार बदलता रखता है ताकि मुक्त किए गए विकल्प
ऑब्जेक्ट पुनः उपयोग में आएं।--lead / --rst-delta / --jitter — माइक्रोसेकंड टाइमिंग स्वीप; 20/40/10 से शुरू करें और lead 0–40, delta 0–80 स्वीप करें।विकास के लिए एक डिस्पोज़ेबल VM अधिक सुरक्षित है। दो फ़िक्स लाइनों को वापस लाकर एक कमज़ोर 6.12.112 कर्नेल बनाएं: