CVE-2021-47391
Təsvir
Linux kernel-də aşağıdakı zəiflik aradan qaldırılıb: RDMA/cma: Daha çox sorğu göndərməzdən əvvəl rdma_addr_cancel()-in baş verdiyinə əmin olun FSM dairəvi şəkildə işləyərək rdma_resolve_ip()-in eyni id_priv üzərində iki dəfə çağırılmasına imkan verə bilər. Bu, iş növbəsindən keçmədən baş verə bilməsə də, eyni ünvan həlli fon sorğusunun iki dəfə aktiv ola bilməyəcəyi invariantını pozur. CPU 1 CPU 2 rdma_resolve_addr(): RDMA_CM_IDLE -> RDMA_CM_ADDR_QUERY rdma_resolve_ip(addr_handler) #1 process_one_req(): #1 üçün addr_handler(): RDMA_CM_ADDR_QUERY -> RDMA_CM_ADDR_BOUND mutex_unlock(&id_priv->handler_mutex); [.. handler hələ də işləyir ..] rdma_resolve_addr(): RDMA_CM_ADDR_BOUND -> RDMA_CM_ADDR_QUERY rdma_resolve_ip(addr_handler) !! artıq req_list-də iki sorğu var rdma_destroy_id(): destroy_id_handler_unlock(): _destroy_id(): cma_cancel_operation(): rdma_addr_cancel() // process_one_req() özünü silir spin_lock_bh(&lock); cancel_delayed_work(&req->work); if (!list_empty(&req->list)) == true ! rdma_addr_cancel() process_on_req #1 bitdikdən sonra qayıdır kfree(id_priv) process_one_req(): #2 üçün addr_handler(): mutex_lock(&id_priv->handler_mutex); !! id_priv üzərində istifadədən sonra azad etmə (use after free) rdma_addr_cancel() siyahıda bir req olmasını gözləyir və yalnız birincisini ləğv edir. İşin özünü silmə davranışı yalnız handler qayıtdıqdan sonra baş verir. Bu, req_list-in eyni "handle" üçün iki req ehtiva edə biləcəyi, lakin rdma_addr_cancel()-in yalnız birincisini ləğv etdiyi vəziyyətlər yaradır. İkinci req rdma_destroy_id()-dən sonra da aktiv qalır və qaçılmaz olaraq tetikləndikdə id_priv üzərində istifadədən sonra azad etməyə səbəb olacaq. Bunu düzəltmək üçün id_priv-in rdma_resolve_ip() çağırıb-çağırmadığını yadda saxlayın və onu yenidən çağırmazdan əvvəl həmişə ləğv edin. Bu, req_list-in heç vaxt birdən çox element ehtiva etməməsini təmin edir və bu qəribə xəta yolundan heç vaxt istifadə etməyən normal axında heç bir xərc tələb etmir.
Necə düzəltmək olar
- linux linux_kernel5.10.188, 5.14.10 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 | 2.6.18 ≤ v < 5.10.188, 5.11 ≤ v < 5.14.10, 5.15 | 5.10.188, 5.14.10 |
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.