
كاشف Rust ومختبر محلي لـ CVE-2026-98432، وهو ثغرة use-after-free في IPv4 TCP على Linux في inet_opt/ireq_opt: تحليل ELF ساكن، وفحوصات إمكانية الوصول عبر kprobe، ومُشغِّل حالة تسابق.
inet_opt / ireq_opt)إثبات مفهوم (PoC) بحثي ومختبر محلي لثغرة استخدام بعد تحرير في نواة Linux يمكن الوصول إليها من مستمع IPv4 TCP عادي. هذا كاشف/مُطلِق للخطأ، وليس استغلالًا.
7.0.0-38-generic):
تُحرِّر inet_sock_destruct() وtcp_v4_reqsk_destructor() الخيارات باستخدام
kfree() بدلًا من kfree_rcu().kfree قابل للوصول أثناء التشغيل (kprobes).free -> use (via=reqsk) في تشغيل قديم واحد، ولم نتمكن من إعادة إنتاجهما
بشكل موثوق.tcp2kaslr المرجعي يتوقف أيضًا عند إطلاق الخطأ؛ المراحل اللاحقة
غير منشورة.CONFIG_KASAN معطّل وأخذ عينات KFENCE معطّل.tcp2kaslr)لا حاجة إلى MPTCP. المسار المُثبَت هو IPv4 TCP عادي:
ireq_opt).accept() على الابن، ويضبط SO_LINGER(0) ويغلقه.
فتُحرِّر inet_sock_destruct() الخيارات باستخدام kfree().كان مُطلِقنا السابق خاطئًا من ناحيتين: لم يقبل الضحية/يغلق
الابن أبدًا (free_sock=0)، وأرسلنا RST بدلًا من الاعتماد على إغلاق الخادم.
تضيف الشيفرة الحالية الأجزاء الصحيحة:
listen --accept-close — accept + SO_LINGER(0) + close.--sync — ACK + SYN مكرر بشكل متزامن، بدون RST، مع خيارات Record Route.الإصلاح في المنبع هو بالضبط:
- kfree(rcu_dereference_protected(inet->inet_opt, 1));
+ kfree_rcu(rcu_dereference_protected(inet->inet_opt, 1), rcu);
والتغيير نفسه في tcp_v4_reqsk_destructor().
| المسار | الوصف |
|---|---|
rust-poc/ | إثبات المفهوم الأصلي بلغة Rust: تحليل ELF الساكن، وkprobes، وأوضاع التشغيل |
lab/ | ضحية Alpine + PHP عبر loopback للاختبارات المحلية القديمة |
scripts/ | أدوات مساعدة لإعادة الإنتاج محليًا، وأدوات مساعدة للتدقيق المصرّح به |
docs/FINDINGS.md | ما تم اختباره، وما تم تأكيده، وما لم يتم تأكيده |
docs/EXPLOITATION-NOTES.md | النطاق: إثارة الخلل فقط، دون تنفيذ تعليمات عن بُعد (RCE) |
docs/evidence/ | عينات أدلة منقّحة |
cd rust-poc
cargo build --release
# static analysis (no root)
./target/release/cve-2026-98432 static
# runtime reachability (root, tracefs)
sudo ./target/release/cve-2026-98432 runtime
# correct local vector: accept+close server + --sync trigger
cd ..
PASSES=1 ./scripts/repro-sync.sh 8083
repro-sync.sh يشغّل الضحية --accept-close على 127.0.0.1:8083، ويشغّل
محفّز المزامنة باستخدام sudo، ويطبع free_sock وuse_build وحكم
UAF. التشغيل النظيف ليس دليلاً على السلامة: المعدل نحو 1e-7 لكل
محاولة والأحداث تتجمّع.
إذا كان artifacts/ مفقودًا، فإن static/runtime يعودان إلى /boot؛ يمكن
لـ scripts/cve-2026-98432.sh --static القديم توليد مخرجات النواة.
مع KASAN، تُبلّغ النواة عن slab-use-after-free في
inet_csk_route_req / ip_options_build مع مكدّس التحرير في
inet_sock_destruct / inet_release. تصل أداة tcp2kaslr إلى ذلك في
نحو 134 ألف محاولة مع KASAN؛ على نواة عادية لوحظ السباق نفسه مرتين فقط
في نحو 48 مليون محاولة.
اختبر فقط النوى والمضيفين التي تملكها أو المصرّح لك صراحةً باختبارها. فالمحفّز سباق في النواة وقد يؤدي إلى تعطّل المضيف. استخدم جهازًا افتراضيًا قابلًا للتخلص منه مع لقطة (snapshot).
offline-ant/tcp2kaslr — محفّز الخطأ، أدلة KASAN، التحليل:
https://github.com/offline-ant/tcp2kaslripv4: free inet_opt and ireq_opt after an RCU grace period
(Eric Dumazet)، kfree → kfree_rcu في net/ipv4/af_inet.c و
net/ipv4/tcp_ipv4.c.MIT. راجع LICENSE.