CVE-2024-53169
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: nvme-fabrics: denetleyici kapatılırken meydana gelen kernel çökmesi düzeltildi Periyodik aralıklarla yürütülen nvme keep-alive işlemi, bir fabric denetleyicisi kapatılırken araya girebilir. Bu durum, fabric denetleyici admin kuyruğu yok etme kod yolu (denetleyici kapatılırken çağrılır) ile nvme keep-alive asenkron istek kuyruğa alma işleminden çağrılan hw/hctx kuyruk dağıtıcısı arasında bir yarış durumuna (race condition) yol açabilir. Bu yarış durumu, aşağıda gösterilen kernel çökmesine neden olabilir: 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 denetleyicisi kapatılırken eğer bir nvme keep-alive isteği araya girerse, bu istek temizlenecektir. Ardından, keep-alive işleminin sonunu yönetmek için nvme_keep_alive_end_io fonksiyonu çağrılır; bu fonksiyon admin->q_usage_counter değerini azaltır ve bunun admin kuyruğundaki son veya tek istek olduğu varsayıldığında admin->q_usage_counter sıfıra iner. Eğer bu gerçekleşirse, başka bir CPU üzerinde eş zamanlı olarak çalışıyor olabilecek blk-mq kuyruk yok etme işlemi (blk_mq_destroy_queue()), ilerlemeye devam eder ve admin kuyruğunu siler. Bu noktadan itibaren artık admin kuyruğu kaynaklarına erişilmemesi gerekir. Ancak buradaki sorun, hw/hctx kuyruk dağıtım işlemini yürüten nvme keep-alive iş parçacığının henüz işini bitirmemiş olmasıdır; dolayısıyla admin kuyruğu zaten silinmişken hala potansiyel olarak admin kuyruğu kaynağına erişebilir ve bu da yukarıdaki çökmeye neden olur. Yukarıdaki kernel çökmesi, a54a93d0e359 ("nvme: move stopping keep-alive into nvme_uninit_ctrl()") commit'inde uygulanan değişikliklerin neden olduğu bir regresyondur. İdeal olarak, kapatma işlemi sırasında araya girmemesi için admin kuyruğunu yok etmeden ve admin tagset'ini serbest bırakmadan önce keep-alive işlemini durdurmalıyız. Ancak, a54a93d0e359 ("nvme: move stopping keep-alive into nvme_uninit_ctrl()") commit'i ile keep-alive durdurma işlemini denetleyici kapatma kod yolunun başından kaldırdık ve bunu, kapatma kod yolunda oldukça geç aşamada, admin kuyruğu yok edildikten ve tagset'i kaldırıldıktan sonra yürütülen nvme_uninit_ctrl() altına ekledik. Dolayısıyla bu değişiklik, keep-alive işleminin araya girerek kapatma işlemiyle çakışması ve gözlemlenen kernel çökmesine neden olması olasılığını yaratmıştır. Gözlemlenen çökmeyi düzeltmek için nvme_stop_keep_alive() fonksiyonunu nvme_uninit_ctrl()'den nvme_remove_admin_tag_set()'e taşımaya karar verdik. Bu değişiklik, keep-alive işlemi tamamlanana (eğer yürütülüyorsa) veya iptal edilene kadar admin kuyruğunun silinmeyeceğini garanti edecek, böylece yukarıda açıklanan yarış durumunu önleyecek ve çökmeyi engelleyecektir. nvme_stop_keep_alive() fonksiyonunu nvme_remove_admin_tag_set()'e taşımak, a54a93d0e359 ("nvme: move stopping keep-alive into nvme_uninit_ctrl()") commit'inden önceki durumda olduğu gibi nvme_stop_ctrl() içerisindeki denetleyici kapatma kod yolunun başına eklemek yerine, bir adet nvme_stop_keep_alive() çağrı noktasının tasarruf edilmesini sağlayacaktır.
Nasıl düzeltilir
- linux linux_kernel6.11, 6.11.11, 6.12.2 ya da sonraki bir sürüm
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| 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 |
Sürümünüzü kontrol edin
Ürünü seçin ve kullandığınız sürümü yazın; sürümün etkilenen aralıkta olup olmadığını görün.
Attack Surface Management
Alan adlarınıza bağlı varlıkları, bu varlıklarda çalışan teknolojileri ve bilinen zafiyetleri tek listede görün.