CVE-2025-39948

Kritik

Açıklama

Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: ice: çoklu tampon çerçevelerdeki Rx sayfa sızıntısı düzeltildi ice_put_rx_mbuf() fonksiyonu, mevcut çerçevedeki her bir tampon için ice_put_rx_buf() çağrılmasını yönetir. Bu fonksiyon, ice sürücüsündeki çoklu tampon XDP desteğinin yönetimi kapsamında eklenmiştir. Fonksiyon, XDP programı yürütülmeden önce önbelleğe alınan, first_desc'den başlayarak çerçevenin toplam fragman sayısı artı 1'e kadar olan tamponlar üzerinde yineleme yaparak çalışır. Donanım boyutu 0 olan bir tanımlayıcı (descriptor) gönderdiğinde, ice_put_rx_mbuf() içinde kullanılan mantık bozulur. Bu tür tanımlayıcılar atlanır ve ice_add_xdp_frag içinde fragman olarak eklenmezler. Tampon bir fragman olarak sayılmadığından, ice_put_rx_mbuf() içinde üzerinden geçilmez ve dolayısıyla ice_put_rx_buf() çağrılmaz. ice_put_rx_buf() çağrılmadığı için sayfanın yeniden kullanılması veya serbest bırakılması denenmez. next_to_alloc artırılmadığı için bu durum halkada (ring) bayat bir sayfa kalmasına neden olur. ice_reuse_rx_page(), next_to_alloc değerinin uygun şekilde artırıldığını ve her zaman NULL sayfaya sahip bir tampona işaret ettiğini varsayar. Bu fonksiyon kontrol yapmadığı için, eski sayfanın takibini kaybederek next_to_alloc tamponunun üzerine bir sayfayı memnuniyetle geri dönüştürecektir. Bu sızıntının yalnızca çoklu tampon çerçeveler için meydana geldiğine dikkat edilmelidir. ice_put_rx_mbuf() fonksiyonu her zaman en az bir tamponu işlediğinden, tek tamponlu bir çerçeve her zaman doğru şekilde işlenecektir. Donanımın bazen neden boyut değeri 0 olan tanımlayıcılar ilettiği tam olarak belli değildir ancak bu durum, 9K MTU tarafından kullanılan "jumbo frames" ile nispeten düzenli olarak gerçekleşmektedir. ice_put_rx_mbuf() fonksiyonunu düzeltmek için, first_desc ve next_to_clean arasındaki tüm tamponlarda ice_put_rx_buf() çağrıldığından emin olmamız gerekir. Aynı amaçla kullanılan i40e içindeki benzer bir fonksiyonun mantığı ödünç alınmıştır. Aynı mantık ice_get_pgcnts() içinde de kullanılmıştır. Sadece fragman sayısı üzerinden yineleme yapmak yerine, mevcut indeks mevcut çerçevenin hemen ardından gelen next_to_clean öğesine ulaşana kadar yineleyen bir döngü kullanılır. i40e'nin aksine, ice_put_rx_mbuf() fonksiyonu paketin sonunu belirten çerçevenin son tamponunda da ice_put_rx_buf() çağrısını yapar. Doğrusal olmayan (çoklu tampon) çerçeveler için pagecnt_bias ayarlanırken dikkatli olunmalıdır. Bir XDP programı çerçevenin kuyruğundan fragmanları serbest bırakabilir; bu durumda söz konusu fragman sayfası zaten serbest bırakılmış olur. pagecnt_bias değerini yalnızca ilk tanımlayıcı ve XDP programı sonrası hala kalan fragmanlar için güncelleyin. Önemli bir önbellek kaçırmasını (cache miss) önlemek için yalnızca parçalanmış tamponların paylaşılan bilgilerine erişmeye özen gösterin. xdp_xmit değeri yalnızca bir XDP programı çalıştırılırsa ve paket başına yalnızca bir kez güncellenmelidir. ice_put_rx_mbuf() fonksiyonundaki xdp_xmit işaretçi argümanı kaldırılmıştır. Bunun yerine, xdp_xmit doğrudan ice_clean_rx_irq() fonksiyonunda ayarlanır. Bu işlem, argüman geçirme ihtiyacını ortadan kaldırır ve çerçevedeki her tampon için fazladan bir bit düzeyinde VEYA (OR) işlemi yapılmasını engeller. Döngü mantığı mevcut çerçevenin hemen ardından gelen öğenin indeksini gerektirdiğinden, ntc yerel değişkeninin artırımı, tüm ice_get_pgcnts() veya ice_put_rx_mbuf() çağrılarından *önce* güncellendiğinden emin olmak için taşınmıştır. Artık paketi tanımlamak için halkada bir indeks işaretçisi kullandığımızdan, rx_ring içindeki fragman sayısını takip etmemize veya önbelleğe almamıza gerek kalmamıştır.

ÖnemKritik
CVSS9.8
İstismar olasılığı—
ÜrünLinux Kernel
Yayın4 Eki 2025
İlk görülme4 Eki 2025

Nasıl düzeltilir

Güncelleyin
  • linux linux_kernel6.7, 6.12.49, 6.14, 6.16.9 ya da sonraki bir sürüm

Etkilenen ürünler

ÜrünEtkilenen sürümlerDüzeltildiği sürüm
linux linux_kernel6.6.78 ≤ v < 6.7, 6.12.14 ≤ v < 6.12.49, 6.13.3 ≤ v < 6.14, 6.14.1 ≤ v < 6.16.9, 6.14, 6.176.7, 6.12.49, 6.14, 6.16.9

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.