CVE-2024-46765
Təsvir
Linux kernel-də aşağıdakı zəiflik həll edilmişdir: ice: XDP konfiqurasiyasını mutex ilə qoruyun ice_xdp()-də məlumatların ardıcıllığı üçün əsas təhlükə mümkün asinxron PF resetdir. Bu, istifadəçi tərəfindən və ya TX timeout handler tərəfindən tetiklənə bilər. XDP quraşdırılması və PF reset kodu aşağıdakı bölmələrdə eyni resurslara müraciət edir: * ice_prepare_for_reset()-də ice_vsi_close() - artıq rtnl-locked * PF VSI üçün ice_vsi_rebuild() - qorunmur * ice_vsi_open() - artıq rtnl-locked Bədbəxt bir zamanlama ilə bu cür müraciətlər aşağıdakı kimi crash ilə nəticələnə bilər: [ +1.999878] ice 0000:b1:00.0: Registered XDP mem model MEM_TYPE_XSK_BUFF_POOL on Rx ring 14 [ +2.002992] ice 0000:b1:00.0: Registered XDP mem model MEM_TYPE_XSK_BUFF_POOL on Rx ring 18 [Mar15 18:17] ice 0000:b1:00.0 ens801f0np0: NETDEV WATCHDOG: CPU: 38: transmit queue 14 timed out 80692736 ms [ +0.000093] ice 0000:b1:00.0 ens801f0np0: tx_timeout: VSI_num: 6, Q 14, NTC: 0x0, HW_HEAD: 0x0, NTU: 0x0, INT: 0x4000001 [ +0.000012] ice 0000:b1:00.0 ens801f0np0: tx_timeout recovery level 1, txqueue 14 [ +0.394718] ice 0000:b1:00.0: PTP reset successful [ +0.006184] BUG: kernel NULL pointer dereference, address: 0000000000000098 [ +0.000045] #PF: supervisor read access in kernel mode [ +0.000023] #PF: error_code(0x0000) - not-present page [ +0.000023] PGD 0 P4D 0 [ +0.000018] Oops: 0000 [#1] PREEMPT SMP NOPTI [ +0.000023] CPU: 38 PID: 7540 Comm: kworker/38:1 Not tainted 6.8.0-rc7 #1 [ +0.000031] Hardware name: Intel Corporation S2600WFT/S2600WFT, BIOS SE5C620.86B.02.01.0014.082620210524 08/26/2021 [ +0.000036] Workqueue: ice ice_service_task [ice] [ +0.000183] RIP: 0010:ice_clean_tx_ring+0xa/0xd0 [ice] [...] [ +0.000013] Call Trace: [ +0.000016] <TASK> [ +0.000014] ? __die+0x1f/0x70 [ +0.000029] ? page_fault_oops+0x171/0x4f0 [ +0.000029] ? schedule+0x3b/0xd0 [ +0.000027] ? exc_page_fault+0x7b/0x180 [ +0.000022] ? asm_exc_page_fault+0x22/0x30 [ +0.000031] ? ice_clean_tx_ring+0xa/0xd0 [ice] [ +0.000194] ice_free_tx_ring+0xe/0x60 [ice] [ +0.000186] ice_destroy_xdp_rings+0x157/0x310 [ice] [ +0.000151] ice_vsi_decfg+0x53/0xe0 [ice] [ +0.000180] ice_vsi_rebuild+0x239/0x540 [ice] [ +0.000186] ice_vsi_rebuild_by_type+0x76/0x180 [ice] [ +0.000145] ice_rebuild+0x18c/0x840 [ice] [ +0.000145] ? delay_tsc+0x4a/0xc0 [ +0.000022] ? delay_tsc+0x92/0xc0 [ +0.000020] ice_do_reset+0x140/0x180 [ice] [ +0.000886] ice_service_task+0x404/0x1030 [ice] [ +0.000824] process_one_work+0x171/0x340 [ +0.000685] worker_thread+0x277/0x3a0 [ +0.000675] ? preempt_count_add+0x6a/0xa0 [ +0.000677] ? _raw_spin_lock_irqsave+0x23/0x50 [ +0.000679] ? __pfx_worker_thread+0x10/0x10 [ +0.000653] kthread+0xf0/0x120 [ +0.000635] ? __pfx_kthread+0x10/0x10 [ +0.000616] ret_from_fork+0x2d/0x50 [ +0.000612] ? __pfx_kthread+0x10/0x10 [ +0.000604] ret_from_fork_asm+0x1b/0x30 [ +0.000604] </TASK> Bunu -EBUSY qaytararaq həll etməyin əvvəlki üsulu uyğun deyil, xüsusən AF_XDP socket məhv edilərkən, çünki kernel hər halda silmə ilə davam edir. Bu çağırışlar arasında kifayət qədər kod var və hamısını əhatə edən böyük kritik bölmə yaratmağa ehtiyac yoxdur, eynilə ice_vsi_rebuild()-i rtnl_lock() ilə qorumağa ehtiyac olmadığı kimi. ice_vsi_rebuild() və ice_xdp()-i qorumaq üçün xdp_state_lock mutex əlavə edin. Aralarında qorunmayan bölmələrin qalması nəzərə alınmalı olan iki vəziyyətlə nəticələnəcək: 1. VSI bağlandıqda, lakin hələ rebuild edilmədikdə 2. VSI artıq rebuild edildikdə, lakin hələ açılmadıqda Sonuncu hal əslində artıq !netif_running() halı vasitəsilə idarə olunur, sadəcə flag yoxlamasını bir az düzəltməliyik. Birinci hal o qədər də trivial deyil, çünki ice_vsi_close() və ice_vsi_rebuild() arasında çoxlu hardware qarşılıqlı əlaqəsi baş verir, bu, ringlərin əlavə edilməsi/silinməsinin xəta ilə çıxmasına səbəb ola bilər. Xoşbəxtlikdən, VSI rebuild gözləmədədir və idarə olunan şəkildə bizim üçün yeni konfiqurasiya tətbiq edə bilər. Buna görə də, ice_x-in göstərdiyi kimi əlavə VSI vəziyyət flagı ICE_VSI_REBUILD_PENDING əlavə edin ---kəsilmiş---
Necə düzəltmək olar
- linux linux_kernel6.6.51, 6.10.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 | 5.5 ≤ v < 6.6.51, 6.7 ≤ v < 6.10.10, 6.11 | 6.6.51, 6.10.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.