
क्या आपका Linux होस्ट CVE-2026-98432 के प्रति उजागर है?
जाँचता है कि कोई Linux होस्ट CVE-2026-98432 के प्रति उजागर हो सकता है या नहीं, जो कर्नेल के IPv4 TCP हैंडशेक में use-after-free है। यह shouldipanic.ch का हिस्सा है।
IPv4 विकल्प (Record Route, Timestamp) ले जाने वाला एक SYN उस कोड तक पहुँचता है जो विकल्पों को पढ़ता है, जबकि वे पहले ही मुक्त हो चुके हो सकते हैं। कोई भी खुला IPv4 TCP पोर्ट पर्याप्त है, किसी लॉगिन की आवश्यकता नहीं। यह 4.4 (2016) से लेकर प्रत्येक ट्री के निश्चित रिलीज़ तक हर कर्नेल में मौजूद है: 5.10.272, 5.15.223, 6.1.190, 6.6.159, 6.12.113, 6.18.56, 7.2.10, 7.3। कर्नेल CNA इसे 9.8 अंक देता है; MPTCP लिसनर वाले सर्वरों के विरुद्ध एक कार्यशील रिमोट रूट एक्सप्लॉइट की सूचना मिली है (प्रकाशित नहीं)। यह फ़िक्स वायर पर अदृश्य है: एक फ़िक्स किया गया कर्नेल बिल्कुल वैसे ही उत्तर देता है जैसे कोई अनपैच्ड कर्नेल।
इससे यह तय होता है कि प्रत्येक मोड क्या बता सकता है:
--on-host मशीन पर ही चल रहे कर्नेल को पढ़ता है: उसका संस्करण, पैकेज चेंजलॉग और क्या कोई नया कर्नेल रीबूट की प्रतीक्षा में है।Server हेडर से Linux वितरण को पढ़ता है और दिखाता है कि उस वितरण ने अभी तक कोई फ़िक्स किया गया कर्नेल जारी किया है या नहीं। यह एक प्रबल संकेत है, कोई निर्णय नहीं: रिवर्स प्रॉक्सी के पीछे या किसी कंटेनर के अंदर कर्नेल किसी अन्य मशीन का होता है।kernel98scan दो रूपों में आता है:
kernel98scan.py: बिना किसी निर्भरता वाली एकल Python फ़ाइल। किसी होस्ट पर, --on-host वास्तविक निर्णय देता है; पतों की ओर इंगित करने पर यह IP रेंजों पर वितरण फ़िंगरप्रिंटिंग करता है, पोर्ट स्कैन और vhost डिस्कवरी के साथ।
curl -LO https://github.com/akaihigurashi/kernel98scan/releases/latest/download/kernel98scan.py
python3 kernel98scan.py --on-host # real verdict for THIS machine
Python 3.8 या नया, कुछ भी इंस्टॉल करने की आवश्यकता नहीं। उदाहरण:
python3 kernel98scan.py --on-host # read the running kernel
python3 kernel98scan.py 203.0.113.10 # outside: distribution + fix status
python3 kernel98scan.py 203.0.113.0/24 # a whole range from outside
python3 kernel98scan.py 203.0.113.10 --ip-options # + do IP-options packets get through?
python3 kernel98scan.py 203.0.113.10 -o out.csv # CSV output
python3 kernel98scan.py -h # all options
होस्ट पर (--on-host, exit code 2 / 1 / 0 / 3):
| स्थिति | अर्थ |
|---|---|
VULNERABLE | चल रहे kernel में कोई भी चीज़ fix नहीं दिखाती |
CHECK | एक fixed kernel इंस्टॉल है, लेकिन पुराना अभी भी चल रहा है: reboot करें |
FIXED | kernel changelog में CVE का नाम है, या एक सादा upstream kernel fixed संस्करण पर है |
Vendor kernels (Ubuntu, RHEL, Proxmox) पुराने संस्करण संख्याओं पर fixes backport करते हैं, इसलिए
उनके लिए केवल changelog मायने रखता है। यह यह भी दिखाता है कि MPTCP चालू है या नहीं (रिपोर्ट किया गया
exploit MPTCP listeners से होकर जाता है) और tcp_migrate_req।
बाहर से:
| स्थिति | अर्थ |
|---|---|
POSSIBLY VULNERABLE | banner एक Linux distribution दिखाता है: या तो इसका अभी तक कोई fixed kernel नहीं है (Ubuntu, RHEL और rebuilds आज) या इसका एक है, जिसे इंस्टॉल और boot करना होगा |
UNKNOWN | distribution दिखाई नहीं देता, या कोई proxy/CDN उत्तर देता है |
NOT LINUX | Server header किसी non-Linux host की ओर इंगित करता है |
VULNERABLE और PATCHED कभी भी बाहर से रिपोर्ट नहीं किए जाते। प्रति
distribution fix स्थिति check.py में एक तालिका है (FIX_STATUS, FIXED_TABLE),
जिसे प्रत्येक vendor release के साथ अद्यतन किया जाता है।
| विकल्प | यह क्या करता है |
|---|---|
--on-host | इस मशीन पर चल रहे kernel को पढ़ता है और वास्तविक निर्णय देता है |
--ip-options | एक कनेक्शन जिसका SYN एक Record-Route IP option ले जाता है (नीचे देखें) |
-o FILE | सभी परिणाम CSV में भी लिखता है |
-a / -v | छिपे हुए परिणाम दिखाएँ / साक्ष्य दिखाएँ |
-d | Debug: प्रत्येक request, header और match |
-q | कोई banner नहीं (scripts के लिए) |
-V | संस्करण प्रिंट करें |
-h | सभी विकल्प |
--ip-options (opt-in, केवल command line)एक सामान्य कनेक्शन और एक ऐसा कनेक्शन खोलता है जिसका SYN एक खाली Record-Route IP
option ले जाता है, और रिपोर्ट करता है कि ऐसे packets होस्ट तक पहुँचते हैं (reach), रास्ते में
गिरा दिए जाते हैं (filtered) या port बंद है (noport)। यही वह packet
आकार है जिसके माध्यम से bug तक पहुँचा जाता है, इसलिए यह डिफ़ॉल्ट रूप से बंद है और web page पर कभी नहीं चलता: इसे अपने स्वयं के होस्ट पर उपयोग करें, उदाहरण के लिए यह पुष्टि करने के लिए कि आपका firewall
IP options को गिरा देता है। एक अकेला connect उस race को नहीं जीत सकता जिसकी bug को आवश्यकता है, और
filtered परिणाम बीच का कोई भी network हो सकता है।
nft add table ip cve98432
nft add chain ip cve98432 pre '{ type filter hook prerouting priority -300; }'
nft add rule ip cve98432 pre meta l4proto tcp ip hdrlength != 5 drop
sysctl -w net.mptcp.enabled=0 # if you don't need MPTCP
IPv4 TCP पैकेट्स को ड्रॉप करता है जिनमें कोई भी IP विकल्प होते हैं। रीबूट्स के बीच स्थायी नहीं है, और फिक्स्ड कर्नेल का विकल्प नहीं है।
docker run -d --name kernel98scan --restart unless-stopped \
-p 127.0.0.1:8092:8092 \
-e PANIC_ORIGIN=https://kernel98scan.example.ch \
-v kernel98scan-data:/data \
ghcr.io/akaihigurashi/kernel98scan:latest
या Compose के साथ: docker-compose.yml डाउनलोड करें, PANIC_ORIGIN सेट करें, फिर docker compose up -d चलाएँ। कंटेनर केवल localhost पर सुनता है; इसके सामने TLS के साथ एक रिवर्स प्रॉक्सी लगाएँ (nginx उदाहरण)।
| वेरिएबल | डिफ़ॉल्ट | उद्देश्य |
|---|---|---|
PANIC_ORIGIN | – | सार्वजनिक पता। अन्य ओरिजिन से आने वाले अनुरोध अस्वीकार किए जाते हैं। इसे सेट करें। |
PANIC_OPERATOR / PANIC_CONTACT | – | पृष्ठ के निचले भाग में वैकल्पिक संपर्क अनुभाग |
PANIC_IMPRINT_URL | – | किसी मौजूदा इम्प्रिंट का वैकल्पिक लिंक |
PANIC_TRUSTED_PROXY | 127.0.0.1,::1 | वे प्रॉक्सी जिनके X-Real-IP हेडर पर भरोसा किया जाता है |
PANIC_DENY_HOSTS / PANIC_DENY_IPS | – | इन डोमेन / पतों की कभी जाँच न करें |
PANIC_AUDIT_DIR | /data/audit | दैनिक ऑडिट लॉग फ़ाइलें |
PANIC_RETENTION_DAYS | 30 | इससे पुरानी ऑडिट फ़ाइलें हटा दी जाती हैं |
पृष्ठ में वही सुरक्षाएँ हैं जो php2scan में हैं: सहमति चेकबॉक्स, ऑडिट लॉग, VPN/Tor/datacenter क्लाइंट अस्वीकृत, दर सीमा, परिणाम कैश, केवल सार्वजनिक होस्टनाम और कनेक्शन जाँचे जा रहे पते पर पिन किया गया, वे होस्ट जिनकी कभी जाँच नहीं की जाती (प्रसिद्ध सेवाएँ, 100 सबसे अधिक देखी जाने वाली साइटें, सरकारी साइटें, प्रतिबंधित देश), और प्रतिबंधित देशों से कोई पहुँच नहीं। वेब पृष्ठ केवल प्रारंभ पृष्ठ लोड करता है; यह कभी IP विकल्प नहीं भेजता।