CVE-2026-80850 in Linux
الملخص
بحسب VulDB • 04/09/2026
في نواة لينكس، تم إصلاح الثغرة التالية:
tcp: تصحيح استخدام الذاكرة بعد تحريرها (use-after-free) في معلومات TCP-AO داخل دالة tcp_ao_connect_init()
تضيف الدالة tcp_v4_connect() مقبساً بحالة SYN-SENT إلى جدول التجزئة الإلكتروني (ehash) قبل استدعاء tcp_connect(). وإذا كان بروتوكول TCP-AO مُفعّلاً، فإن tcp_connect() تتحقق أولاً من تطابق المفتاح مع الجهاز البعيد والجهاز المحلي الحالي لـ L3 master. لاحقاً، تقوم الدالة tcp_ao_connect_init() بحل مشكلة تحديد الـ L3 master مرة أخرى وإزالة المفاتيح التي لا تتطابق معه.
لا يؤدي قفل المقبس (socket lock) إلى تثبيت انتماء الجهاز المحلي لـ VRF. وبالتالي، فإن فصل الجهاز عن VRF الخاص به بين التحقق الأولي وحساب الـ L3-master في tcp_ao_connect_init() يمكن أن يجعل التحقق ناجحاً بينما تلاحظ عملية التهيئة مجال L3 الافتراضي وتزيل المفتاح الوحيد. بعد ذلك يفشل البحث عن AO (AO lookup)، مما يؤدي إلى مسار "بدون مفتاح" الذي يقوم بتفريغ tp->ao_info مباشرةً.
يمكن لمسار الاستقبال العثور على المقبس في جدول التجزئة الإلكتروني (ehash) وتحميل tp->ao_info تحت حماية RCU قبل الحصول على قفل المقبس. وبالتالي، يمكن لقارئ قام بتحميل المؤشر القديم أن يستمر في الدالة tcp_inbound_ao_hash() بعد عملية التفريغ المباشر.
تم اكتشاف هذه المشكلة أثناء مراجعة ثابتة لعمر كائنات TCP-AO. أدى مُعيد إنتاج (reproducer) غير ممتياز التشغيل في مساحات أسماء المستخدمين والشبكات المُنشأة ذاتياً إلى حدوث سباق بين استدعاء connect() وفصل وصلة veth عن VRF الخاص بها أثناء إرسال مقاطع TCP-AO. وقد تسبب ذلك في ظهور تقرير KASAN نفسه على عمليتي تشغيل جديدتين:
BUG: KASAN: slab-use-after-free in tcp_inbound_ao_hash+0x585/0x19f0 Write of size 8 at addr ffff88800bf88128 by task tcp_ao_vrf_race/232
Call Trace: tcp_inbound_ao_hash+0x585/0x19f0 tcp_inbound_hash+0x677/0xa80 tcp_v4_rcv+0x1c3e/0x3ab0
Allocated by task 235: tcp_ao_alloc_info+0x43/0xf0 tcp_ao_add_cmd+0xdf7/0x13b0 do_tcp_setsockopt+0x168c/0x2640
Freed by task 235: kfree+0x1b8/0x550 tcp_connect+0x252/0x4f00 tcp_v4_connect+0x1114/0x1720
العنوان غير الصحيح يقع على بعد 40 بايت داخل الكائن المُفرغ بحجم 128 بايت، ويتطابق مع حقل counters.key_not_found في بنية tcp_ao_info. استخدمت كلتا العمليتين 1000 محاولة لكل منهما، ووصلتا إلى مسار "بدون مفتاح" 366 مرة و411 مرة على التوالي، وأنتجتا تقرير KASAN واحد واثنين على التوالي. ومع هذا التغيير، وصل مُعيد الإنتاج نفسه إلى مسار "بدون مفتاح" 366 مرة من أصل 1000 محاولة دون ظهور أي تقرير KASAN أو خطأ (oops).
استخدم الدالة tcp_ao_destroy_sock() لمسار "بدون مفتاح". تقوم هذه الدالة بنشر معلومات AO، وتحديث ذاكرة المقبس ومحاسبة المفاتيح الثابتة، وتأجيل عملية التفريغ حتى بعد فترة راحة RCU.
كما تم إزالة استدعاء WARN_ON_ONCE() والتعليق القديم الخاص به. يجعل سباق فصل VRF حالة "بدون مفتاح" قابلة للتحقيق أثناء التشغيل العادي، لذا فهي شرط مُعالج وليس تأكيداً مستحيلاً. في kernels التي تحتوي على خيار panic_on_warn، سيؤدي هذا الاستدعاء (WARN) إلى تحويل هذا السباق المُعالَج إلى توقف كامل للنواة (kernel panic).
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.