CVE-2025-37786
Təsvir
Linux kernel-də aşağıdakı zəiflik aradan qaldırılıb: net: dsa: probe uğursuz olduqda marşrutlaşdırma cədvəlinin azad edilməsi Əgər dsa_tree_setup() funksiyasında complete = true olarsa, bu o deməkdir ki, biz uğurla probe olunan ağacın sonuncu keçid cihazıyığıq (switch) və probe yolumuzdakı bütün keçid cihazlarını qurmalıyıq. "complete" dəyişəni true olduqdan sonra dsa_tree_setup_cpu_ports() və ya hər hansı növbəti funksiya uğursuz ola bilər. Bu baş verdikdə, bütün ağac qurulumu qeyri-müəyyən vəziyyətə düşür: ilk N-1 keçid cihazı probe prosesini uğurla tamamlayıb (yalniz ağacın dst->ports və bəlkə də dst->rtable hissələrində daimi yaddaş ayırıblar), lakin N-ci keçid cihazının probe prosesi uğursuz olur və istifadəçi baxımından heç bir nəticə əldə olunmadan ağacın qurulma prosesi sona çatır. N-ci keçid cihazının probe prosesi uğursuz olduqda, onun yaddaşı (ports) azad edilir və dst->ports-dan silinir. Lakin dsa_link_touch() tərəfindən yaradılan və həmin portlara işarə edən dst->rtable elementləri orada qalır və referans verildikdə use-after-free xətasına səbəb olur. Əgər dsa_tree_setup_switches() funksiyası -EPROBE_DEFER qaytararsa (ki, bu tamamilə mümkündür, çünki ds->ops->setup() məhz burada yerləşir), belə bir kasan hesabatı alırıq: ================================================================== 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 Bu xətanı düzəltməyin ən sadə yolu marşrutlaşdırma cədvəlini tamamilə silməkdir. Hətta N-ci keçid cihazından başqa digər portlar arasındakı bağlantıları silsək belə, dsa_tree_setup_routing_table() onu yenidən yaratmaqda problem yaşamayacaq, çünki dsa_link_touch() əvvəlcə port cütünün dst->rtable-da mövcud olub-olmadığını yoxlayır və yoxdursa, ayırır. Marşrutlaşdırma cədvəlinin tamamilə silinməsi artıq dsa_tree_teardown() funksiyasında mövcuddur, ona görə də bunu ağac qurulumunun xəta yolundan da çağırıla bilən bir funksiyaya çevirmək lazımdır. Səhvin mənbəyi olan commit analizimə görə, bu, dst->rtable-a dsa_link elementlərini əlavə edən commit-dir. Ondan əvvəl hər bir keçid cihazının öz ds->rtable-ı var idi və probe uğursuz olduqda bu azad edilirdi. Lakin ağac potensial olaraq daimi yaddaşdır.
Necə düzəltmək olar
- linux linux_kernel6.6.88, 6.12.25, 6.14.4 və ya daha yeni versiya
Təsirlənən məhsullar
| Məhsul | Təsirlənən versiyalar | Düzəldildiyi versiya |
|---|---|---|
| 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 |
Versiyanızı yoxlayın
Məhsulu seçin və istifadə etdiyiniz versiyanı yazın; versiyanın təsirlənən aralıqda olub-olmadığını görün.
Attack Surface Management
Domenlərinizə bağlı aktivləri, onlarda işləyən texnologiyaları və məlum zəiflikləri bir siyahıda görün.