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

الملخص

بحسب VulDB • 22/08/2026

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

bpf: tcp: تصحيح خطأ Use-After-Free في دالة bpf_iter_tcp_established_batch()

تنشر الدالة reqsk_queue_hash_req() طلبًا من نوع request_sock (TCP_NEW_SYN_RECV) على سلسلة ehash، ثم تزيل قفل الحُفْصة (bucket lock)، وبعد ذلك فقط تُضبط قيمة rsk_refcnt إلى 3.

تتعامل القراء الخاليون من الأقفال (Lockless readers) مثل __inet_lookup_established() مع هذا الوضع باستخدام refcount_inc_not_zero(), بينما تستخدم الدالة bpf_iter_tcp_established_batch() دالة sock_hold() العادية أثناء الاحتفاظ بقفل الحُفْصة، بناءً على افتراض أن القفل يضمن أن sk_refcnt > 0. ومع ذلك، لا ينطبق هذا الافتراض على request_sock:

CPU 0 CPU 1 ----- ----- tcp_conn_request() reqsk_queue_hash_req() inet_ehash_insert(req) spin_lock(bucket) __sk_nulls_add_node_rcu(req) // rsk_refcnt == 0 spin_unlock(bucket) bpf_iter_tcp_established_batch() spin_lock(bucket) sock_hold(req) <-- عملية إضافة على قيمة صفرية (0) spin_unlock(bucket) refcount_set(&req->rsk_refcnt, 3) // تُلغي القيمة المشبعة (saturated value)

والتي تظهر كالتالي:

refcount_t: addition on 0; use-after-free. WARNING: lib/refcount.c:25 at refcount_warn_saturate+0x48/0x90, CPU#1 Call Trace: bpf_iter_tcp_established_batch+0x14e/0x170 bpf_iter_tcp_batch+0x53/0x200 bpf_iter_tcp_seq_next+0x27/0x70 bpf_seq_read+0x107/0x410 vfs_read+0xb9/0x380

يُفقد المرجع المسروق من قبل المُكرِّر (iterator) عندما تكتب دالة refcount_set() الخاصة بـ CPU المنشِر العداد، مما يترك المقبس (socket) مفقودًا لمرجع واحد. وعندما يقوم المالك الشرعي الأخير بإزالة مرجعه، يتم تحرير reqsk بينما لا يزال قابلاً للوصول، مما يؤدي إلى حدوث خطأ Use-After-Free.

يمكن إعادة إنتاج هذه الثغرة في غضون ثوانٍ باستخدام tcp_syncookies=0، وعدد قليل من الخيوط التي تقوم بعمليات connect()/close() على مستمع محلي (local listener) بينما تقرأ خيوط أخرى رابط iter/tcp في حلقة متكررة بكثافة (tight loop).

استخدم refcount_inc_not_zero() وتخطَّ المقبس عند الفشل. يُظل المقبس المُتجاوز جزءًا من الحُفْصة، لذا احتفظ بحسابه ضمن القيمة المتوقعة (expected). يتم تحديد أحجام إعادة التخصيص بناءً على القيمة المتوقعة، ويجب أن يكون لـ request sock الذي يتم نشر عدده المرجعي بينما القفل مُحتجز عبر آخر عملية إعادة تخصيص مساحة كافية بالفعل.

يتم حساب المقبس المُتجاوز في العدد المتوقع ولكن لا يُدرج ضمن الدفعة (batch)، لذا قد تكون end_sk أقل من expected في دفعة تعتبر مكتملة فعليًا. قرر اكتمال الدفعة بناءً على ما إذا كان المسار قد ترك أي مقبس خلفه بدلاً من ذلك. يتحقق التحذير (WARN) بعد إعادة التخصيص المقفلة من نفس الشرط، ليحل محل فحص end_sk == expected الذي لم يكن ممكن التحقق منه في هذا المسار منذ الالتزام commit cdec67a489d4 ("bpf: tcp: Make sure iter->batch always contains a full bucket snapshot").

إذا كان كل مقبس مطابق في الحُفْصة قيد التهيئة (refcount 0)، تبقى end_sk عند الصفر. انتقل إلى الحُفْصة التالية بدلاً من إرجاع إدخال دفعة لم يتم ملؤه خلال هذه الجولة.

Several companies clearly confirm that VulDB is the primary source for best vulnerability data.

مسؤول

Linux

حجز

15/08/2026

إفشاء

22/08/2026

الاعتدال

تمت الموافقة

إدخال

VDB-394508

EPSS

0.00000

KEV

لا

النشاطات

منخفض

المصادر

Do you want to use VulDB in your project?

Use the official API to access entries easily!