CVE-2026-92501
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: ext4: buffered write geri dönüşünden önce devam eden DIO işlemlerini boşaltın generic/746 testi, ext3 (no-extent inodes) üzerinde aralıklı olarak başarısız olmaya başladı. Test, 'Page cache invalidation failure on direct I/O' uyarılarını tetikliyor ve ardından gelen fsync işlemi -EIO döndürüyor. ext4_dio_write_iter() içerisindeki ext4_buffered_write_iter() ile filemap_write_and_wait_range() arasına 50ms gecikme eklemek, yarış durumunu neredeyse her zaman yeniden üretilebilir hale getiriyor. No-extent inode'larda, boşluklara yapılan DIO yazmaları yazılmamış extent'leri kullanamaz; bu nedenle ext4_iomap_alloc() m_flags=0 değerini bırakır ve ext4_map_blocks() 0 döndürür. Ardından iomap katmanı -ENOTBLK döndürerek buffered I/O'ya geri dönüşe neden olur. ext4_dio_write_iter() içindeki geri dönüş yolu, sayfaları kirleten ext4_buffered_write_iter()'ı çağırır, ardından temizleme (flush) ve geçersiz kılma (invalidate) işlemlerini gerçekleştirir. Ancak, ext4_buffered_write_iter()'ın dönmesi (inode kilidi serbest bırakılmış halde) ile sonraki temizleme+geçersiz kılma işlemleri arasında korumasız bir pencere bulunmaktadır. Diğer iş parçacıklarından gelen eşzamanlı asenkron DIO tamamlamaları, bu pencere sırasında kiocb_invalidate_post_direct_write() fonksiyonunu çalıştırabilir. Sayfalar yeniden kirletilmişse, geçersiz kılma sonrası işlem kirli sayfalar bulur, uyarıyı tetikler ve hata dizisinde -EIO ayarlar. İki adet 4k extent içeren bir dosyayı düşünün: [boşluk][yazılmış]. İş parçacığı A yazılmış extent'e DIO yaparken, iş parçacığı B her ikisini kapsayan bir DIO yapar: kworker A (4k DIO, tahsis edilmiş blok) kworker B (8k DIO, geri dönüş) ----------------------------------- ---------------------------- inode_lock_shared() inode_lock_shared() iomap_dio_rw(): iomap_dio_rw(): kiocb_invalidate_pages -> temiz iomap_begin -> -ENOTBLK submit_bio (asenkron) dio->size = 0 inode_unlock_shared() inode_unlock_shared() [blok katmanında bekleyen bio] /* geri dönüş: kilit serbest bırakıldı */ ext4_buffered_write_iter() inode_lock(exclusive) generic_perform_write() -> kirli sayfalar [0, 8k] inode_unlock(exclusive) /* sayfalar kirli, kilit yok */ [bio tamamlanır] filemap_write_and_wait_range() iomap_dio_complete() -> kirli sayfaları temizle kiocb_invalidate_post_direct_write() invalidate_mapping_pages() invalidate_inode_pages2_range() -> kirli sayfa bulundu! -> dio_warn_stale_pagecache() -> errseq_set(-EIO) Bu sorun, yalnızca kullanıcı alanından kasıtlı olarak örtüştürülen DIO yazmalarıyla değil, normal I/O yolları üzerinden de tetiklenebilir. Örneğin generic/746, birden fazla kworker'ın destekleyici dosyaya eşzamanlı I/O gönderdiği bir loop cihazı kullanır. Ek olarak, block_size < folio_size olduğunda, büyük bir folio paylaşan ancak örtüşmeyen DIO yazmaları da yarış durumunu tetikleyebilir. Devam eden tüm DIO işlemlerini boşaltmak için ext4_buffered_write_iter() içinde, ext4_write_checks() öncesine inode_dio_wait() eklenmiştir. Bu; tüm DIO'ların I/O göndermeden önce mevcut sayfaları temizlediğinden (kiocb_invalidate_pages() aracılığıyla), tüm BIO'ların tüm DIO'lar tamamlanana kadar beklediğinden (inode_dio_wait() aracılığıyla) ve ext4_write_checks()'in tüm tamamlanan DIO'lardan sonra inode boyutunu gözlemlediğinden emin olur; böylece ext4_block_zero_eof() devam eden DIO ile yarışmaz ve yarış durumu ortadan kaldırılır.
Nasıl düzeltilir
- Linux Linuxfd7e0dab20837b9ea1eeef7c26f78ace8ac8258c, f0af3ae09fb72382da1a5371bf6761b0264668e4, 7341e234927ff215f1d5d0bcfe04b74f53af378d, 74eee4ff9698a65b2e6e15dac0e50d6526ad5f20, d47cdadd6e49023f7ee248048463807f1214f1ee, 4e4e3eec506247c8f8bd8aaa1eb25e67016681a5, 9fd3ffc3c51c9deaba99bd7b338fff2d08f52416, 15cdefd0c0522f9d5e12d947fa04f4c11649b699 ya da sonraki bir sürüm
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| Linux Linux | 378f32bab3714f04c4e0c3aee4129f6703805550 ≤ v < fd7e0dab20837b9ea1eeef7c26f78ace8ac8258c, 378f32bab3714f04c4e0c3aee4129f6703805550 ≤ v < f0af3ae09fb72382da1a5371bf6761b0264668e4, 378f32bab3714f04c4e0c3aee4129f6703805550 ≤ v < 7341e234927ff215f1d5d0bcfe04b74f53af378d, 378f32bab3714f04c4e0c3aee4129f6703805550 ≤ v < 74eee4ff9698a65b2e6e15dac0e50d6526ad5f20, 378f32bab3714f04c4e0c3aee4129f6703805550 ≤ v < d47cdadd6e49023f7ee248048463807f1214f1ee, 378f32bab3714f04c4e0c3aee4129f6703805550 ≤ v < 4e4e3eec506247c8f8bd8aaa1eb25e67016681a5, 378f32bab3714f04c4e0c3aee4129f6703805550 ≤ v < 9fd3ffc3c51c9deaba99bd7b338fff2d08f52416, 378f32bab3714f04c4e0c3aee4129f6703805550 ≤ v < 15cdefd0c0522f9d5e12d947fa04f4c11649b699, 5.5 | fd7e0dab20837b9ea1eeef7c26f78ace8ac8258c, f0af3ae09fb72382da1a5371bf6761b0264668e4, 7341e234927ff215f1d5d0bcfe04b74f53af378d, 74eee4ff9698a65b2e6e15dac0e50d6526ad5f20, d47cdadd6e49023f7ee248048463807f1214f1ee, 4e4e3eec506247c8f8bd8aaa1eb25e67016681a5, 9fd3ffc3c51c9deaba99bd7b338fff2d08f52416, 15cdefd0c0522f9d5e12d947fa04f4c11649b699 |
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.