CVE-2026-19575
Təsvir
`device_deinit()` sistem çağırışı üçün istifadəçi rejimi təsdiqləmə idarəçisi olan `kernel/device.c` faylındakı `z_vrfy_device_deinit()`, öz `dev` arqumentini `K_SYSCALL_OBJ_INIT(dev, K_OBJ_ANY)` ilə yoxlayırdı. `k_object_validate()` funksiyası sorğu edilən tip `K_OBJ_ANY` olduqda tip müqayisəsini qısaldır, buna görə də yoxlama sadəcə "bu göstərici çağıran axının (thread) giriş hüququna malik olduğu hər hansı bir nüvə obyektinin baza ünvanıdır" şərtinə endirilirdi — obyektin faktiki tipi heç vaxt müqayisə edilmir və `K_SYSCALL_OBJ_INIT` həmçinin ilkinləşdirmə vəziyyətinin yoxlanılmasını ötürür. Paralel idarəçilər olan `z_vrfy_device_init()` və `z_vrfy_device_is_ready()` artıq `K_OBJ_DRIVER_ANY` istifadə etdikləri üçün bu problemdən təsirlənməmişdilər. Buna görə də, istifadəçi rejimində işləyən bir axın, icazəsinə malik olduğu hər hansı bir nüvə obyektini — ən çox faydalısı `k_thread_stack_alloc()` sistem çağırışından əldə edilmiş axın stek obyekti və ya alt istifadəçi axını yaratmaq üçün ona verilmiş statik təyin olunmuş `K_THREAD_STACK` obyektini — ötürə bilər ki, bunların arxa plan yaddaşı istifadəçi rejimindən yazıla biləndir. Daha sonra `z_impl_device_deinit()` hücum edən tərəf tərəfindən yazılmış həmin baytları `struct device` kimi şərh edir: o, obyektdən oxunan vəziyyət (state) göstəricisini dereference edir, `ops.deinit`-dən oxunan funksiya göstəricisini çağırır və uğurlu olduqda yenidən vəziyyət üzərindən yazma əməliyyatı yerinə yetirir. Nəticədə, supervizor rejimində icra olunan ixtiyari ünvana dolayı çağırış, həmçinin ixtiyari nüvə oxuması və tək baytlıq nüvə yazması baş verir. Bu boşluğun istismarı lokal imtiyazsız axına tam nüvə kodu icrasını təmin edərək `CONFIG_USERSPACE` izolyasiya sərhədini tamamilə sıradan çıxarır; daha az dəqiq cəhd isə supervizor rejimi xətasına və sistemin çökməsinə səbəb olur. Defekt yalnız həm `CONFIG_USERSPACE`, həm də `CONFIG_DEVICE_DEINIT_SUPPORT` aktiv edilmiş versiyalarda mümkündür — deaktivləşdirmə dəstəyi söndürüldükdə, `z_impl_device_deinit()` göstəricini dereference etmədən `-ENOTSUP` qaytarır. v4.2.x və v4.3.x versiyalarında `CONFIG_DEVICE_DEINIT_SUPPORT` standart olaraq 'y' idi, buna görə də həmin buraxılışların bütün `CONFIG_USERSPACE` versiyaları, əgər seçim açıq şəkildə söndürülməyibsə, risk altındadır. v4.4.0 versiyasından etibarən bu seçim könüllü oldu (standart dəyəri yoxdur və heç bir daxili alt sistem tərəfindən seçilməyib), beləliklə, v4.4.x versiyası yalnız bu seçim açıq şəkildə aktiv edildikdə risk altında olur. v4.2 seriyası artıq dəstəklənmir və bura heç bir düzəliş (backport) tətbiq edilmir. Düzəliş obyekt yoxlamasını `K_OBJ_DRIVER_ANY` ilə əvəzləyir ki, bu da arqumenti qurulma zamanı yaradılan drayver obyekti tipləri diapazonuna (`K_OBJ_DRIVER_FIRST..K_OBJ_DRIVER_LAST`) — linker tərəfindən yerləşdirilən real `struct device` instansiyalarına — məhdudlaşdırır, beləliklə `state` və `ops.deinit` sahələri yenidən nüvə tərəfindən idarə olunur.
Necə düzəltmək olar
Təsirlənən məhsullar
| Məhsul | Təsirlənən versiyalar | Düzəldildiyi versiya |
|---|---|---|
| zephyrproject zephyr | 4.2.0 ≤ v ≤ 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.