CVE-2022-50483

Yüksek

Açıklama

Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: net: enetc: xdp_do_redirect() hatasında arabellek sızıntılarının önlenmesi enetc_clean_rx_ring_xdp(), xdp_do_redirect() fonksiyonunu çağırmadan önce, RX halkasındaki orig_i ve i indeksleri arasındaki her bir yazılım BD'sinin sayfasında iki farklı referans sayacı (refcount) değerinden biri olabilir. İşlenen mevcut arabelleğin sahibi olduğumuz için referans sayacı en az 1 olacaktır. RX halkasında tam karşıt indeksteki arabelleğin mevcut sahibi henüz kfree() fonksiyonunu çağırmamışsa, bu sayfanın referans sayacı 2 bile olabilir. enetc_flip_rx_buff() içerisindeki enetc_page_reusable(), sayfa referans sayacını 1 ile karşılaştırır ve eğer değer 2 ise sayfayı yeniden kullanmayı denemez. Ancak enetc_flip_rx_buff() çağrısı xdp_do_redirect() çağrısından sonraya konulursa, sayfa referans sayacı üç farklı değerden birine sahip olabilir. Diğer sayfa yarısının bir sahibi yoksa ve bu arabellek için yapılan xdp_do_redirect() işlemi devmap/cpumap toplu kuyruğunun boşaltılmasını tetikleyecek kadar ilerlemişse ve bu toplu kuyrukların tüketicileri de xdp_do_redirect() yürütmeyi enetc'ye geri döndürene kadar arabelleği serbest bırakmışsa, referans sayacı 0 da olabilir. Bu durum, enetc_flip_rx_buff()'ın neden xdp_do_redirect()'dan önce çağrıldığının sebebidir; ancak bu mantıkta büyük bir hata vardır: enetc_flip_rx_buff(), enetc_page_reusable() dalının her iki tarafında da rx_swbd->page = NULL olarak ayarlar ve xdp_do_redirect() bir hata döndürdüğünde, bunu düzgün şekilde yönetmeyen enetc_xdp_free() fonksiyonunu çağırırız. Aslında gerçekleşen olay oldukça özeldir. Sayfa referans sayıları 1 olarak başlar. enetc_flip_rx_buff() bunların yeniden kullanılabilir olduğunu belirler, bu rx_swbd->page işaretçilerini enetc_reuse_page() aracılığıyla farklı bir rx_swbd'ye aktarır ve referans sayacını 2'ye çıkarır. Daha sonra xdp_do_redirect() bir hata döndürdüğünde, hiçbir işlem yapmayan (no-op) enetc_xdp_free() fonksiyonunu çağırırız ancak o sayfanın referansını hala kaybetmemişizdir. Bir kopyası hala rx_ring->next_to_alloc konumundadır, fakat bunun referans sayısı 2'dir (ve referans sayısını düşürecek eşzamanlı başka sahipleri yoktur). Sistemi asıl çökerten şey, rx_swbd->page işlemini ikinci kez gerçekleştirdiğimizde olur. Güncellenmiş 2 referans sayacı ile sayfa yeniden kullanılabilir olmayacaktır ve böylece gerçekten sızıntı oluşacaktır. Ardından enetc_new_page() daha fazla sayfa tahsis etmek zorunda kalacak ve bunlar da xdp_do_redirect()'dan gelen sonraki hatalarda tekrar sızacaktır. Özetle sorun, rx_swbd->page ile işimiz tamamen bitmeden onu sıfırlamamızdır ve bu durum hata yolunun onunla ilgili herhangi bir işlem yapmasını imkansız hale getirir. Paket potansiyel olarak çoklu arabellekli olduğu ve dolayısıyla rx_swbd->page potansiyel olarak bir dizi olduğu için, eski işaretçilerin enetc_flip_rx_buff() ve enetc_xdp_free() arasında manuel olarak aktarılması biraz zordur. Basit bir çözüm uygulamak adına, xdp_do_redirect() ile yarış durumu (race condition) olasılığını kabul ediyoruz ve çevirme (flip) prosedürünü yalnızca yönlendirme başarı yolu üzerinde çalışacak şekilde taşıyoruz. Yarış durumu ile kastettiğim, sayfanın enetc tarafından (referans sayacı 0 olduğu için) yeniden kullanılamaz olarak değerlendirilmesidir; ancak bu durumda da herhangi bir sızıntı olmayacaktır. Bunu kabul ettiğimizde, XDP_REDIRECT hatası durumunda arabelleklerle yapabileceğimiz daha iyi bir işlem ortaya çıkmaktadır. Henüz yarım sayfa çevirme işlemini gerçekleştirmediğimiz için bunu yapmayacağız (böylece tüm sayfayı slab tahsis edicisine veren enetc_xdp_free() fonksiyonundan tamamen kaçınabiliriz). Bunun yerine, arabelleğin bu yarısını RX halkasına geri dönüştürecek olan enetc_xdp_drop() fonksiyonunu çağıracağız.

ÖnemYüksek
CVSS7.5
İstismar olasılığı—
ÜrünLinux Kernel
Yayın4 Eki 2025
İlk görülme4 Eki 2025

Nasıl düzeltilir

Güncelleyin
  • linux linux_kernel5.15.86, 6.0.16, 6.1.2 ya da sonraki bir sürüm

Etkilenen ürünler

ÜrünEtkilenen sürümlerDüzeltildiği sürüm
linux linux_kernel5.13 ≤ v < 5.15.86, 5.16 ≤ v < 6.0.16, 6.1 ≤ v < 6.1.25.15.86, 6.0.16, 6.1.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.

Intelligence 360 paketinde

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.

CVE-2022-50483 · Linux Kernel · Dark Radar