
जाँचता है कि कोई होस्ट IP options के साथ IPv4 TCP SYN को ड्रॉप करता है या नहीं (CVE-2026-98432 का शमन)
जाँचता है कि कोई होस्ट IP options वाले IPv4 TCP SYN को छोड़ता (drop) है या नहीं, जो CVE-2026-98432 (Linux kernel के IPv4 TCP handshake में use-after-free, CVSS 9.8, सुधारित kernel आने तक) के लिए अनुशंसित नेटवर्क शमन है।
प्रत्येक पोर्ट के लिए, एक सामान्य SYN और IPv4 Record Route वाला एक SYN भेजता है और प्रतिक्रियाओं की तुलना करता है। यह हानिरहित है: यह किसी चीज़ का शोषण नहीं करता, केवल एक handshake खोलता है (और पूरा नहीं करता)।
यह परीक्षण क्या मापता है: क्या IP options वाला SYN लक्ष्य तक पहुँचता है और स्वीकार किया जाता है। यह kernel का संस्करण नहीं पढ़ता। पहले से सुधारा गया kernel भी IP options स्वीकार करता रहता है और
EXPOSEDदेता है — उस स्थिति मेंEXPOSEDका अर्थ केवल "IP options फ़िल्टर नहीं है" है, और सुधार की पुष्टिuname -rसे होती है।
./verifica-cve-2026-98432.sh <host-ou-ip> [porta ...] # porta padrão: 443
./verifica-cve-2026-98432.sh exemplo.com 443 80 22
बिना स्क्रिप्ट के, सीधे इमेज के माध्यम से (लक्ष्य IPv4 होना चाहिए):
docker run --rm --network host --cap-add NET_RAW \
ghcr.io/marcelofmatos/cve-2026-98432-check:latest 203.0.113.10 443 22
| आउटपुट | Exit | अर्थ |
|---|---|---|
MITIGADO | 0 | सामान्य SYN स्वीकार किया गया, IP options वाला SYN छोड़ा गया — और पथ का कोई भी हॉप IP options को फ़िल्टर नहीं करता |
EXPOSTO | 1 | IP options वाला SYN भी स्वीकार किया गया: पथ में या लक्ष्य में कुछ भी फ़िल्टर नहीं करता |
INCONCLUSIVO | 2 | पोर्ट बंद (RST) या फ़िल्टर्ड — किसी खुले पोर्ट का उपयोग करें |
SEM HOST | 2 | लक्ष्य स्थानीय नेटवर्क में है और उसके लिए कोई ARP का उत्तर नहीं देता: IP मुक्त है या मशीन बंद है। कोई TCP प्रोब नहीं भेजा जाता |
NÃO CONFIÁVEL | 3 | पथ का कोई हॉप (VPN, ऑपरेटर) पहले से ही IP options को छोड़ देता है। "छोड़ा गया" लक्ष्य के बारे में कुछ सिद्ध नहीं करता: नेटवर्क के किसी अन्य बिंदु से परीक्षण करें |
| — | 64 | गलत उपयोग, या IPv4 के बिना नाम |
कई पोर्ट के साथ, exit सबसे खराब स्थिति है: कोई भी EXPOSTO → 1।
विवरण:
getent), इसलिए VPN/आंतरिक DNS नाम काम करते हैं।prerouting से प्रवेश करे।CHECK_IMAGE (डिफ़ॉल्ट ghcr.io/marcelofmatos/cve-2026-98432-check:latest)। लॉग की पहली पंक्ति
संस्करण है: cve-2026-98432-check <versão> iniciando।कई VPN और ऑपरेटर IP options वाले पैकेट छोड़ देते हैं। उनमें से किसी के पीछे से परीक्षण करने पर,
हर लक्ष्य mitigated प्रतीत होता है। इसलिए सत्यापनकर्ता परीक्षण से पहले पथ को हॉप-दर-हॉप (बढ़ता TTL)
तय करता है और, यदि कोई हॉप IP options छोड़ देता है, तो NÃO CONFIÁVEL लौटाता है।
सीमा: किसी ऐसे हॉप पर फ़िल्टर जो ICMP का उत्तर नहीं देता, पकड़ में नहीं आता। परीक्षण बिंदु को
किसी ज्ञात unmitigated लक्ष्य पर सत्यापित करें: उसे EXPOSTO आना चाहिए।
एक vulnerable Linux SYN-ACK में IP options लौटाता है (Record Route वाला SYN ihl=6 और RR विकल्प
के साथ वापस आता है)। mitigacao/ के नियम वाले परीक्षण बिंदु पर, वह SYN-ACK
prerouting में छोड़ दिया जाता है। फिर भी परिणाम सही है: scapy पैकेट सॉकेट पर उत्तर को netfilter से
पहले कैप्चर करता है। मापा गया: नियम वाले होस्ट से, नियम रहित लक्ष्य का परीक्षण करने पर, परिणाम
EXPOSTO था और नियम का काउंटर 1 बढ़ा (SYN-ACK कैप्चर होने के बाद छोड़ा गया)। परीक्षण
नियम रहित लक्ष्य (कंटेनर) -> EXPOSTO CI में इस स्थिति को कवर करता है, जो परीक्षणों को नियम के बिना
और नियम के साथ runner पर चलाता है।
अपवाद: br_netfilter वाले स्वयं परीक्षण बिंदु के bridge के पीछे के लक्ष्य। मॉड्यूल लोड होने पर
(net.bridge.bridge-nf-call-iptables = 1, Docker Swarm होस्ट और कई Proxmox का डिफ़ॉल्ट), IPv4
prerouting अभी भी bridge के अंदर, कैप्चर से पहले चलता है। उस स्थिति में, परीक्षण बिंदु का नियम
उस bridge के कंटेनर या VM का SYN-ACK छोड़ देता है, और परिणाम एक झूठा MITIGADO होता है। सामान्य
नेटवर्क कार्ड (नेटवर्क की दूसरी मशीन) से पहुँचे जाने वाले लक्ष्य प्रभावित नहीं होते।
br_netfilter वाले होस्ट के कंटेनर या VM का परीक्षण करने के लिए, उसके बाहर का परीक्षण बिंदु उपयोग करें, या
नियम रहित कोई बिंदु। परीक्षण इस संयोजन का पता लगाने पर इस स्थिति को छोड़ देते हैं (SKIP)।
यदि लक्ष्य का पोर्ट Docker द्वारा प्रकाशित है (किसी कंटेनर तक DNAT), तो लक्ष्य स्वयं कम TTL वाले
प्रोब को ICMP "TTL excedido" का उत्तर देता है, क्योंकि वह पैकेट को अग्रेषित करता है। सत्यापनकर्ता उस ICMP
को स्रोत IP (जो लक्ष्य का IP है) से पहचानता है और उसे पथ का हॉप नहीं मानता। संस्करण 1.1.0 तक, यह
mitigated लक्ष्य पर झूठा NÃO CONFIÁVEL देता था जब सूची का पहला पोर्ट अग्रेषित था। परीक्षण
mitigated लक्ष्य पर अग्रेषित पोर्ट -> MITIGADO इस स्थिति को कवर करता है।
mitigacao/ में:
cve-2026-98432.nft: तालिका ip cve_2026_98432 जो prerouting (priority -300) में
ip hdrlength > 5 वाले TCP IPv4 को छोड़ देती है। Idempotent।cve-2026-98432-mitigation.service: systemd unit जो नेटवर्क शुरू होने से पहले नियम लोड करती है।sudo install -m 644 mitigacao/cve-2026-98432.nft /etc/cve-2026-98432.nft
sudo install -m 644 mitigacao/cve-2026-98432-mitigation.service /etc/systemd/system/
echo 'net.mptcp.enabled = 0' | sudo tee /etc/sysctl.d/90-cve-2026-98432-mptcp.conf
sudo sysctl -w net.mptcp.enabled=0
sudo systemctl daemon-reload && sudo systemctl enable --now cve-2026-98432-mitigation
मिटिगेशन पैच किए गए kernel का विकल्प नहीं है: जैसे ही आपकी डिस्ट्रो इसे प्रकाशित करे, इसे इंस्टॉल करें और रीबूट करें।
flowchart LR
U["Operador"] --> L["verifica-cve-2026-98432.sh<br/>resolve o nome com getent<br/>escolhe a rede do container"]
L -->|"docker run --cap-add NET_RAW"| C["Container cve-2026-98432-check<br/>Alpine + Python + scapy"]
C -->|"rede host: alvo remoto"| N["Caminho de rede<br/>VPN, operadora, internet"]
C -->|"bridge: alvo é a própria máquina"| H["prerouting do host"]
N --> A["Alvo IPv4<br/>porta TCP"]
REG["GHCR<br/>ghcr.io/marcelofmatos/cve-2026-98432-check"] -.->|"docker pull"| C
flowchart TD
S["Início: alvo e portas"] --> AQ{"Alvo na rede local<br/>e sem resposta ARP?"}
AQ -->|"sim"| SH["SEM HOST — exit 2"]
AQ -->|"não"| H["TTL = 1, 2, 3 ... até o alvo<br/>SYN normal e SYN com RR"]
H --> HQ{"Algum salto responde ICMP ao normal<br/>e some com o RR?"}
HQ -->|"sim"| FL["caminho FILTRA no salto N"]
HQ -->|"não, chegou ao alvo, ICMP veio do próprio alvo<br/>ou 4 saltos mudos seguidos"| OK["nenhum filtro visto"]
FL --> P
OK --> P
P["Por porta: SYN normal"] --> PQ{"SYN-ACK?"}
PQ -->|"não"| INC["INCONCLUSIVO — exit 2"]
PQ -->|"sim"| R["SYN com RR"]
R --> RQ{"Alguma resposta?"}
RQ -->|"sim"| EXP["EXPOSTO — exit 1"]
RQ -->|"não, caminho filtra"| NC["NÃO CONFIÁVEL — exit 3"]
RQ -->|"não, caminho limpo"| MIT["MITIGADO — exit 0"]
docker build --build-arg APP_VERSION=dev -t cve-2026-98432-check:dev .
# ESPERADO_LOCAL=1 num host sem a regra nft; 0 num host com a regra aplicada
CHECK_IMAGE=cve-2026-98432-check:dev ESPERADO_LOCAL=1 VERSAO_ESPERADA=dev ./tests/testes.sh
Os testes sobem um listener temporário no host (porta 18098) e o testam a partir de um container
na bridge do Docker. No CI (test.yml) o runner roda duas vezes:
sem a regra (precisa sair EXPOSTO) e com a regra aplicada (precisa sair MITIGADO).
Isso valida o método nos dois sentidos.