CVE-2026-17050
Təsvir
Eksperimental USB host steki `usbh_device_set_configuration()` (`subsys/usb/host/usbh_device.c`) funksiyasında xüsusi `usb_device_heap`-dən hər cihaz üçün konfiqurasiya deskriptor buferi olan `udev->cfg_desc` ayırır. Üç uğursuzluq ssenarisində — tam uzunluqlu `GET_DESCRIPTOR(CONFIGURATION)` oxumasının uğursuz olması, qısa və tam deskriptor oxumaları arasındakı uyğunsuzluq və `parse_configuration_descriptor()` funksiyasında deskriptorun rədd edilməsi — bufer `k_heap_free()` ilə azad edilir, lakin göstərici (pointer) asılı qalır. `usbh_device_free()` funksiyasındakı təmizləmə prosesi yalnız `if (udev->cfg_desc != NULL)` şərti ilə qorunduğu üçün eyni blok ikinci dəfə azad edilir. Bu yol tamamilə qoşulmuş periferiya qurğusu tərəfindən idarə olunur: `usbh_device_connect()` funksiyası `usbh_device_init()` funksiyasını çağırır, o isə `usbh_device_set_configuration()` ilə başa çatır və uğursuzluq olduqda `usbh_device_connect()` funksiyası `usbh_device_free()` funksiyasını çağırır. v4.4.x versiyasında bu, eyni enumerasiya zamanı baş verir və cihazın çıxarılmasına ehtiyac qalmır; v4.1.0–v4.3.x versiyalarında isə ikinci azad etmə əməliyyatı `subsys/usb/host/usbh_core.c` faylındakı `dev_removed_handler()`/`dev_connected_handler()` vasitəsilə baş verir, buna görə də uğursuz enumerasiyadan sonra cihazın çıxarılması və ya təkrarlanan qoşulma hadisəsi tələb olunur — bu ardıcıllıq tamamilə qoşulmuş cihaz tərəfindən idarə edilir. Zərərli və ya yanlış formalaşdırılmış USB cihazı ilk 9 baytlıq konfiqurasiya deskriptoru sorğusuna düzgün başlıqla cavab verməli və daha sonra üç yoxlamadan hər hansı birini uğursuz etməlidir; məsələn, interfeys sayının `bNumInterfaces` ilə üst-üstə düşmədiyi tam deskriptor qaytarmaqla və ya ikinci oxuma sorğusuna fərqli baytlarla cavab verməklə bunu edə bilər. Nəticə `usb_device_heap` üzərində ikiqat azad etmədir (double free). `lib/heap` möhkəmləndirməsinin aktiv olduğu versiyalarda (hazırkı standart `CONFIG_SYS_HEAP_HARDENING_BASIC`), `sys_heap_free()` artıq azad edilmiş bloku aşkar edir və `k_panic()` funksiyasını çağıraraq USB host-un periferiya qurğusu tərəfindən tetiklenen deterministik xidmətdən imtinasına (DoS) səbəb olur. Bu aşkarlama mexanizmi olmayan versiyalarda — köhnə buraxılışlarda və ya `CONFIG_SYS_HEAP_HARDENING_NONE` konfiqurasiyasında — ikinci azad etmə əməliyyatı artıq azad siyahısında olan bloku manipulyasiya edərək heap-in azad siyahısını korlayır, nəticədə sonrakı ayırmalar üst-üstə düşən və ya etibarsız bloklar qaytara bilər. Xidmətdən imtinadan kənara çıxan istismar imkanları `usb_device_heap`-in kiçik xüsusi heap olması (`CONFIG_USBH_USB_DEVICE_HEAP`, standart olaraq 1024 bayt) və onun yeganə müştərisinin bu deskriptor buferi olması, həmçinin `CONFIG_USB_HOST_STACK`-in eksperimental kimi qeyd edilməsi və standart olaraq söndürülmüş olması ilə məhdudlaşır. Düzəliş, hər `k_heap_free()` çağırışından sonra `udev->cfg_desc = NULL` təyin edərək təmizləmə qorumasını effektiv hala gətirir.
Necə düzəltmək olar
- zephyrproject zephyr4.4.2 və ya daha yeni versiya
Təsirlənən məhsullar
| Məhsul | Təsirlənən versiyalar | Düzəldildiyi versiya |
|---|---|---|
| zephyrproject zephyr | 4.1.0 ≤ v < 4.4.2 | 4.4.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.