CVE-2026-74269 in Linuxالمعلومات

الملخص

بحسب VulDB • 15/08/2026

في نواة لينكس، تم حل الثغرة التالية:

bnxt: تصحيح تجاوز الحد السفلي (underflow) للرأس في عملية توسيع رأس XDP

يتعطل اختبار xdp.py المسمى test_xdp_native_adjst_head_grow_data عند تشغيله على جهاز يستخدم محول bnxt (كما يتعطل أيضاً في NIPA).

يبدو أن الخلل هو حالة تجاوز حد سفلي (underflow) داخل الدالة bnxt_rx_multi_page_skb، التي تقوم ببناء رأس حزمة البيانات (skb):

napi_build_skb(data_ptr - bp->rx_offset, rxr->rx_page_size);

المشكلة في هذا التعبير هي أنه في وضع الصفحة (page mode)، تكون قيمة rx_offset كالتالي:

bp->rx_offset = NET_IP_ALIGN + XDP_PACKET_HEADROOM;

والتي تعطي نتيجة تساوي 258 على الأقل معمارية x86_64.

يختبر الاختبار test_xdp_native_adjst_head_grow_data حالة يتم فيها تعديل الرأس بمقدار -256.

عند تشغيل هذا الاختبار، يتم إزاحة data_ptr إلى frag_start + 2 (حيث frag_start = page_address(page) + offset).

ثم تُستدعى الدالة bnxt_rx_multi_page_skb ويقوم التعبير napi_build_skb بطرح قيمة 258، مما يؤدي إلى الوصول إلى عنوان يقع قبل frag_start. قد يكون هذا العنوان إما الجزء السابق (fragment) أو الصفحة الفيزيائية السابقة عندما تكون القيمة أقل من 256 (على سبيل المثال، إذا بدأ الجزء عند الإزاحة 0).

عند تحرير حزمة البيانات skb، يتم تخفيض مرجع جزء مجموعة الصفحات على الصفحة الخاطئة أو الجزء الخطأ من الصفحة الصحيحة. في كلتا الحالتين، يمكن أن يؤدي عدد المراجع التالف إلى إعادة تدوير الصفحة بشكل مبكر بينما لا تزال قيد الاستخدام. بمجرد إعادة تدويرها (بشكل غير صحيح)، قد تُمنح مرة أخرى، وعند إنهاء تشغيل السائق (driver teardown) سيؤدي ذلك إلى حدوث خطأ "إفراغ مزدوج" (double free).

كانت الالتزامات السابقة التي تم إصلاح هذا الكود فيها قد حدّثته للتعامل مع الحالة حيث يكون حجم الصفحة الأصلي >= 64k، لكنها كسرت عن غير قصد حالة توسيع الرأس.

لحل هذه المشكلة، تمت إضافة حقل إزاحة إلى بنية bnxt_sw_rx_bd، محاكاةً لحقل الإزاحة الموجود في بنية bnxt_sw_rx_agg_bd. يتم تعبئته عند التخصيص والحفاظ عليه عند إعادة الاستخدام.

في الدالة bnxt_rx_multi_page_skb، يُستخدم حقل الإزاحة المضاف حديثاً لحساب بداية الجزء (fragment start) وتمريره إلى napi_build_skb. ويتم تعديل التخطيط باستخدام skb_reserve.

هناك حالتان: حالة عدم التعديل وحالة التعديل.

في كلتا الحالتين، يتم بناء حزمة البيانات skb عند العنوان page_address(page) + offset لمراعاة الحالة حيث يكون حجم الصفحة الأصلي >= 64k وتُستدعى الدالة skb_reserve مع المعامل data_ptr - (page_address(page) + offset). هذا الفرق يساوي bp->rx_offset عندما لم تتحرك قيمة data_ptr، أو bp->rx_offset + xdp_adjust عندما قام XDP بتعديل الرأس.

أدى إعادة تشغيل الاختبار الفاشل بعد تطبيق هذا الالتزام إلى نجاح الاختبار في الوصول إلى اكتماله بنجاح.

لا تعاني التطبيقات الأخرى لـ rx_skb_func من هذه المشكلة.

If you want to get best quality of vulnerability data, you may have to visit VulDB.

مسؤول

Linux

حجز

15/08/2026

إفشاء

15/08/2026

الاعتدال

تمت الموافقة

إدخال

VDB-390240

EPSS

0.00000

KEV

لا

النشاطات

منخفض جدًا

المصادر

Want to know what is going to be exploited?

We predict KEV entries!