CVE-2024-49998
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: net: dsa: kapatma dizisi iyileştirildi Alexander Sverdlin, lan9303 sürücüsü ile kapatma sırasında iki sorun tespit etmiştir. Bunlardan biri lan9303'e özgüdür, diğeri ise tesadüfen orada yeniden üretilmektedir. İlk sorun, lan9303'ün "rastgele çalışma zamanında" (probe, shutdown veya remove aşamalarında değil) dev_get_drvdata() fonksiyonunu çağırmasıyla diğer DSA sürücülerinden ayrılmasıdır: phy_state_machine() -> ... -> dsa_user_phy_read() -> ds->ops->phy_read() -> lan9303_phy_read() -> chip->ops->phy_read() -> lan9303_mdio_phy_read() -> dev_get_drvdata() Ancak phy_state_machine() hiçbir zaman durdurulmaz, bu nedenle dsa_switch_shutdown() işleminden sonra çalışmaya devam edebilir. Tüm DSA sürücülerindeki ortak modelimiz, sonrasında gelebilecek remove() metodunu engellemek için drvdata değerini NULL olarak ayarlamaktır. Ancak bu durumda, bu işlem bir NPD (Null Pointer Dereference) ile sonuçlanacaktır. İkinci sorun ise dp->conduit->dsa_ptr = NULL; şeklinde yaptığımız atamanın paket alma işlemiyle eşzamanlı olmasıdır. dsa_switch_rcv(), dev->dsa_ptr değerinin NULL olup olmadığını bir kez kontrol eder ancak sonrasında, bu NULL olmayan değeri kullanmaya devam etmek yerine, dev->dsa_ptr tekrar tekrar NULL kontrolleri yapılmadan referans alınmaktadır: dsa_conduit_find_user() ve diğer birçok yer. Referans alımları arasında, bir kez geçerli olanın geçerli kalmaya devam ettiğini garanti edecek herhangi bir kilitleme mekanizması yoktur. Her iki sorunun da ortak yönü, conduit arayüzünün kapatılmasının bunları çözmesidir. İlk durumda, dev_close(conduit), dsa_user_netdevice_event() içindeki NETDEV_GOING_DOWN olayını tetikler ve bu da kullanıcı portlarını kapatır. dsa_port_disable_rt(), phylink durum makinesini senkron olarak durduran phylink_stop() fonksiyonunu çağırır ve böylece ds->ops->phy_read() bu noktadan sonra artık sürücüye erişmeyecektir. İkinci durumda, Documentation/networking/driver.rst belgesine göre dev_close(conduit) şunu yapmalıdır: | Quiescence | ---------- | | ndo_stop rutini çağrıldıktan sonra donanım herhangi bir veri almamalı | veya iletmemelidir. Yoldaki tüm paketler iptal edilmelidir. Gerektiğinde, | herhangi bir sıfırlama komutunun tamamlanması için sorgulama yapın veya bekleyin. Bu nedenle, daha sonra conduit->dsa_ptr değerini sıfırladığımızda, bu conduit üzerinde eşzamanlı bir dsa_switch_rcv() çağrısı olmayacağından emin olmak yeterli olacaktır. netif_device_detach() fonksiyonunun eklenmesi, kullanıcı portlarındaki ioctl, rtnetlink ve ethtool isteklerinin artık sürücüye iletilmemesini sağlamak içindir; çünkü artık bunları işleyecek durumda değiliz. Yarış durumu (race condition), 0650bf52b31f ("net: dsa: be compatible with masters which unregister on shutdown") commit'i dsa_switch_shutdown() fonksiyonunu ilk tanıttığında aslında mevcut değildi. Bu durum, kullanıcı arayüzlerini hatalı bir noktadan kaydetmeyi bıraktığımızda ve bu diziyi conduit->dsa_ptr'nin yarışa açık bir şekilde sıfırlanmasıyla (arayüzlerin yukarıda olmadığından emin olmayan bir yöntemle) değiştirdiğimizde ortaya çıkmıştır.
Nasıl düzeltilir
- linux linux_kernel5.16, 5.17, 6.10.14, 6.11.3 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.15.155 ≤ v < 5.16, 5.16.10 ≤ v < 5.17, 5.17 ≤ v < 6.10.14, 6.11 ≤ v < 6.11.3, 6.12 | 5.16, 5.17, 6.10.14, 6.11.3 |
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.