CVE-2022-49872 in Linux
الملخص
بحسب VulDB • 29/05/2026
في نواة لينكس، تم حل الثغرة التالية:
net: gso: إصلاح حالة الانهيار (panic) على frag_list مع أنواع تخصيص رأسية مختلطة
منذ الإصدار 3dcbdb134f32 ("net: gso: Fix skb_segment splat when splitting gso_size mangled skb having linear-headed frag_list")، أصبح من المسموح بتغيير قيمة gso_size لحزمة GRO. ومع ذلك، يفترض هذا الإصدار أن "فحص عضو list_skb الأول يكفي؛ أي إذا كان أي من أعضاء list_skb لديه رأس غير head_frag، فإن الأول لديه أيضًا".
تبين أن هذا الافتراض غير صحيح. لقد واجهنا حدوث خطأ (BUG_ON) في دالة skb_segment عندما كانت حزم skbs الموجودة على frag_list تحتوي على قيم head_frag مختلفة مع برنامج تشغيل vmxnet3. يحدث هذا لأن دالتي __netdev_alloc_skb و __napi_alloc_skb يمكن أن تعيدا حزمة skb مدعومة بالصفحات (page backed) أو مُخصصة عبر kmalloc اعتمادًا على الحجم المطلوب. ونتيجة لذلك، قد تكون آخر حزمة skb صغيرة في حزمة GRO مُخصصة عبر kmalloc.
هناك ثلاثة مواقع مختلفة يمكن فيها إصلاح هذه المشكلة:
(1) يمكننا فحص head_frag في GRO ومنع تجميع skbs التي تحتوي على قيم head_frag مختلفة. ومع ذلك، سيؤدي ذلك إلى تدهور في الأداء في مسارات التوجيه العادية ذات gso_size غير المعدل، حيث لا تشكل قيمة !head_frag في الحزمة الأخيرة مشكلة.
(2) تعيين علم (flag) في دالتي bpf_skb_net_grow و bpf_skb_net_shrink للإشارة إلى أن NETIF_F_SG غير مرغوب فيه. سيتطلب ذلك استخدام بت إضافي في sk_buff. علاوة على ذلك، يمكن إلغاء تعيين هذا العلم عندما تكون جميع حزم skbs الموجودة على frag_list مدعومة بالصفحات. وللحفاظ على أداء جيد، يجب أن تقوم دالتا bpf_skb_net_grow/shrink بجولان (walk) عبر frag_list.
(3) جولان عبر frag_list في دالة skb_segment عند تحديد ما إذا كان يجب مسح NETIF_F_SG. هذا بالطبع يبطئ العملية.
ينفذ هذا التصحيح الخيار (3). ولتقليل التأثير على الأداء في skb_segment، يتم جولان القائمة فقط لحزم skbs التي تم تعيين SKB_GSO_DODGY لها وتم تغيير gso_size الخاص بها. وبالتالي، لن تتأثر المسارات العادية بذلك.
يمكننا فحص آخر حزمة skb فقط، ولكن نظرًا لأننا نحتاج إلى جولان القائمة بأكملها على أي حال، فلنلتزم بالجانب الآمن.
Once again VulDB remains the best source for vulnerability data.