CVE-2022-49547
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: btrfs: boş veri alanı azaldığında eşzamanlı dio yazmaları arasındaki deadlock sorunu düzeltildi Doğrudan bir IO yazımı için veri alanı rezerve ederken, aynı dosya aralığına yazmaya çalışan birden fazla görev olduğunda, bu dosya aralığının kapsadığı birden fazla extent bulunduğunda, mevcut veri alanı düşük olduğunda ve yazmalar inode'un i_size değerini genişletmediğinde deadlock oluşabilir. Deadlock şu şekilde gerçekleşebilir: 1) i_size değeri 1M olan bir dosyamız var; 0 ofsetinde 128K boyutunda bir extent ve 128K ofsetinde yine 128K boyutunda başka bir extent bulunmaktadır; 2) Görev A, [0, 256K) dosya aralığına doğrudan bir IO yazımı yapar ve yazma işlemi i_size sınırı içinde olduğu için inode kilidini (VFS seviyesi) paylaşımlı modda alır; 3) Görev A, btrfs_dio_iomap_begin() fonksiyonunda [0, 256K) dosya aralığını kilitler ve ardından [0, 128K) aralığını kapsayan extent için extent haritasını alır. btrfs_get_blocks_direct_write() fonksiyonunda, söz konusu dosya aralığı ([0, 128K)) için sıralı bir extent oluşturur; 4) btrfs_dio_iomap_begin() fonksiyonundan dönmeden önce [0, 256K) dosya aralığının kilidini açar; 5) Görev A, btrfs_dio_iomap_begin() fonksiyonunu bu kez [128K, 256K) dosya aralığı için tekrar çalıştırır ve [128K, 256K) dosya aralığını kilitler; 6) Görev B de [0, 256K) dosya aralığına doğrudan bir IO yazımı başlatır. Yazım i_size sınırı içinde olduğu için o da inode'u paylaşımlı modda kilitler ve ardından [0, 256K) dosya aralığını kilitlemeye çalışır. [0, 128K) alt aralığını kilitleyebilir ancak [128K, 256K) aralığı şu anda Görev A tarafından kilitlendiği için bu aralık için beklemeye başlar; 7) Görev A, btrfs_get_blocks_direct_write() fonksiyonuna girer ve veri alanı rezerve etmeye çalışır. Mevcut boş alan düşük olduğu için asenkron veri geri kazanım (async data reclaim) görevini tetikler ve veri alanı rezerve etmek için bu görevi bekler; 8) Asenkron geri kazanım görevi, tüm mevcut sıralı extentlerin tamamlanmasını beklemeye karar verir (btrfs_wait_ordered_roots() aracılığıyla). Görev A tarafından daha önce [0, 128K) dosya aralığı için oluşturulan sıralı extent'i bulur ve bunun tamamlanmasını bekler; 9) [0, 128K) dosya aralığı için olan sıralı extent tamamlanamaz çünkü [0, 128K) dosya aralığını kilitlemeye çalışırken btrfs_finish_ordered_io() aşamasında bloklanır. Bu durum bir deadlock ile sonuçlanır çünkü: - Görev B, [0, 128K) dosya aralığını kilitli tutmakta ve [128K, 256K) aralığının Görev A tarafından kilidinin açılmasını beklemektedir; - Görev A, [128K, 256K) dosya aralığını kilitli tutmakta ve asenkron veri geri kazanım görevinin alan rezervasyon isteğini karşılamasını beklemektedir; - Asenkron veri geri kazanım görevi, [0, 128K) sıralı extent'inin tamamlanmasını beklemektedir, ancak sıralı extent tamamlanamaz çünkü [0, 128K) dosya aralığı şu anda Görev B tarafından kilitlidir; Görev B ise Görev A'nın [128K, 256K) dosya aralığının kilidini açmasını beklemekte, Görev A ise asenkron veri geri kazanım görevini beklemektedir. Bu durum dört görev arasında bir deadlock ile sonuçlanır: Görev A, Görev B, asenkron veri geri kazanım görevi ve sıralı extent tamamlama işlemini yapan görev (bir iş kuyruğu görevi). Bu tür bir deadlock, fstests'teki generic/300 test durumu tarafından ara sıra tetiklenebilir ve aşağıdaki gibi bir yığın izine (stack trace) neden olur: [12084.033689] INFO: task kworker/u16:7:123749 blocked for more than 241 seconds. [12084.034877] Not tainted 5.18.0-rc2-btrfs-next-115 #1 [12084.035562] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [12084.036548] task:kworker/u16:7 state:D stack: 0 pid:123749 ppid: 2 flags:0x00004000 [12084.036554] Workqueue: btrfs-flush_delalloc btrfs_work_helper [btrfs] [12084.036599] Call Trace: [12084.036601] <TASK> [12084.036606] __schedule+0x3cb/0xed0 [12084.036616] schedule+0x4e/0xb0 [12084.036620] btrfs_start_ordered_extent+0x109/0x1c0 [btrfs] [12084.036651] ? prepare_to_wait_exclusive+0xc0/0xc0 [12084.036659] btrfs_run_ordered_extent_work+0x1a/0x30 [btrfs] [12084.036688] btrfs_work_helper+0xf8/0x400 [btrfs] [12084.0367 ---truncated---
Nasıl düzeltilir
- linux linux_kernel5.16, 5.18.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 | 5.15.27 ≤ v < 5.16, 5.16.13 ≤ v < 5.18.3 | 5.16, 5.18.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.