CVE-2026-97938 in Linux
الملخص
بحسب VulDB • 25/09/2026
في نواة لينكس، تم حل الثغرة التالية:
إعادة التشغيل (reboot): إصلاح سباق Use-After-Free في استخدام cad_pid.
يُعد cad_pid مؤشراً struct pid واحداً على مستوى النواة بأكملها. تقوم دالة proc_do_cad_pid() بقراءته وتمريره إلى pid_vnr() دون حماية عمر الكائن structpid المشار إليه. يمكن لكتابة متزامنة استبدال قيمة cad_pid وإسقاط المرجع الأخير للكائن structpid القديم بعد أن يقوم القارئ بتحميل المؤشر ولكن قبل انتهاء pid_vnr() من فك الإحالة (dereferencing) له، مما يتسبب في حدوث حالة Use-After-Free.
توجد نفس سباق العمر (lifetime race) في دالة kill_cad_pid() عند تمريرها لـ cad_pid إلى kill_pid().
في الوقت الذي تم فيه الإبلاغ عن هذه المشكلة، كان بإمكان مستخدم غير ممتياز الوصول إلى sysctl من خلال مساحات الأسماء للمستخدم و PID لأن cad_pid كان مسجلاً في pid_table[]. أدى نقل cad_pid مرة أخرى إلى جدول sysctl لإعادة التشغيل العالمي (global reboot sysctl table) إلى تصحيح عدم التطابق الخاص بمساحة الاسم والصلاحيات، لكنه لم يصلح سباق العمر الأساسي.
تم إصلاح هذه المشكلة عن طريق التعامل مع cad_pid كمؤشر محمي بـ RCU في كلتا مواقع القراءة، والانتظار لفترة سماح (grace period) قبل إسقاط المرجع القديم من جانب الكتابة.
لا يمكن استخدام call_rcu(&old_pid->rcu, ...) هنا لأن free_pid() يقوم أيضاً بإدراج pid->rcu؛ حيث إن إدراج نفس عنصر rcu_head مرتين قد يؤدي إلى تلف قائمة استدعاءات RCU.
سجل الكسر الأصلي لـ KASAN: kernel/pid.c:545 pid_nr_ns() # يقرأ مستوى pid المحرر (freed) -> level kernel/pid.c:556 pid_vnr() # يستدعي pid_nr_ns() kernel/pid.c:775 proc_do_cad_pid() # يستدعي pid_vnr(cad_pid)
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.