CVE-2024-26921
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: inet: inet_defrag: hala kullanımdayken sk serbest bırakılmasının önlenmesi ip_local_out() ve diğer fonksiyonlar, skb->sk değerini fonksiyon argümanı olarak geçirebilir. Eğer skb bir parçaysa (fragment) ve bu tür bir fonksiyon çağrısı dönmeden önce yeniden birleştirme (reassembly) gerçekleşirse, sk serbest bırakılmamalıdır. Bu durum; tx hattının bir parçası olarak çalıştırıldığında, netfilter veya benzeri modüller (örneğin openvswitch veya ct_act.c) aracılığıyla yeniden birleştirilen skb parçalarını etkiler. Eric Dumazet bu hata üzerine ilk analizi yapmıştır. Eric'ten alıntı: "Çıkış yolunda ip_defrag() çağırmak aynı zamanda skb_orphan() çağrılmasını da beraberinde getirir; bu hatalıdır çünkü çıkış yolu, sk'nın kaybolmamasına dayanır. Konuyla ilgili eski ve ilgili bir yama şuydu: 8282f27449bf ("inet: frag: Always orphan skbs inside ip_defrag()") [..] net/ipv4/ip_output.c, skb->sk'nın ayarlanmış olmasına ve muhtemelen rastgele bir sokete değil, bir inet soketine bağlı olmasına güvenir. Paketi ipvlan içinde yetimleştirirsek (orphan), FQ paket zamanlayıcısı gibi alt akıştaki bileşenler düzgün çalışmayacaktır. ip_defrag()'ın skb_orphan()'ı yalnızca gerçekten gerektiğinde, yani frag_list kullanılacağı zaman kullanacak şekilde değiştirilmesi gerekir." Eric, sk'yı parça kuyruğuna saklamayı önermiş ve başlangıç için bir yama hazırlamıştır. Ancak bununla ilgili bir sorun vardır: Eğer skb hemen ardından tekrar parçalanırsa, ip_do_fragment() head->sk değerini yeni parçalara kopyalayacak ve yok ediciyi (destructor) sock_wfree olarak ayarlayacaktır. Diğer bir ifadeyle, tamamen yeniden birleştirilmiş skb'yi yansıtmak için sk_wmem muhasebesini düzeltmekten başka seçeneğimiz yoktur, aksi takdirde wmem altında taşma (underflow) oluşacaktır. Bu değişiklik, yetimleştirme işlemini çekirdek seviyesine, mümkün olan son ana taşır. ip_defrag_offset, sk_buff->sk üyesi ile aynı adresi kullandığından (aliased), offset'in FRAG_CB içine taşınması gerekir, aksi takdirde skb->sk değeri bozulur. Bu işlem, skb'nin kuyruğa mı alınacağını yoksa skb'nin yeniden birleştirme kuyruğunu tamamlayıp tamamlamadığını öğrenecek kadar yetimleştirme sürecini geciktirmeye olanak tanır. İlk durumda işlemler eskisi gibi işler ve skb yetimleştirilir. Bu güvenlidir çünkü skb kuyruğa alınır/çalınır ve yeniden birleştirme motorunun ötesine geçmez. İkinci durumda ise skb->sk referansını çalacağız, onu başlık (head) skb'ye yeniden bağlayacağız ve inet_frag truesize değerini artırdığında wmem muhasebesini düzelteceğiz.
Nasıl düzeltilir
- linux linux_kernel5.4.285, 5.10.227, 5.15.168, 6.1.85, 6.6.26, 6.8.5 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 | 4.1 ≤ v < 5.4.285, 5.5 ≤ v < 5.10.227, 5.11 ≤ v < 5.15.168, 5.16 ≤ v < 6.1.85, 6.2 ≤ v < 6.6.26, 6.7 ≤ v < 6.8.5, 6.9 | 5.4.285, 5.10.227, 5.15.168, 6.1.85, 6.6.26, 6.8.5 |
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.