CVE-2024-43855
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: md: mddev_suspend ve flush bio arasındaki deadlock sorunu düzeltildi Bazı flush bio işlemleri devam ederken mddev askıya alındığında (suspended) bir deadlock meydana gelmektedir. Bu karmaşık bir sorundur. T1. ilk flush son aşamadadır, 'mddev->flush_bio' değerini temizler ve veriyi göndermeye çalışır ancak mddev, T4 tarafından askıya alındığı için engellenir. T2. ikinci flush 'mddev->flush_bio' değerini ayarlar ve halihazırda çalışan (T1) md_submit_flush_data()'yı kuyruğa eklemeye çalışır; eğer T1 ile aynı CPU üzerindeyse tekrar yürütülmez. T3. üçüncü flush active_io değerini artırır ve flush yapmaya çalışır, ancak 'mddev->flush_bio' değeri NULL olmadığı için (T2 tarafından ayarlanmıştır) engellenir. T4. mddev_suspend() çağrılır ve T3 tarafından artırılan active_io değerinin 0'a düşmesini bekler. T1 T2 T3 T4 (flush 1) (flush 2) (third 3) (suspend) md_submit_flush_data mddev->flush_bio = NULL; . . md_flush_request . mddev->flush_bio = bio . queue submit_flushes . . . . md_handle_request . . active_io + 1 . . md_flush_request . . wait !mddev->flush_bio . . . . mddev_suspend . . wait !active_io . . . submit_flushes . queue_work md_submit_flush_data . //md_submit_flush_data zaten çalışıyor (T1) . md_handle_request wait resume Temel sorun, flush işlemi sırasında active_io değişkeninin atomik olmayan şekilde artırılması/azaltılmasıdır. active_io, md_submit_flush_data kuyruğa alınmadan önce azaltılır ve md_submit_flush_data() çalıştıktan hemen sonra artırılır. md_flush_request active_io + 1 submit_flushes active_io - 1 md_submit_flush_data md_handle_request active_io + 1 make_request active_io - 1 Eğer active_io, submit_flushes() içinde değil de md_handle_request() fonksiyonundan sonra azaltılırsa, md_submit_flush_data() içindeki md_handle_request() yerine doğrudan make_request() çağrılabilir ve active_io tüm flush işlemi boyunca yalnızca bir kez artırılıp azaltılır. Böylece deadlock giderilmiş olur. Ek olarak, sorunun çözümü ile önceki durum arasındaki tek fark, make_request() için hata dönüş yönetimi olmamasıdır. Ancak önceki yamanın md_write_start() fonksiyonunu temizlemesinden sonra, make_request() yalnızca dm-raid tarafından raid5_make_request() içinde hata döndürmektedir (bkz. commit 41425f96d7aa ("dm-raid456, md/raid456: fix a deadlock for dm-raid456 while io concurrent with reshape")). dm her zaman veri ve flush operasyonlarını iki ayrı io işlemine böldüğü için, dm tarafından gönderilen flush işleminin io boyutu her zaman 0'dır ve md_submit_flush_data() içinde make_request() çağrılmayacaktır. Gelecekteki değişikliklerin sorunlara yol açmasını önlemek amacıyla, bu bağlamda make_request() fonksiyonunun hata döndürmediğinden emin olmak için WARN_ON eklenmiştir.
Nasıl düzeltilir
- linux linux_kernel6.1.103, 6.6.44, 6.10.3 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 | v < 6.1.103, 6.2 ≤ v < 6.6.44, 6.7 ≤ v < 6.10.3 | 6.1.103, 6.6.44, 6.10.3 |
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.