
مجموعة قواعد nftables ووحدة systemd تُسقط حزم IPv4 TCP التي تحمل خيارات IP للتخفيف من ثغرة use-after-free في نواة Linux المسماة CVE-2026-98432 إلى حين صدور نواة مُرقّعة.
تخفيف مؤقت بجدار حماية لـ CVE-2026-98432 على Ubuntu 24.04 (noble)، للمضيفين الذين يعرّضون مستمع TCP عامًا (مثل عقدة Geth على المنفذ 30303) بينما لا تتوفر نواة مُصلَّحة بعد.
CVE-2026-98432 هو ثغرة use-after-free في شيفرة مصافحة IPv4 TCP في نواة Linux. عندما يحمل SYN الوارد خيارات IPv4 IP، تُسلَّم هذه الخيارات إلى مقبس الابن الجديد دون نسخها؛ وعندها يمكن لـ SYN مُعاد إرساله ويُعالَج في الوقت نفسه على وحدة معالجة مركزية أخرى أن يقرأها بعد تحريرها. يوجد مُحفِّز ثانٍ عبر ترحيل مقبس الطلب (net.ipv4.tcp_migrate_req=1 أو برنامج BPF_SK_REUSEPORT_SELECT_OR_MIGRATE).
تُصنِّفها Ubuntu بأولوية عالية (CVSS 3: 9.8). وقت كتابة هذا النص، لا يزال إصلاح نواة linux لـ noble قيد التنفيذ.
مستمعات MPTCP ليست حالة منفصلة. تفتح ثنائيات Go 1.24+ (بما في ذلك Geth الحديثة) المستمعات كـ MPTCP افتراضيًا، لذا يعرضها ss كـ mptcp. تمر التدفقات الفرعية لـ MPTCP عبر مسار SYN نفسه الخاص بـ IPv4 TCP، لذا فهي معرَّضة تمامًا مثل TCP العادي. تعطيل MPTCP (GODEBUG=multipathtcp=0) لا يخفف من هذا.
قاعدة nftables واحدة، في جدول خاص بها، تُسقط أي حزمة TCP عبر IPv4 لا يساوي طول ترويستها 5 (أي أي شيء يحمل خيارات IP) قبل أن تراها حزمة TCP في النواة:
ip protocol tcp ip hdrlength != 5 counter drop
ip hdrlength != 5) كانت تُسقط أيضًا استعلامات عضوية IGMP، التي تحمل خيار Router Alert، ويمكن أن تُعطّل بهدوء البث المتعدد في الشبكة المحلية (mDNS/Avahi، والبث إلى الأجهزة).inet cvefix)، لذا تتعايش مع ufw ولا تتأثر بإعادة تحميل ufw.| الملف | يُثبَّت في | الغرض |
|---|---|---|
nftables-cve-2026-98432.nft | /etc/nftables-cve-2026-98432.nft | مجموعة القواعد (خاملة الأثر؛ آمنة لإعادة التشغيل) |
cve-2026-98432.service | /etc/systemd/system/cve-2026-98432.service | وحدة oneshot تُحمّل مجموعة القواعد عند الإقلاع |
لا تضع هذه القاعدة في
/etc/nftables.conf. يبدأ ذلك الملف بـflush ruleset، مما قد يمحو قواعد ufw إذا عملnftables.service.
git clone <this-repo> && cd <this-repo>
sudo install -m 0644 nftables-cve-2026-98432.nft /etc/nftables-cve-2026-98432.nft
sudo install -m 0644 cve-2026-98432.service /etc/systemd/system/cve-2026-98432.service
sudo systemctl daemon-reload
sudo systemctl enable --now cve-2026-98432.service
sudo nft list table inet cvefix
أيضًا تأكد من أن محفّز الترحيل متوقف (الافتراضي):
sysctl net.ipv4.tcp_migrate_req # expect: 0
ثبّت nping. على Ubuntu يأتي ضمن حزمة nmap؛ لا توجد حزمة nping منفصلة:
sudo apt install nmap
أعد تحميل مجموعة القواعد أولاً لإعادة تعيين العداد إلى 0، ثم أرسل حزمة SYN عادية (بدون خيارات IP) عبر loopback:
sudo nft -f /etc/nftables-cve-2026-98432.nft # reload; resets the counter to 0
sudo nping --tcp -p 30303 --flags syn -c 3 127.0.0.1
sudo nft list table inet cvefix
المتوقع: ردود SA (SYN-ACK)، مما يُظهر أن المستمع لا يزال قابلاً للوصول، ويبقى العداد عند packets 0 bytes 0. إذا لم تحصل على أي ردود، فقد يفشل nping في الالتقاط على واجهة loopback؛ في هذه الحالة، نفّذ هذا الاختبار والاختبار التالي ضد عنوان IP الخاص بشبكة المضيف المحلية (LAN) بدلاً من 127.0.0.1.
أرسل نفس حزمة SYN، هذه المرة مع خيار IP (Record Route). تمرّ حركة loopback عبر خطاف prerouting، لذا فإن هذا يختبر القاعدة دون أي وسيط:
sudo nping --tcp -p 30303 --flags syn --ip-options R -c 3 127.0.0.1
sudo nft list table inet cvefix
المتوقع: لا يتلقى nping أي ردود (Lost: 3 (100.00%))، ويقرأ العداد بالضبط:
ip protocol tcp ip hdrlength != 5 counter packets 3 bytes 240 drop
(3 فحوص × 80 بايت.)
لا تختبر الاختبارات البعيدة القاعدة إلا إذا وصل الفحص فعليًا إلى المضيف. على جهاز آخر على نفس الشبكة المحلية (LAN)، استهدف عنوان LAN الخاص بالمضيف:
sudo nping --tcp -p 30303 --flags syn --ip-options R -c 3 <host-lan-ip>
ثم تحقق من العدّاد على المضيف المحمي:
sudo nft list table inet cvefix
المتوقع: لا توجد ردود، ويزداد العدّاد بمقدار 3 (إلى packets 6 bytes 480 إذا نفّذت الخطوة 2 أولاً).
فحص عنوان IP العام من الخارج غالباً ما يكون غير حاسم. فالعديد من أجهزة التوجيه وأجهزة مزوّد خدمة الإنترنت ترفض حزم خيارات IP بنفسها. ومن العلامات النموذجية رد RA (إعادة تعيين) بقيمة TTL عالية مثل ttl=250، وهو ما يشير إلى جهاز بقيمة TTL أولية قدرها 255 بدلاً من مضيف Linux (قيمة TTL الأولية 64). فالفحص لا يصل إلى المضيف أبداً، وبالتالي لا يتحرك العدّاد. توضّح الخطوة 4 كيفية التمييز.
نفّذ هذه على المضيف المحمي.
تأكّد من وصول الفحوصات البعيدة. ابدأ هذا، ثم كرّر فحص الخطوة 3 من الجهاز الآخر:
sudo tcpdump -ni any 'tcp port 30303 and (ip[0] & 0x0f) > 5'
| tcpdump على المضيف | عدّاد nft | رد nping | المعنى |
|---|---|---|---|
| يُظهر حزمًا | يزداد | لا شيء | التخفيف يعمل |
| يُظهر حزمًا | دون تغيير | SA | القاعدة غير نشطة؛ تحقق من nft list table inet cvefix |
| لا شيء | دون تغيير | لا شيء أو RA | توقّف الفحص في المنبع؛ اختبر من الشبكة المحلية أو من loopback |
تأكّد من عدم التقاط أي شيء آخر. اترك العدّاد دون مساس لعدة دقائق؛ ينبغي أن يبقى عند عدد اختبارك. لرؤية حركة المرور الحاملة لخيارات غير TCP وهي تصل (والتي تسمح بها هذه القاعدة عمدًا):
sudo tcpdump -ni any '(ip[0] & 0x0f) > 5 and not tcp'
استعلامات IGMP من موجّه LAN (مثل igmp query v3 إلى 224.0.0.1) طبيعية ويجب ألا تزيد العدّاد.
systemctl is-enabled cve-2026-98432.service # expect: enabled
sudo nft list table inet cvefix # table present
sysctl net.ipv4.tcp_migrate_req # expect: 0
هذا حل مؤقت. تحقق بشكل دوري من النواة المُرقّعة:
uname -r
sudo pro fix CVE-2026-98432
عندما يتوفر إصلاح:
sudo apt update && sudo apt full-upgrade
sudo reboot
قد يتجنب Livepatch (عبر اشتراك Ubuntu Pro شخصي مجاني؛ pro status، canonical-livepatch status) إعادة التشغيل، لكن لا يوجد ضمان بأن يصدر livepatch لهذه الثغرة CVE.
بمجرد تشغيل نواة مُصحّحة (الإبقاء عليها غير ضار أيضًا):
sudo systemctl disable --now cve-2026-98432.service
sudo nft delete table inet cvefix
sudo rm /etc/systemd/system/cve-2026-98432.service /etc/nftables-cve-2026-98432.nft
sudo systemctl daemon-reload
لتحقيق هامش أمان إضافي حتى يتم الترقيع، يمكن إغلاق المنفذ الوارد 30303 بالكامل (يواصل Geth المزامنة عبر الأقران الصادرين، مع عدد أقل من الأقران):
sudo ufw deny 30303/tcp
# later:
sudo ufw delete deny 30303/tcp