CVE-2022-49215
Təsvir
Linux kernel-də aşağıdakı zəiflik aradan qaldırılmışdır: xsk: soket sökülməsi zamanı yarış vəziyyətinin (race condition) düzəldilməsi xsk soket sökülməsi kodunda NULL göstəricisinin istifadəsinə (NULL pointer dereference) səbəb ola bilən yarış vəziyyəti düzəldilmişdir. Mövcud xsk bağlama kodu xsk_unbind_dev() funksiyasında əvvəlcə xs->state dəyişənini XSK_UNBOUND olaraq təyin edir, xs->dev dəyişənini NULL edir və sonra synchronize_net() vasitəsilə hər hansı NAPI emalının başa çatmasını gözləyir. Bundan sonra azad etmə kodu soket vəziyyətini sökür və ayrılmış yaddaşı boşaldır. BUG: kernel NULL pointer dereference, address: 00000000000000c0 PGD 8000000932469067 P4D 8000000932469067 PUD 0 Oops: 0000 [#1] PREEMPT SMP PTI CPU: 25 PID: 69132 Comm: grpcpp_sync_ser Tainted: G I 5.16.0+ #2 Hardware name: Dell Inc. PowerEdge R730/0599V5, BIOS 1.2.10 03/09/2015 RIP: 0010:__xsk_sendmsg+0x2c/0x690 [...] RSP: 0018:ffffa2348bd13d50 EFLAGS: 00010246 RAX: 0000000000000000 RBX: 0000000000000040 RCX: ffff8d5fc632d258 RDX: 0000000000400000 RSI: ffffa2348bd13e10 RDI: ffff8d5fc5489800 RBP: ffffa2348bd13db0 R08: 0000000000000000 R09: 00007ffffffff000 R10: 0000000000000000 R11: 0000000000000000 R12: ffff8d5fc5489800 R13: ffff8d5fcb0f5140 R14: ffff8d5fcb0f5140 R15: 0000000000000000 FS: 00007f991cff9400(0000) GS:ffff8d6f1f700000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00000000000000c0 CR3: 0000000114888005 CR4: 00000000001706e0 Call Trace: <TASK> ? aa_sk_perm+0x43/0x1b0 xsk_sendmsg+0xf0/0x110 sock_sendmsg+0x65/0x70 __sys_sendto+0x113/0x190 ? debug_smp_processor_id+0x17/0x20 ? fpregs_assert_state_consistent+0x23/0x50 ? exit_to_user_mode_prepare+0xa5/0x1d0 __x64_sys_sendto+0x29/0x30 do_syscall_64+0x3b/0xc0 entry_SYSCALL_64_after_hwframe+0x44/0xae Mövcud kodda iki problem var. Birincisi, bütün istifadəçilərin soketi istifadəni dayandırmasını gözləməzdən əvvəl xs->dev dəyişəninin NULL təyin edilməsi yanlışdır. Məlumat müstəvisinin xsk_poll(), xsk_sendmsg() və xsk_recvmsg() funksiyalarına giriş xs->state-in XSK_BOUND vəziyyətində olduğunu yoxlayan test ilə qorunur və belə olmadıqda dərhal geri dönür. Lakin bir proses bu testi keçmiş olsa da, hələ kodda xs->dev-dən istifadə etdiyi mərhələyə çatmamış ola bilər. Bu arada, xsk_unbind_dev() funksiyasını icra edən ikinci bir proses xs->dev-i NULL təyin edə bilər ki, bu da birinci proses üçün sistem çökməsinə (crash) səbəb olar. Həlli yolu budur ki, artıq istifadə olunmadığı üçün bu NULL mənimsətməsi ləğv edilsin. 42fddcc7c64b ("xsk: use state member for socket synchronization") commit-indən əvvəl xs->dev proseslərin məlumat müstəvisinin funksiyalarına girişini tənzimləyirdi, lakin sözügedən commit-də o, xs->state dəyişəni ilə əvəzlənmişdi. İkinci problem ondan ibarətdir ki, synchronize_net() funksiyası xsk_poll(), xsk_sendmsg() və ya xsk_recvmsg() funksiyalarındakı heç bir prosesin tamamlanmasını gözləmir, bu isə onların etibar etdiyi vəziyyətin vaxtından əvvəl təmizlənə biləcəyi anlamına gəlir. Bu, notifier çağırılanda (məsələn, drayver yüklənməyəndə) baş verə bilər, çünki o, xsk_unbind_dev()-dən istifadə edir. Bunu həll etmək üçün RCU kritik bölgəsi yalnız ndo_xsk_wakeup-dən yuxarıda qeyd olunan bütün funksiyalara genişləndirilmişdir, beləliklə həm xs->state == XSK_BOUND testi, həm də xs üzvlərinin sonuncu istifadəsi RCU kritik bölməsi ilə əhatə olunmuşdur. Bu, synchronize_net() tamamlandıqda xsk_poll(), xsk_sendmsg() və ya xsk_recvmsg() funksiyalarını icra edən heç bir prosesin qalmayacağını və vəziyyətin təhlükəsiz şəkildə təmizlənə biləcəyini təmin edəcək. Qeyd edək ki, skb ötürmə (xmit) yolu üçün RCU kilidi buraxılmalıdır, çünki orada yata bilən (sleep) funksiyalar istifadə olunur. Buna görə də, skb ötürmə kodunu eyni zamanda notifier-dən icra olunan xsk_unbind_dev()-dən qoruyan mutex-i götürdükdən sonra xs->state yenidən yoxlanılmalıdır.
Necə düzəltmək olar
- linux linux_kernel5.15.33, 5.16.19, 5.17.2 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.4 ≤ v < 5.15.33, 5.16 ≤ v < 5.16.19, 5.17 ≤ v < 5.17.2 | 5.15.33, 5.16.19, 5.17.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.