
يتحقق مما إذا كان المضيف يتجاهل حزم SYN TCP IPv4 مع خيارات IP (تخفيف CVE-2026-98432)
يتحقق مما إذا كان المضيف يتجاهل SYN TCP IPv4 مع خيارات IP، وهو التخفيف الشبكي الموصى به لـ CVE-2026-98432 (use-after-free في مصافحة TCP IPv4 لنواة Linux، CVSS 9.8، حتى صدور النواة المصححة).
لكل منفذ، يرسل SYN عاديًا وSYN مع IPv4 Record Route ويقارن الاستجابات. إنه غير ضار: لا يستغل شيئًا، بل يفتح (ولا يكمل) مصافحة فقط.
ما يقيسه الاختبار: ما إذا كان SYN مع خيارات IP يصل ويُقبل من قبل الهدف. فهو لا يقرأ إصدار النواة. النواة المصححة مسبقًا تستمر في قبول خيارات IP وتُخرج
EXPOSTO— في هذه الحالة يعنيEXPOSTOفقط "بدون تصفية خيارات IP"، ويُتحقق من التصحيح باستخدام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 عادي مقبول، SYN مع IP options مُسقَط — ولا يوجد أي قفزة في المسار تُرشِّح IP options |
EXPOSTO | 1 | SYN مع IP options قُبِل أيضًا: لا شيء في المسار ولا في الهدف يُرشِّح |
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. عند الاختبار من خلف
إحداها، يبدو كل هدف مُخفَّفًا. لذلك يمرّ المدقّق عبر المسار قفزة بقفزة (TTL
متزايد) قبل الاختبار، وإذا أسقطت أي قفزة IP options، يُعيد NÃO CONFIÁVEL.
الحد: مرشّح في قفزة لا ترد على ICMP يمرّ دون ملاحظة. تحقّق من نقطة الاختبار
على هدف معروف بأنه بلا تخفيف: يجب أن يخرج EXPOSTO.
نظام Linux المعرّض للثغرة يُعيد IP options في SYN-ACK (يعود SYN مع Record Route بـ
ihl=6 وخيار RR). في نقطة اختبار عليها قاعدة mitigacao/، يُسقَط هذا SYN-ACK
في prerouting. ومع ذلك تكون النتيجة صحيحة: يلتقط scapy الاستجابة على
مقبس الحزم، قبل netfilter. قياسًا: عند الاختبار، من مضيف عليه القاعدة، على هدف بلا
القاعدة، كانت النتيجة EXPOSTO وارتفع عدّاد القاعدة بمقدار 1 (SYN-ACK أُسقِط بعد
التقاطه). يغطّي الاختبار alvo sem a regra (container) -> EXPOSTO هذه الحالة في CI، الذي يشغّل
الاختبارات مع runner بلا القاعدة ومعها.
استثناء: أهداف خلف bridge لنقطة الاختبار نفسها مع br_netfilter. مع تحميل الوحدة
(net.bridge.bridge-nf-call-iptables = 1، الافتراضي في مضيف Docker Swarm والعديد من
Proxmox)، يعمل prerouting لـ IPv4 داخل الـ bridge، قبل الالتقاط. في هذه الحالة، قاعدة
نقطة الاختبار تُسقِط SYN-ACK لحاوية أو VM من تلك الـ bridge، وتكون النتيجة
MITIGADO زائفًا. الأهداف التي يُوصَل إليها عبر بطاقة عادية (جهاز آخر في الشبكة) لا تتأثر.
لاختبار حاويات أو VMs من مضيف عليه br_netfilter، استخدم نقطة اختبار خارجه، أو نقطة
بلا القاعدة. تتخطّى الاختبارات هذه الحالة (SKIP) عندما تكتشف هذا التوليف.
إذا كان منفذ الهدف منشورًا عبر Docker (DNAT إلى حاوية)، فإن الهدف نفسه يرد بـ ICMP
"TTL excedido" على الحزم الاستكشافية ذات TTL المنخفض، لأنه يُمرِّر الحزمة. يتعرّف المدقّق على هذا ICMP
من عنوان IP المصدر (هو IP الهدف) ولا يعامله كقفزة في المسار. حتى الإصدار 1.1.0، كان
يُعطي NÃO CONFIÁVEL زائفًا على هدف مُخفَّف عندما يكون المنفذ الأول في القائمة مُمرَّرًا. يغطّي
الاختبار porta encaminhada no alvo mitigado -> MITIGADO هذه الحالة.
في mitigacao/:
cve-2026-98432.nft: جدول ip cve_2026_98432 الذي يُسقِط TCP IPv4 مع ip hdrlength > 5
في prerouting (priority -300). Idempotente.cve-2026-98432-mitigation.service: وحدة systemd تُحمِّل القاعدة قبل أن ترتفع الشبكة.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
التخفيف لا يحل محل النواة المصححة: قم بتثبيتها وإعادة التشغيل بمجرد أن تنشر توزيعتك التحديث.
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
تقوم الاختبارات بتشغيل مستمع مؤقت على المضيف (المنفذ 18098) وتختبره من حاوية
على جسر Docker. في CI (test.yml) يعمل الـ runner مرتين:
بدون القاعدة (يجب أن يخرج EXPOSTO) ومع القاعدة المطبقة (يجب أن يخرج MITIGADO).
وهذا يتحقق من صحة الطريقة في كلا الاتجاهين.
سير العمل اليدوي release-and-build.yml (Actions →
Release and build → patch/minor/major): يشغّل الاختبارات، وينشئ وسم SemVer والإصدار، وينشر
الصورة على GHCR مع الوسوم x.y.z وx.y وx وlatest. يدخل الإصدار إلى الصورة عبر
APP_VERSION.
MIT