CVE-2024-38613
Təsvir
Linux kernel-də aşağıdakı zəiflik aradan qaldırılmışdır: m68k: kernel thread yaradılması zamanı spinlock yarışının (race condition) düzəldilməsi Kontekst dəyişdirilməsi (context switching), 'prev' tapşırıqlarından 'next' tapşırıqlara keçid zamanı kilidin düzgün sahibinin saxlanmasını təmin edir. Bu, keçidin bütün müddəti ərzində kəsilmələrin (interrupts) deaktiv qalmasından asılıdır. Bu şərt normal proses yaradılması və artıq işləyən proseslər arasında kontekst dəyişdirilməsi üçün zəmanət edilir, çünki həm 'prev', həm də 'next' tapşırıqlarının status reyestrinin yadda saxlanılan nüsxələrində kəsilmələr artıq deaktiv edilmişdir. Yeni yaradılmış kernel thread-ləri üçün vəziyyət fərqlidir. copy_thread() funksiyasında status reyestri PS_S olaraq təyin edilir ki, bu da IPL-i 0 səviyyəsində saxlayır. switch_to() yaxud resume() funksiyasında 'next' thread-inin status reyestri bərpa edildikdən sonra kəsilmələr vaxtından əvvəl aktivləşir. Daha sonra resume() funksiyası ret_from_kernel_thread() və schedule_tail() vasitəsilə geri dönür və burada run queue kilidi sərbəst buraxılır (bax: finish_task_switch() və finish_lock_switch()). finish_task_switch() funksiyasında kilid sərbəst buraxılmamışdan əvvəl scheduler_tick() funksiyasını çağıran taymer kəsilməsi, kilidin artıq götürüldüyünü və cari tapşırığın kilid sahibi olduğunu aşkar edəcək. Bu, Guenter Roeck tərəfindən bildirilmiş spinlock rekursiya xəbərdarlığına səbəb olur. Müəyyən etdiyim qədər, bu yarış 533e6903bea0 ("m68k: split ret_from_fork(), simplify kernel_thread()") commit-i ilə ortaya çıxmışdır, lakin kernel tarixini detallı şəkildə araşdırmadığım üçün bu, həmin commit-dən daha əvvəl də ola bilər. Kernel thread-ləri üçün yadda saxlanılan status reyestri nüsxəsində kəsilmələr deaktiv edilə bilməz (istifadəçi sahəsi nəhayət başladığı zaman init kəsilmələrin deaktiv olması ilə bağlı xəta verəcək). resume() funksiyasında tapşırıqların reyestr dəstlərini dəyişdirərkən kəsilmələri müvəqqəti olaraq deaktiv edin. Qeyd edək ki, sr bərpa edildikdən sonra sadə bir oriw 0x700,%sr kifayət deyil - bu, 'spinlock recursion' xəbərdarlığının hələ də müşahidə olunması üçün kifayət qədər yarış imkanı saxlayır. ARAnyM və qemu (Quadra 800 emulyasiyası) üzərində test edilmişdir.
Necə düzəltmək olar
- linux linux_kernel4.19.316, 5.4.278, 5.10.219, 5.15.161, 6.1.93, 6.6.33, 6.8.12, 6.9.3 və ya daha yeni versiya
Təsirlənən məhsullar
| Məhsul | Təsirlənən versiyalar | Düzəldildiyi versiya |
|---|---|---|
| linux linux_kernel | 3.7 ≤ v < 4.19.316, 4.20 ≤ v < 5.4.278, 5.5 ≤ v < 5.10.219, 5.11 ≤ v < 5.15.161, 5.16 ≤ v < 6.1.93, 6.2 ≤ v < 6.6.33, 6.7 ≤ v < 6.8.12, 6.9 ≤ v < 6.9.3 | 4.19.316, 5.4.278, 5.10.219, 5.15.161, 6.1.93, 6.6.33, 6.8.12, 6.9.3 |
Versiyanızı yoxlayın
Məhsulu seçin və istifadə etdiyiniz versiyanı yazın; versiyanın təsirlənən aralıqda olub-olmadığını görün.
Attack Surface Management
Domenlərinizə bağlı aktivləri, onlarda işləyən texnologiyaları və məlum zəiflikləri bir siyahıda görün.