CVE-2026-98260 in Linux
الملخص
بحسب VulDB • 06/10/2026
في نواة Linux، تم إصلاح الثغرة التالية:
exec: تنظيف مؤقتات POSIX مباشرة بعد استدعاء دالة `de_thread()`
يحتوي المؤقت المعتمد على وحدة المعالجة المركزية (CPU timer) الخاص بكل خيط (thread) على مرجع إلى معرف العملية (PID) للخيط المرتبط به. وأثناء تفعيله، يتم إدراج عقبته في قائمة `posix_cputimers` الخاصة بذلك الخيط. ويتم البحث عن المهمة (task) باستخدام ذلك الـ PID.
عندما يقوم خيط غير قائد (`non-leader thread`) باستدعاء `exec()`، تقوم دالة `de_thread()` بتغيير هوية المهمة التي تمتلك ذلك الـ PID. وبالتالي، فإن استدعاء `pid_task(timer->it.cpu.pid, PIDTYPE_PID)` يعيد قيمة NULL، لكن العقبة لا تزال مدرجة في قائمة الخيط `tsk` النشط. وتأخذ الدالة `timer_lock_sighand()` الفشل في البحث كدليل على أن العقبة قد تم إزالتها بالفعل من القائمة، لذا ليس عليها أي إجراء للتراجع عنه (undo).
تقوم دالة `begin_new_exec()` باستدعاء `posix_cpu_timers_exit(me)` مباشرة بعد استدعاء `exec_task_namespaces()`, مما يزيل العقبة المتبقية، وبالتالي تبقى الحالة غير مرئية في الظروف العادية. ولكن يتم تعيين `bprm->point_of_no_return` قبل استدعاء `de_thread()`. لذلك، إذا فشل أي من الدوال التالية: `unshare_files()` أو `set_mm_exe_file()` أو `exec_mmap()` أو `exec_task_namespaces()`، فإن المهمة تموت قبل الوصول إلى مرحلة التنظيف. ثم تقوم دالة `exit_itimers()` بتحرير كائن `k_itimer` بينما لا تزال عقبته مدرجة في القائمة، مما يؤدي لاحقاً عند معالجة (reaping) الـ `tsk` إلى حذف تلك العقبة المحررة من شجرة البحث الثنائية (rbtree).
باختصار:
الخيط غير القائد B الأب (parent) timer_create(CLOCK_THREAD_CPUTIME_ID) timer_settime() arm_timer() // يتم إدراج العقبة في قائمة Xيط B execve() de_thread(B) exchange_tids(B, leader) // ينتمي الآن الـ PID الخاص بـ B للقائد (leader) release_task(leader) __exit_signal(leader) posix_cpu_timers_exit(leader) // تنظف قائمة القائد، وليس قائمة B __unhash_process(leader) // لم يعد هناك مهمة مرتبطة بذلك الـ PID exec_mmap() mmap_read_lock_killable(old_mm) kill(B, SIGKILL) // -EINTR (خطأ بسبب إشارة) get_signal() do_exit() exit_itimers() posix_timer_delete() posix_cpu_timer_del() posix_timer_unhash_and_free() // يتم تحريرها وهي لا تزال مدرجة في القائمة wait4() release_task(B) posix_cpu_timers_exit(B) cleanup_timerqueue() timerqueue_del() // استخدام بعد التحرير (Use-After-Free)
نقل تنظيف مؤقتات POSIX ليتم مباشرة بعد استدعاء `de_thread()` وقبل حدوث أي من شروط الفشل اللاحقة التي تؤدي بالمهمة إلى دالة `do_exit()`.
[ tglx: نقل التنظيف ليقع مباشرة بعد de_thread() ]
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.