
قواعد nftables للدخول (ingress) تُسقط حزم IPv4 TCP SYN التي تحمل خيارات IP للتخفيف من ثغرة use-after-free المسجّلة تحت CVE-2026-98432، مع عدّادات وتسجيل لكل مصدر.
تخفيف nftables لـ CVE-2026-98432: إسقاط حزم SYN الخاصة بـ IPv4 TCP التي تحمل خيارات IP، في أبكر وقت ممكن عبر nftables.
الثغرة CVE هي use-after-free في مسار طلب المقبس (request-socket) الخاص بـ IPv4 TCP (ireq->ireq_opt / inet_opt، تُقرأ في ip_options_build()). الإصلاح الصحيح هو تحديث النواة؛ هذا الإجراء يقلل التعرض فقط حتى تحصل على التحديث.
يُضبط ireq->ireq_opt في مكان واحد فقط، وهو tcp_v4_init_req()، من خيارات حزمة SYN التي تفتح طلب المقبس؛ أما حزمة SYN المُعاد إرسالها بشكل متزامن فتقرأ فقط ما تم حفظه هناك، وسيناريو الثغرة CVE يجعل المهاجم يرسل حزمة SYN تحمل خيارات Record Route أو Timestamp. لذا فإن حزمة SYN التي تحمل خيارات هي الحزمة المهمة. إعادة توجيه طلب المقبس (request socket migration) تعيد استخدام نفس ireq_opt المحفوظ. يستند هذا إلى مصدر النواة ونص الثغرة CVE، وليس إلى تصريح من مؤلفي CVE بأن حزم SYN فقط كافية؛ أزل مطابقة tcp flags & (syn | ack) == syn من القواعد للحصول على النسخة المتحفظة.
اضبط IFACES على بطاقات الشبكة التي تستقبل حركة المرور الخارجية، ثم نفّذ sudo nft -f simple.nft. مجموعة القواعد هي:
define IFACES = { eth0 }
table netdev cve_2026_98432 {
chain ingress {
type filter hook ingress devices = $IFACES priority -500; policy accept;
ip protocol tcp ip hdrlength > 5 tcp flags & (syn | ack) == syn limit rate 5/second burst 10 packets log prefix "CVE-2026-98432 drop: " level warn
ip protocol tcp ip hdrlength > 5 tcp flags & (syn | ack) == syn counter drop
}
}
netdev ingress عند الأولوية -500 هو أول خطاف netfilter، قبل prerouting وconntrack والتوجيه. لا يزال XDP يعمل قبله.ip hdrlength > 5 هو حقل IHL الخاص بـ IPv4 بوحدات الكلمات ذات 32 بت؛ القيمة أكبر من 5 تعني وجود خيارات.tcp flags & (syn | ack) == syn تعني حزمة SYN بدون ACK.counter في قاعدة الإسقاط هو الإجمالي.راقبها عبر: sudo nft list chain netdev cve_2026_98432 ingress وjournalctl -k -g 'CVE-2026-98432'.
fancy.nftfancy.nft هو نفس الإسقاط مع عداد إجمالي مسمّى وعدادات لكل عنوان، محفوظة في مجموعتين ديناميكيتين. كما يحصي ويسجّل كل حزمة TCP أخرى تحمل خيارات IP (تمر، ولا تُسقط)، مع بايتات الخيارات في سطر السجل (flags ip options، البادئة CVE-2026-98432 ip-options: ):
| العداد | الموقع | ما يعرضه |
|---|---|---|
| total | العداد المسمّى dropped_total | حزم SYN التي تحمل خيارات IP، والمُسقطة |
| other | العداد المسمّى options_other | حزم TCP الأخرى التي تحمل خيارات IP، والمارّة |
| لكل عنوان IP مصدر | المجموعة by_src | الحزم والبايتات لكل عنوان مصدر مُسقط |
| لكل مصدر . وجهة | المجموعة by_pair | الشيء نفسه لكل زوج (مصدر، وجهة) |
| أي IP يستخدم خيارات | المجموعة options_by_src | الحزم والبايتات لكل عنوان مصدر لكل حزمة IPv4 تحمل خيارات، أي بروتوكول (TCP، UDP، ICMP...)، بما في ذلك حزم SYN المُسقطة |
sudo nft -f fancy.nft
sudo ./cve-log.sh # counters, then follow the kernel log
sudo ./cve-log.sh -c # counters only
sudo ./cve-log.sh -r # reset the total and the per-IP sets
أو مباشرة:
sudo nft list counter netdev cve_2026_98432 dropped_total
sudo nft list counter netdev cve_2026_98432 options_other
sudo nft list set netdev cve_2026_98432 by_src
sudo nft list set netdev cve_2026_98432 by_pair
sudo nft list set netdev cve_2026_98432 options_by_src
لكل عنصر عدّاد الحزم والبايتات الخاص به، وينتهي بعد ساعة من آخر إصابة له. تحتفظ كل مجموعة بـ 65535 عنصرًا كحد أقصى؛ وعندما تمتلئ إحداها لا تُتتبَّع العناوين الجديدة، لكن الحزمة تظل مُسقطة. يمكن انتحال عناوين المصدر، لذا تعرض العدادات لكل IP ما ادّعته الحزم، وليس من أرسلها.
sudo nft delete table netdev cve_2026_98432.
لا يستمر أي منهما عبر إعادة التشغيل؛ أدرج الملف من /etc/nftables.conf.
يضيف fancy.nft الجدول ويعيد بناء القواعد فقط، لذا فإن إعادة التحميل تحافظ على
العدادات؛ شغّل nft delete table netdev cve_2026_98432 أولاً لإعادة تعيينها أو
لتغيير مجموعة. تعيش العدادات في ذاكرة النواة ولا تبقى بعد إعادة التشغيل.