CVE-2024-56674

Orta

Açıklama

Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: virtio_net: netdev_tx_reset_queue() çağırma noktası düzeltildi virtnet_close işlemini virtnet_open takip ettiğinde, bazı TX tamamlamaları netdev_tx_reset_queue() sonrası ilk NAPI sorgulaması sırasında işlenene kadar tüketilmeden kalabilir ve bu durum bir çökmeye [1] yol açabilir. b96ed2c97c79 ("virtio_net: move netdev_tx_reset_queue() call before RX napi enable") numaralı commit, virtio-net için tüm BQL çökme vakalarını ortadan kaldırmak için yeterli olmamıştır. Bu sorun, makine içerisinden yoğun ağ TX yükü altındayken `while :; do ip l set DEV down; ip l set DEV up; done` komutu çalıştırılarak güncel net-next master sürümünde yeniden üretilebilir. netdev_tx_reset_queue() aslında virtnet_open yolundan çıkarılabilir; cihaz hiçbir durumda durdurulmaz. BQL çekirdek kısmı için bu, trafiğin bir süreliğine neredeyse yok olması gibidir. BQL'ye eklenen duraksama dedektörü (stall detector) için ise, virtnet_close işlemi herhangi bir şekilde bazı TX tamamlamalarının uzun süre gecikmesine yol açıp ardından virtnet_open gelirse, bunu 6025b9135f7a ("net: dqs: add NIC stall detector based on BQL") numaralı commit'te belirtildiği gibi bir duraksama olarak kabul edebiliriz. Ayrıca kullanıcıların stall_max değerini sysfs üzerinden hala sıfırlayabildikleri unutulmamalıdır. Bu nedenle, netdev_tx_reset_queue() fonksiyonu virtnet_enable_queue_pair()'dan kaldırılmıştır. Bu işlem BQL çökmelerini engeller. Sonuç olarak, netdev_tx_reset_queue() artık freeze/restore yolunda açıkça gereklidir. Bu yama, şu genel kuralı izleyerek fonksiyonu hemen free_unused_bufs() sonrasına ekler: netdev_tx_reset_queue(), netdev_tx_completed_queue() ile takip edilmeyen her türlü SKB serbest bırakma işleminden sonra gelmelidir. Bu, en tutarlı ve optimize edilmiş yaklaşım görünmektedir ve böylece free_unused_bufs() tamamlandığında netdev_tx_reset_queue() çalışır. [1]: ------------[ cut here ]------------ kernel BUG at lib/dynamic_queue_limits.c:99! Oops: invalid opcode: 0000 [#1] PREEMPT SMP NOPTI CPU: 7 UID: 0 PID: 1598 Comm: ip Tainted: G N 6.12.0net-next_main+ #2 Tainted: [N]=TEST Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), \ BIOS rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org 04/01/2014 RIP: 0010:dql_completed+0x26b/0x290 Code: b7 c2 49 89 e9 44 89 da 89 c6 4c 89 d7 e8 ed 17 47 00 58 65 ff 0d 4d 27 90 7e 0f 85 fd fe ff ff e8 ea 53 8d ff e9 f3 fe ff ff <0f> 0b 01 d2 44 89 d1 29 d1 ba 00 00 00 00 0f 48 ca e9 28 ff ff ff RSP: 0018:ffffc900002b0d08 EFLAGS: 00010297 RAX: 0000000000000000 RBX: ffff888102398c80 RCX: 0000000080190009 RDX: 0000000000000000 RSI: 000000000000006a RDI: 0000000000000000 RBP: ffff888102398c00 R08: 0000000000000000 R09: 0000000000000000 R10: 00000000000000ca R11: 0000000000015681 R12: 0000000000000001 R13: ffffc900002b0d68 R14: ffff88811115e000 R15: ffff8881107aca40 FS: 00007f41ded69500(0000) GS:ffff888667dc0000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000556ccc2dc1a0 CR3: 0000000104fd8003 CR4: 0000000000772ef0 PKRU: 55555554 Call Trace: <IRQ> ? die+0x32/0x80 ? do_trap+0xd9/0x100 ? dql_completed+0x26b/0x290 ? dql_completed+0x26b/0x290 ? do_error_trap+0x6d/0xb0 ? dql_completed+0x26b/0x290 ? exc_invalid_op+0x4c/0x60 ? dql_completed+0x26b/0x290 ? asm_exc_invalid_op+0x16/0x20 ? dql_completed+0x26b/0x290 __free_old_xmit+0xff/0x170 [virtio_net] free_old_xmit+0x54/0xc0 [virtio_net] virtnet_poll+0xf4/0xe30 [virtio_net] ? __update_load_avg_cfs_rq+0x264/0x2d0 ? update_curr+0x35/0x260 ? reweight_entity+0x1be/0x260 __napi_poll.constprop.0+0x28/0x1c0 net_rx_action+0x329/0x420 ? enqueue_hrtimer+0x35/0x90 ? trace_hardirqs_on+0x1d/0x80 ? kvm_sched_clock_read+0xd/0x20 ? sched_clock+0xc/0x30 ? kvm_sched_clock_read+0xd/0x20 ? sched_clock+0xc/0x30 ? sched_clock_cpu+0xd/0x1a0 handle_softirqs+0x138/0x3e0 do_softirq.part.0+0x89/0xc0 </IRQ> <TASK> __local_bh_enable_ip+0xa7/0xb0 virtnet_open+0xc8/0x310 [virtio_net] __dev_open+0xfa/0x1b0 __dev_change_flags+0x1de/0x250 dev_change_flags+0x22/0x60 do_setlink.isra.0+0x2df/0x10b0 ? rtnetlink_rcv_msg+0x34f/0x3f0 ? netlink_rcv_skb+0x54/0x100 ? netlink_unicas ---truncated---

ÖnemOrta
CVSS5.5
İstismar olasılığı—
ÜrünLinux Kernel
Yayın27 Ara 2024
İlk görülme27 Ara 2024
Zayıflık türüCWE-672CWE-672

Nasıl düzeltilir

Güncelleyin
  • linux linux_kernel6.12.6 ya da sonraki bir sürüm

Etkilenen ürünler

ÜrünEtkilenen sürümlerDüzeltildiği sürüm
linux linux_kernel6.11 ≤ v < 6.12.6, 6.136.12.6

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.

Intelligence 360 paketinde

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.

CVE-2024-56674 · Linux Kernel · Dark Radar