CVE-2024-46765
Açıklama
Linux kernel'da aşağıdaki güvenlik açığı giderilmiştir: ice: XDP yapılandırmasını bir mutex ile koruyun ice_xdp() fonksiyonunda veri tutarlılığına yönelik temel tehdit, olası bir asenkron PF sıfırlamasıdır. Bu durum bir kullanıcı tarafından veya TX zaman aşımı işleyicisi tarafından tetiklenebilir. XDP kurulumu ve PF sıfırlama kodu, aşağıdaki bölümlerde aynı kaynaklara erişmektedir: * ice_prepare_for_reset() içindeki ice_vsi_close() - zaten rtnl-kilitli * PF VSI için ice_vsi_rebuild() - korunmuyor * ice_vsi_open() - zaten rtnl-kilitli Talihsiz bir zamanlama ile bu tür erişimler, aşağıdakine benzer bir çökmeye neden olabilir: [ +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> Bu durumu -EBUSY döndürerek yönetmenin önceki yolu, özellikle AF_XDP soketi yok edilirken uygulanabilir değildir çünkü çekirdek her halükarda kaldırma işlemine devam eder. Bu çağrılar arasında çok fazla kod bulunmaktadır ve hepsini kapsayan geniş bir kritik bölüm oluşturmaya gerek yoktur; aynı şekilde ice_vsi_rebuild()'in rtnl_lock() ile korunmasına da gerek yoktur. ice_vsi_rebuild() ve ice_xdp() fonksiyonlarını korumak için xdp_state_lock mutex ekleyin. Arada korunmayan bölümler bırakmak, dikkate alınması gereken iki duruma yol açacaktır: 1. VSI kapatıldığında ancak henüz yeniden inşa edilmediğinde 2. VSI zaten yeniden inşa edildiğinde ancak henüz açılmadığında İkinci durum aslında !netif_running() durumu üzerinden zaten yönetilmektedir, sadece bayrak kontrolünü biraz ayarlamamız gerekir. Birincisi o kadar basit değildir çünkü ice_vsi_close() ve ice_vsi_rebuild() arasında birçok donanım etkileşimi gerçekleşir; bu durum halkaların eklenmesinin/silinmesinin hata ile sonuçlanmasına neden olabilir. Neyse ki, VSI yeniden inşası beklemededir ve bizim için yeni yapılandırmayı kontrollü bir şekilde uygulayabilir. Bu nedenle, ice_x... olduğunu belirtmek için ek bir VSI durum bayrağı olan ICE_VSI_REBUILD_PENDING ekleyin.
Nasıl düzeltilir
- linux linux_kernel6.6.51, 6.10.10 ya da sonraki bir sürüm
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| linux linux_kernel | 5.5 ≤ v < 6.6.51, 6.7 ≤ v < 6.10.10, 6.11 | 6.6.51, 6.10.10 |
Sürümünüzü kontrol edin
Ürünü seçin ve kullandığınız sürümü yazın; sürümün etkilenen aralıkta olup olmadığını görün.
Attack Surface Management
Alan adlarınıza bağlı varlıkları, bu varlıklarda çalışan teknolojileri ve bilinen zafiyetleri tek listede görün.