CVE-2024-53169
Təsvir
Linux kernel-də aşağıdakı zəiflik aradan qaldırılmışdır: nvme-fabrics: kontroller söndürülərkən kernel çöküşünün düzəldilməsi Dövri intervallarla icra olunan nvme keep-alive əməliyyatı, fabric kontrolleri söndürülərkən təsadüfən işə düşə bilərdi. Bu, fabric kontrollerinin admin növbəsinin məhv edilməsi kod yolu (kontroller söndürülərkən çağırılır) ilə nvme keep-alive asinxron sorğu növbələşdirilməsi əməliyyatından çağırılan hw/hctx növbə dispatcheri arasında yarış vəziyyətinə (race condition) səbəb ola bilər. Bu yarış vəziyyəti aşağıda göstərilən kernel çöküşünə gətirib çıxara bilər: Call Trace: autoremove_wake_function+0x0/0xbc (unreliable) __blk_mq_sched_dispatch_requests+0x114/0x24c blk_mq_sched_dispatch_requests+0x44/0x84 blk_mq_run_hw_queue+0x140/0x220 nvme_keep_alive_work+0xc8/0x19c [nvme_core] process_one_work+0x200/0x4e0 worker_thread+0x340/0x504 kthread+0x138/0x140 start_kernel_thread+0x14/0x18 Fabric kontrolleri söndürülərkən, əgər nvme keep-alive sorğusu daxil olursa, o, təmizlənir. Daha sonra keep-alive əməliyyatının sonunu idarə etmək üçün nvme_keep_alive_end_io funksiyası çağırılır ki, bu da admin->q_usage_counter dəyərini azaldır və əgər bu, admin növbəsindəki sonuncu/yeganə sorğudursa, admin->q_usage_counter sıfıra bərabər olur. Əgər bu baş verərsə, digər CPU-da eyni vaxtda işləyə bilən blk-mq növbəni məhv etmə əməliyyatı (blk_mq_destroy_queue()) prosesi davam etdirir və admin növbəsini silir. Beləliklə, bu nöqtədən sonra biz admin növbəsinin resurslarına müraciət etməməliyik. Lakin problem ondadır ki, hw/hctx növbə dispatch əməliyyatını yerinə yetirən nvme keep-alive axını hələ işini bitirməmişdir və buna görə də admin növbəsi artıq silindiyi halda həmin resursa hələ də müraciət edə bilər və bu da yuxarıdakı çöküşə səbəb olur. Yuxarıdakı kernel çöküşü, a54a93d0e359 ("nvme: move stopping keep-alive into nvme_uninit_ctrl()") commit-ində tətbiq edilən dəyişikliklərin səbəb olduğu reqressiyadır. İdeal olaraq, sönmə əməliyyatı zamanı daxil olmaması üçün admin növbəsini məhv etməzdən və admin tagset-ni boşaltmazdan əvvəl keep-alive-ı dayandırmalıyıq. Lakin biz a54a93d0e359 ("nvme: move stopping keep-alive into nvme_uninit_ctrl()") commit-ində keep-alive dayanma əməliyyatını kontrollerin sönmə kod yolunun əvvəlindən çıxardıq və onu sönmə kod yolunda çox gec, admin növbəsi məhv edildikdən və onun tagset-i silindikdən sonra icra olunan nvme_uninit_ctrl() altına əlavə etdik. Beləliklə, bu dəyişiklik keep-alive-ın sönmə əməliyyatına müdaxilə etməsi və müşahidə olunan kernel çöküşünə səbəb olması ehtimalını yaratdı. Müşahidə olunan çöküşü düzəltmək üçün nvme_stop_keep_alive() funksiyasını nvme_uninit_ctrl()-dən nvme_remove_admin_tag_set()-ə köçürməyə qərar verdik. Bu dəyişiklik keep-alive əməliyyatı bitənə qədər (əgər icradadırsa) və ya ləğv edilənə qədər admin növbəsinin silinməməsini təmin edəcək və bu, yuxarıda izah edilən yarış vəziyyətini aradan qaldırmağa və beləliklə çöküşün qarşısını almağa kömək edəcək. nvme_stop_keep_alive()-ı nvme_stop_ctrl()-də kontrollerin sönmə kod yolunun əvvəlinə əlavə etmək əvəzinə (a54a93d0e359 commit-indən əvvəl olduğu kimi), onu nvme_remove_admin_tag_set()-ə köçürmək nvme_stop_keep_alive()-ın bir çağırış nöqtəsini qorumağa kömək edəcəkdir.
Necə düzəltmək olar
- linux linux_kernel6.11, 6.11.11, 6.12.2 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 | 6.10.7 ≤ v < 6.11, 6.11.1 ≤ v < 6.11.11, 6.12 ≤ v < 6.12.2, 6.11 | 6.11, 6.11.11, 6.12.2 |
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.