CVE-2024-47741
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: btrfs: aynı fd kullanılarak yapılan eşzamanlı lseek işlemlerinde dosya özel verisinin ayarlanmasındaki yarış durumu düzeltildi Aynı sürece ait birden fazla iş parçacığı kullanılarak aynı dosya tanımlayıcısı üzerinden eşzamanlı lseek(2) sistem çağrıları yapıldığında, bir yarış durumunun meydana geldiği ve bellek sızıntısına yol açabileceği kısa bir zaman penceresi bulunmaktadır. Yarış durumu şu şekilde gerçekleşmektedir: 1) Bir program bir dosya için dosya tanımlayıcısı açar ve ardından iki iş parçacığı oluşturur (örneğin pthreads kütüphanesi ile), bunlara görev A ve görev B diyelim; 2) Görev A, SEEK_DATA veya SEEK_HOLE ile lseek çağrısı yapar ve inode üzerinde okuma kilidi tutarken file.c:find_desired_extent() fonksiyonuna ulaşır; 3) find_desired_extent() başlangıcında, dosyanın private_data işaretçisini değeri NULL olan 'private' adlı yerel bir değişkene çıkarır; 4) Görev B de SEEK_DATA veya SEEK_HOLE ile lseek çağrısı yapar, inode'u paylaşımlı modda kilitler ve file.c:find_desired_extent() fonksiyonuna girer; burada o da file->private_data değerini değeri NULL olan kendi yerel 'private' değişkenine çıkarır; 5) Dosya özel verisinin NULL olduğunu gördüğü için görev A, bir özel yapı tahsis eder ve bunu dosya yapısına atar; 6) Görev B de dosya özel verisini NULL gördüğü için kendi dosya özel verisini tahsis eder ve her iki görev de aynı dosya tanımlayıcısını kullandığından bunu aynı dosya yapısına atar. Bu noktada, görev A tarafından tahsis edilen özel yapı sızdırılmış olur. Bellek sızıntısının yanı sıra, her iki görevin de özel yapıdaki aynı önbelleğe alınmış durum kaydını (struct btrfs_file_private::llseek_cached_state) kullanması detayı da mevcuttur; bu durum, bir görev kayıtla hala etkileşim halindeyken diğerinin onu serbest bırakabilmesi nedeniyle (yalnızca bir görev referans sayacı almıştır) bir serbest bırakıldıktan sonra kullanım (use-after-free) sorununa yol açabilir. Ayrıca, önbelleğe alınmış durumun paylaşılması, gelecekte hatalı sonuçlar doğurabileceği için iyi bir fikir değildir - şu an için bu bir sorun teşkil etmemektedir çünkü yalnızca önbelleğe alınmış durumu kullanmadan önce aralık doğrulaması yaptığımız extent-io-tree.c:count_range_bits() içerisinde kullanılmaktadır. Bu durum, inode'un spinlock'u tutulurken bir dosyanın özel veri atamasını ve kontrolünü koruyarak ve özel veriyi tahsis eden görevi takip ederek düzeltilmiştir; böylece hem önbelleğe alınmış durum kaydıyla ilgili serbest bırakıldıktan sonra kullanım sorunlarını önlemek hem de gelecekte potansiyel olarak yanlış kullanımın önüne geçmek amacıyla bu veri yalnızca tahsis eden görev tarafından kullanılır.
Nasıl düzeltilir
- linux linux_kernel6.6.54, 6.10.13, 6.11.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.2 ≤ v < 6.6.54, 6.7 ≤ v < 6.10.13, 6.11 ≤ v < 6.11.2 | 6.6.54, 6.10.13, 6.11.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.