CVE-2025-37786
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: net: dsa: probe hatasında yönlendirme tablosunu serbest bırak dsa_tree_setup() fonksiyonunda complete = true ise, bu durum ağacın başarıyla probe edilen son anahtarı olduğumuz ve probe yolundaki tüm anahtarları kurmamız gerektiği anlamına gelir. "complete" değeri true olduktan sonra, dsa_tree_setup_cpu_ports() veya sonraki herhangi bir fonksiyon hata verebilir. Bu gerçekleştiğinde, tüm ağaç kurulumu belirsiz bir durumda kalır: ilk N-1 anahtar probe işlemini başarıyla tamamlamıştır (yalnızca ağacın dst->ports kısmında ve belki de dst->rtable kısmında kalıcı bellek tahsis etmişlerdir) ve N. anahtar probe işleminde başarısız olarak, kullanıcı açısından somut bir sonuç oluşmadan ağaç kurulum sürecini sonlandırmıştır. N. anahtar probe işleminde başarısız olursa, belleği (ports) serbest bırakılır ve dst->ports üzerinden kaldırılır. Ancak, dsa_link_touch() tarafından oluşturulan ve bu anahtarın portlarına işaret eden dst->rtable öğeleri orada kalmaya devam eder ve referans verildiğinde serbest bırakıldıktan sonra kullanım (use-after-free) durumuna yol açar. ds->ops->setup() fonksiyonunun bulunduğu yer olduğu için tamamen mümkün olan dsa_tree_setup_switches() fonksiyonu -EPROBE_DEFER döndürürse, şu şekilde bir kasan raporu alınır: ================================================================== BUG: KASAN: slab-use-after-free in mv88e6xxx_setup_upstream_port+0x240/0x568 Read of size 8 at addr ffff000004f56020 by task kworker/u8:3/42 Call trace: __asan_report_load8_noabort+0x20/0x30 mv88e6xxx_setup_upstream_port+0x240/0x568 mv88e6xxx_setup+0xebc/0x1eb0 dsa_register_switch+0x1af4/0x2ae0 mv88e6xxx_register_switch+0x1b8/0x2a8 mv88e6xxx_probe+0xc4c/0xf60 mdio_probe+0x78/0xb8 really_probe+0x2b8/0x5a8 __driver_probe_device+0x164/0x298 driver_probe_device+0x78/0x258 __device_attach_driver+0x274/0x350 Allocated by task 42: __kasan_kmalloc+0x84/0xa0 __kmalloc_cache_noprof+0x298/0x490 dsa_switch_touch_ports+0x174/0x3d8 dsa_register_switch+0x800/0x2ae0 mv88e6xxx_register_switch+0x1b8/0x2a8 mv88e6xxx_probe+0xc4c/0xf60 mdio_probe+0x78/0xb8 really_probe+0x2b8/0x5a8 __driver_probe_device+0x164/0x298 driver_probe_device+0x78/0x258 __device_attach_driver+0x274/0x350 Freed by task 42: __kasan_slab_free+0x48/0x68 kfree+0x138/0x418 dsa_register_switch+0x2694/0x2ae0 mv88e6xxx_register_switch+0x1b8/0x2a8 mv88e6xxx_probe+0xc4c/0xf60 mdio_probe+0x78/0xb8 really_probe+0x2b8/0x5a8 __driver_probe_device+0x164/0x298 driver_probe_device+0x78/0x258 __device_attach_driver+0x274/0x350 Hatayı düzeltmenin en basit yolu, yönlendirme tablosunu tamamen silmektir. dsa_link_touch() önce port çiftinin dst->rtable içinde zaten mevcut olup olmadığını kontrol edip yoksa tahsis ettiği için, N. anahtar dışındaki portlar arasındaki bağlantıları silmiş olsak bile dsa_tree_setup_routing_table() bunu yeniden oluştururken sorun yaşamaz. Yönlendirme tablosunun tamamen silinmesi işlemi halihazırda dsa_tree_teardown() içerisinde mevcuttur; bu nedenle söz konusu işlem, ağaç kurulum hata yolundan da çağrılabilecek bir fonksiyona dönüştürülmüştür. Sorumlu commit analizimde, sorunun dst->rtable'a dsa_link öğelerini ekleyen değişiklikten kaynaklandığı görülmektedir. Bundan önce her anahtarın kendi ds->rtable yapısı vardı ve anahtar probe işleminde başarısız olduğunda bu yapı serbest bırakılıyordu. Ancak ağaç potansiyel olarak kalıcı bellektir.
Nasıl düzeltilir
- linux linux_kernel6.6.88, 6.12.25, 6.14.4 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 | 5.5 ≤ v < 6.6.88, 6.7 ≤ v < 6.12.25, 6.13 ≤ v < 6.14.4, 6.15 | 6.6.88, 6.12.25, 6.14.4 |
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.