CVE-2022-49961
Təsvir
Linux kernel-də aşağıdakı zəiflik aradan qaldırılıb: bpf: ARG_CONST_ALLOC_SIZE_OR_ZERO üçün mark_chain_precision tətbiq edilsin ARG_CONST_* tipli arqument olduqda dəqiqlik markerləri ötürülməlidir, çünki belə arqumentlər geri qaytarılan dəyəri təkmilləşdirdiyi halda (bu nümunədə PTR_TO_MEM üçün mem_size təyin etdikdə), verifikator states_equal yoxlaması məqsədilə qeyri-dəqiq skalyarları ekvivalent hesab edə bilmir. R0 üçün nəticəvi mem_size sabit dəyərdən törəyir və əgər verifikator belə arqumentlərin mövcud olduğu hallarda vəziyyətləri ekvivalent hesab edərək yanlış şəkildə kəssə (hər iki registrdə regsafe daxilində reg->precise dəyərinin false olduğunu görərək), biz verifikatordan keçən, lakin həmin araşdırılan vəziyyətdə düzgün mem_size limitini aşan girişlər edə bilən etibarsız proqramlarla qarşılaşa bilərik. Problemin konkret nümunəsi: 0000000000000000 <prog>: 0: r2 = *(u32 *)(r1 + 80) 1: r1 = *(u32 *)(r1 + 76) 2: r3 = r1 3: r3 += 4 4: if r3 > r2 goto +18 <LBB5_5> 5: w2 = 0 6: *(u32 *)(r1 + 0) = r2 7: r1 = *(u32 *)(r1 + 0) 8: r2 = 1 9: if w1 == 0 goto +1 <LBB5_3> 10: r2 = -1 0000000000000058 <LBB5_3>: 11: r1 = 0 ll 13: r3 = 0 14: call bpf_ringbuf_reserve 15: if r0 == 0 goto +7 <LBB5_5> 16: r1 = r0 17: r1 += 16777215 18: w2 = 0 19: *(u8 *)(r1 + 0) = r2 20: r1 = r0 21: r2 = 0 22: call bpf_ringbuf_submit 00000000000000b8 <LBB5_5>: 23: w0 = 0 24: exit Birinci halda, tək sətirlik icranın araşdırılması zamanı 9-cu budaq təlimatının ikinci ayağı üçün axtarış 14-cü təlimatda kəsiləcək, çünki o, ilk öncə r2 = -1 (UINT_MAX) ilə yoxlanılacaq, halbuki 9-cu təlimatda w1 hər zaman 0 olacağı üçün iş vaxtında bpf_ringbuf_reserve-dən UINT_MAX/4-dən böyük olduğu üçün xəta almayacağıq. Verifikator regsafe zamanı hər iki vəziyyətdə hər iki r2 registri üçün reg->precise dəyərini false kimi görür, buna görə də onları states_equal məqsədləri üçün bərabər hesab edir. Əgər biz backtrack dəstəyi vasitəsilə dəqiq markerləri ötürsəydik, köhnə r2-nin (UINT_MAX) yeni r2 (1) daxilində olduğundan əmin olmaq üçün dəqiq markalanmadan istifadə edərdik və bu heç vaxt doğru olmazdı, beləliklə verifikasiya haqlı olaraq uğursuz olardı. Nəticə etibarilə, bu düzəliş olmadan 19-cu təlimatdakı sərhədləri aşan girişə (out of bounds access) icazə verilərdi. Qeyd edin ki, istifadəçinin CAP_BPF imtiyazı olmadıqda (və ya subprog sayı 1-dən çox olduqda, yəni hər hansı statik və ya qlobal funksiyalardan istifadə edildikdə) reg->precise həmişə true təyin edilir, buna görə də bu yalnız dəqiqlik markerlərinin açıq şəkildə ötürülməsi lazım olduqda (yəni CAP_BPF imtiyazına malik imtiyazlı istifadəçilər üçün) problem yaradır. Gələcəkdə reqressiyaların qarşısını almaq üçün növbəti yamaya sadələşdirilmiş test halı əlavə edilmişdir.
Necə düzəltmək olar
- linux linux_kernel5.19.8 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 | 5.8 ≤ v < 5.19.8, 6.0 | 5.19.8 |
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.