CVE-2024-49998
Təsvir
Linux nüvəsində aşağıdakı zəiflik aradan qaldırılmışdır: net: dsa: söndürmə ardıcıllığının təkmilləşdirilməsi Alexander Sverdlin lan9303 drayveri ilə söndürmə zamanı iki problem təqdim edir. Bunlardan biri yalnız lan9303-ə xasdır, digəri isə sadəcə orada özünü göstərir. Birinci problem ondan ibarətdir ki, lan9303 bütün DSA drayverləri arasında dev_get_drvdata()-nı "təsadüfi iş vaxtında" (probe, shutdown və ya remove zamanı olmayan) çağıran yeganə drayverdir: 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() Lakin biz phy_state_machine()-i heç vaxt dayandırmırıq, buna görə də o, dsa_switch_shutdown()-dan sonra da işləməyə davam edə bilər. Bütün DSA drayverlərindəki ümumi yanaşmamız, sonradan gələ biləcək remove() metodunu sıradan çıxarmaq üçün drvdata-nı NULL olaraq təyin etməkdir. Lakin bu halda bu, NPD-yə səbəb olacaqdır. İkinci problem isə dp->conduit->dsa_ptr = NULL; təyinatımızın paketlərin qəbulu prosesi ilə eyni vaxtda baş verməsidir. dsa_switch_rcv() funksiyası dev->dsa_ptr-nin NULL olub-olmadığını bir dəfə yoxlayır, lakin bundan sonra həmin NULL olmayan dəyəri istifadə etməyə davam etmək əvəzinə, dev->dsa_ptr təkrar-təkrar NULL yoxlamaları olmadan dereference edilir: dsa_conduit_find_user() və bir çox digər yerlərdə. Dereference əməliyyatları arasında, bir dəfə etibarlı olanın etibarlı qalmasını təmin edən heç bir kilidləmə (locking) mexanizmi yoxdur. Hər iki problemin ortaq cəhəti odur ki, conduit interfeysinin bağlanması onları həll edir. Birinci halda, dev_close(conduit) dsa_user_netdevice_event()-də NETDEV_GOING_DOWN hadisəsini tetikləyir ki, bu da istifadəçi portlarını bağlayır. dsa_port_disable_rt() phylink_stop()-u çağırır, bu isə phylink vəziyyət maşınını sinxron şəkildə dayandırır və beləliklə, ds->ops->phy_read() artıq bu nöqtədən sonra drayveri çağırmayacaq. İkinci halda, Documentation/networking/driver.rst sənədinə uyğun olaraq, dev_close(conduit) bunu etməlidir: | Sakitləşmə (Quiescence) | ---------- | | ndo_stop rutini çağırıldıqdan sonra aparat heç bir məlumat qəbul etməməli və ya ötürməməlidir. Yolda olan bütün paketlər ləğv edilməlidir. Zərurət olduqda, hər hansı sıfırlama əmrlərinin tamamlanmasını gözləyin və ya sorğulayın. Beləliklə, daha sonra conduit->dsa_ptr-ni sıfırladıqda, bu conduit üzərində eyni vaxtda dsa_switch_rcv() çağırışının olmayacağını təmin etmək kifayət etməlidir. netif_device_detach() funksiyasının əlavə edilməsi istifadəçi portlarındakı ioctl-lərin, rtnetlink-lərin və ethtool sorğularının artıq drayverə ötürülməməsini təmin etmək üçündür - biz artıq onları emal etməyə hazır deyilik. Yarış şəraiti (race condition), 0650bf52b31f ("net: dsa: be compatible with masters which unregister on shutdown") commit-i ilk dəfə dsa_switch_shutdown()-u təqdim etdikdə əslində mövcud deyildi. O, daha sonra, istifadəçi interfeyslərini yanlış nöqtədən qeydiyyatdan çıxarmağı dayandırdığımızda yarandı və biz həmin ardıcıllığı conduit->dsa_ptr-nin riskli sıfırlanması ilə (interfeyslərin aktiv olmadığını təmin etməyən variantla) əvəz etdik.
Necə düzəltmək olar
- linux linux_kernel5.16, 5.17, 6.10.14, 6.11.3 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.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 |
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.