CVE-2022-50257
Təsvir
Linux kernel-də aşağıdakı zəiflik aradan qaldırılmışdır: xen/gntdev: Grant sızmasının qarşısının alınması Bu commit-dən əvvəl, əgər grant mapping əməliyyatı qismən uğursuz olarsa, map_ops massivindəki bəzi girişlər etibarsız, kmap_ops massivindəki bütün girişlər isə etibarlı ola bilərdi. Bu isə öz növbəsində gntdev_map_grant_pages funksiyasındakı aşağıdakı məntiqin yanlış işləməsinə səbəb olurdu: for (i = 0; i < map->count; i++) { if (map->map_ops[i].status == GNTST_okay) { map->unmap_ops[i].handle = map->map_ops[i].handle; if (!use_ptemod) alloced++; } if (use_ptemod) { if (map->kmap_ops[i].status == GNTST_okay) { if (map->map_ops[i].status == GNTST_okay) alloced++; map->kunmap_ops[i].handle = map->kmap_ops[i].handle; } } } ... atomic_add(alloced, &map->live_grants); Fərz edək ki, use_ptemod true-dur (yəni, grant verilmiş səhifələri map edən domen paravirtuallaşdırılmış domendir). Yuxarıdakı kod parçasında "alloced" dəyişəninin yalnız həm kmap_ops[i].status, həm də map_ops[i].status GNTST_okay təyin edildikdə (yəni, hər iki mapping əməliyyatı uğurlu olduqda) artırıldığına diqqət yetirin. Lakin yuxarıda qeyd edildiyi kimi, grant mapping əməliyyatının qismən uğursuz olduğu hallar mövcuddur və bu, yuxarıdakı kod parçasının fərzini pozur. Yuxarıda qeyd olunanlar map->live_grants dəyərinin yanlış təyin edilməsinə səbəb olur. Bəzi hallarda bütün map_ops mapping-ləri uğursuz olur, lakin bütün kmap_ops mapping-ləri uğurlu olur, bu isə live_grants dəyərinin sıfır qalması deməkdir. Bu isə öz növbəsində kmap_ops tərəfindən göstərilən uğurla grant-map edilmiş səhifələrin unmap edilməsini qeyri-mümkün edir, çünki unmap_grant_pages funksiyasının əvvəlində aşağıdakı kod hissəsi var: if (atomic_read(&map->live_grants) == 0) return; /* Görüləcək iş yoxdur */ Bəzi digər hallarda, yalnız bəzi map_ops mapping-ləri uğursuz olur, lakin bütün kmap_ops mapping-ləri uğurlu olanda live_grants müsbət olur, lakin istifadəçi grant-map edilmiş səhifələrin unmap edilməsini tələb etdikdə, __unmap_grant_pages_done funksiyası map->live_grants dəyərini mənfi edəcək. Çünki sonuncu funksiya unmap edilməsi tələb olunan bütün səhifələrin həqiqətən unmap edilib-edilmədiyini yoxlamır və eyni funksiya şərtsiz olaraq "data->count" dəyərini (yəni, map->live_grants-dən daha böyük ola biləcək bir dəyəri) map->live_grants-dən çıxır. Mənfi live_grants dəyərinin yan təsirləri araşdırılmamışdır. Bütün bunların yekun nəticəsi odur ki, yuxarıdakı şərtlərdən birində grant istinadları sızır. Qubes OS v4.1 versiyasında (hansı ki, X11 GUI izolyasiyası üçün Xen-in grant mexanizmindən geniş istifadə edir), bu problem dom0-a (X11 GUI pəncərə məlumatlarını ehtiva edən) səhifələri grant etmiş VM-də Linux kernel tərəfindən çap olunan "g.e. 0x1234 still pending" kimi xəbərdarlıq mesajları ilə özünü büruzə verir. Bu, xüsusilə istifadəçi GUI VM pəncərələrini sürətlə ölçüsünü dəyişdikdə baş verir (pəncərənin ölçüsü dəyişdirildikdə VM bəzi səhifələri paylaşmamağa başlayır, bu da həmin səhifələrin dom0-dan grant-map edilməsini qeyri-mümkün edir və bəzi grant-mapping əməliyyatlarının qismən və ya tamamilə uğursuz olmasına səbəb olur). Bu problemin həlli bütün uğurlu map_ops və kmap_ops mapping-lərinin ayrı-ayrı sayılması və sonra cəmin live_grants-ə əlavə edilməsini nəzərdə tutur. Unmapping zamanı isə live_grants-dən yalnız uğurla unmap edilmiş grant-lərin sayı çıxılır. Kod həmçinin çıxma əməliyyatından sonra mənfi live_grants dəyərlərini yoxlamaq və istifadəçini xəbərdar etmək üçün dəyişdirilmişdir.
Necə düzəltmək olar
- linux linux_kernel4.9.332, 4.14.298, 4.19.264, 5.4.223, 5.10.153, 5.15.75, 5.19, 5.19.17, 6.0.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 | 4.9.322 ≤ v < 4.9.332, 4.14.287 ≤ v < 4.14.298, 4.19.251 ≤ v < 4.19.264, 5.4.204 ≤ v < 5.4.223, 5.10.129 ≤ v < 5.10.153, 5.15.51 ≤ v < 5.15.75, 5.18.8 ≤ v < 5.19, 5.19.1 ≤ v < 5.19.17, 6.0 ≤ v < 6.0.3, 5.19 | 4.9.332, 4.14.298, 4.19.264, 5.4.223, 5.10.153, 5.15.75, 5.19, 5.19.17, 6.0.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.