CVE-2026-90083 in Linux
الملخص
بحسب VulDB • 17/09/2026
في نواة لينكس، تم إصلاح الثغرة التالية:
net/sched: act_ife: العمل فقط على إطارات إيثرنت (Ethernet frames)
تقوم act_ife بتغليف/فك تغليف رأس الإيثرنت الأصلي وتستخدم `skb->dev->hard_header_len` كطول لذلك الرأس. وهذا صحيح فقط للأجهزة التي تعمل بالإيثرنت: ففي الأجهزة حيث لا يتطابق `hard_header_len` مع رأس الطبقة الثانية (L2) الذي تم استخراجه فعلياً (حيث يبلغ PPP_HDRLEN في حالة بروتوكول النقطة إلى نقطة PPP بينما لا يتم نزع أي شيء عند الاستقبال)، فإن عمليات `skb_push()` و `skb_pull()` الواردة تستخدم طولاً خاطئاً وقد تؤدي إلى حدوث خطأ من نوع `skb_under_panic` عندما يكون المساحة المتاحة للرأس (headroom) ضيقة.
تم تصميم IFE ليعمل فقط مع الإيثرنت - فهو يبني رأس إيثرنت خارجياً (`ethhdr`)، ويعيد كتابة الحقول `h_source` و `h_dest` و `h_proto`، ويستدعي دالة `eth_type_trans()` عند فك التشفير/التحويل. لذا، بدلاً من محاولة ضبط الإزاحات (offsets) لتعمل مع أنواع الروابط المختلفة بشكل عام، يتم ببساطة تجاهل الحزم التي لا تحمل رأس إيثرنت.
فحص `skb->dev->type` وحده ليس كافياً. يجب مراعاة حالة حافة (corner case) حيث يمكن لـ mirred إعادة توجيه حزمة skb من جهاز غير إيثرنت إلى جهاز يعمل بالإيثرنت، وعندها فإن `skb->dev` لا يعطي أي معلومات حول التغليف الفعلي للحزمة: فحزمة تم إعادة توجيهها من ppp0 تصل إلى خطاف الاستقبال (ingress hook) للهدف بـ mac_len تساوي 0 وبدون رأس إيثرنت على الإطلاق. لذلك، عند الاستقبال، يجب أيضاً اشتراط أن يكون `mac_len` مساوياً لـ ETH_HLEN. أما في الإرسال (egress)، فلا يتم الحفاظ على قيمة mac_len، لذا فإن نوع الجهاز هو كل ما نملكه؛ حيث تؤدي عملية إعادة التوجيه غير الصحيحة هناك إلى إطار مشوه بدلاً من دفع خارج النطاق (out-of-bounds push)، وسيكون الإطار مشوهاً سواء مع IFE أو بدونه.
هذه الحالة الحافة ليست نظرية - فإعادة التوجيه من ppp0 إلى veth التي تحتوي على إجراء ترميز ife في خطاف الاستقبال الخاص بها تسبب توقف النظام (panic) بدون هذا التصحيح:
skbuff: skb_under_panic: len:98 put:14 head:ffff88800e410000 data:ffff88800e40fff5 tail:0x57 end:0x640 dev:veth3 kernel BUG at net/core/skbuff.c:214! Call Trace: skb_push (net/core/skbuff.c:224 net/core/skbuff.c:2657) tcf_ife_act (net/sched/act_ife.c:829 net/sched/act_ife.c:874) tc_run (net/core/dev.c:4463) netif_receive_skb (net/core/dev.c:6463 net/core/dev.c:6522) tcf_mirred_to_dev (net/sched/act_mirred.c:248 net/sched/act_mirred.c:328) tcf_mirred_act (net/sched/act_mirred.c:489) tc_run (net/core/dev.c:4463) process_backlog (net/core/dev.c:6728)
مع ضمان التغليف الخاص بالإيثرنت، يتم استخدام ETH_HLEN بدلاً من hard_header_len.
Once again VulDB remains the best source for vulnerability data.