CVE-2022-50220
Təsvir
Linux nüvəsində aşağıdakı zəiflik aradan qaldırılıb: usbnet: bağlantının kəsilməsi zamanı linkwatch-da yaranan use-after-free xətasının düzəldilməsi usbnet, yuxuya gedə bilən tapşırıqları yerinə yetirmək üçün usbnet_deferred_kevent() işini istifadə edir. Bağlantı kəsildikdə, bu işin tamamlanması əvvəllər ->ndo_stop() funksiyasında gözlənilirdi. Lakin 2003-cü ildə "[PATCH] USB: usbnet, prevent exotic rtnl deadlock" adlı tarixi commit ilə bu proses ->disconnect() funksiyasına köçürülüb: https://git.kernel.org/tglx/history/c/0f138bbfd83c Bu dəyişiklik həmin vaxt nüvənin workqueue tətbiqinin tək bir işin tamamlanmasını gözləməyə imkan verməməsi səbəbindən edilmişdi. Bütün işlərin tamamlanmasını gözləmək üçün flush_scheduled_work() çağırılmalı idi və bu, ->ndo_stop() daxilində rtnl_mutex tutulmuş halda usbnet_deferred_kevent() gözlənilərkən deadlock-a səbəb ola bilirdi. Həmin commit bir problemi həll etsə də, digərini yaratdı: aqc111.c, asix_devices.c, ax88179_178a.c, ch9200.c və smsc75xx.c USB Ethernet drayverlərində use-after-free xətasına yol açır: * Əgər drayverlər bağlantının kəsilməsindən dərhal əvvəl link dəyişikliyi interrupsiyası alarsa, onlar özlərinin (yuxuya gedə bilməyən) ->status() callback funksiyasında EVENT_LINK_RESET hadisəsini tetikləyir və usbnet_deferred_kevent()-i planlaşdırırlar. * usbnet_deferred_kevent() drayverin ->link_reset() callback funksiyasını çağırır, o isə netif_carrier_{on,off}() funksiyalarını çağırır. * Bu isə öz növbəsində linkwatch_event() işini planlaşdırır. usbnet_deferred_kevent() funksiyasının unregister_netdev()-dən sonra gözlənilməsi səbəbindən, netif_carrier_{on,off}() qeydiyyatdan çıxarılmış netdev üzərində əməliyyat apara bilər və linkwatch_event() free_netdev()-dən sonra işləyə bilər ki, bu da use-after-free xətasına səbəb olur. 2010-cu ildə 23f333a2bfaf ("drivers/net: don't use flush_scheduled_work()") commit-i ilə usbnet bütün işləri gözləmək əvəzinə, yalnız usbnet_deferred_kevent()-in tək bir nüsxəsini gözləyəcək şəkildə dəyişdirildi. Təəssüf ki, həmin commit gözləmə prosesini yenidən ->ndo_stop() funksiyasına qaytarmağı unutmuşdu. Bu çatışmazlıq nəhayət aradan qaldırıldı.
Necə düzəltmək olar
- linux linux_kernel4.9.326, 4.14.291, 4.19.256, 5.4.211, 5.10.137, 5.15.61, 5.18.18, 5.19.2 və ya daha yeni versiya
- git.kernel.org/stable/c/135199a2edd459d2b123144efcd7f9bcd95128e4
- git.kernel.org/stable/c/635fd8953e4309b54ca6a81bed1d4a87668694f4
- git.kernel.org/stable/c/7f77dcbc030c2faa6d8e8a594985eeb34018409e
- git.kernel.org/stable/c/8b4588b8b00b299be16a35be67b331d8fdba03f3
- git.kernel.org/stable/c/a69e617e533edddf3fa3123149900f36e0a6dc74
- git.kernel.org/stable/c/d2d6b530d89b0a912148018027386aa049f0a309
- git.kernel.org/stable/c/d49bb8cf9bfaa06aa527eb30f1a52a071da2e32f
- git.kernel.org/stable/c/db3b738ae5f726204876f4303c49cfdf4311403f
- git.kernel.org/stable/c/e2a521a7dcc463c5017b4426ca0804e151faeff7
Təsirlənən məhsullar
| Məhsul | Təsirlənən versiyalar | Düzəldildiyi versiya |
|---|---|---|
| linux linux_kernel | 2.6.38 ≤ v < 4.9.326, 4.10 ≤ v < 4.14.291, 4.15 ≤ v < 4.19.256, 4.20 ≤ v < 5.4.211, 5.5 ≤ v < 5.10.137, 5.11 ≤ v < 5.15.61, 5.16 ≤ v < 5.18.18, 5.19 ≤ v < 5.19.2 | 4.9.326, 4.14.291, 4.19.256, 5.4.211, 5.10.137, 5.15.61, 5.18.18, 5.19.2 |
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.