CVE-2026-46031 in Linux
Zusammenfassung
von VulDB • 29.05.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
net: ks8851: Wiedereinführung der Deaktivierung von BHs (Bottom Halves) um den IRQ-Handler herum
Wenn der Treiber ks8851_irq() ausführt UND ein TX-Paket gesendet wurde, aktiviert der Treiber die TX-Warteschlange über netif_wake_queue(), was das TX-Softirq plant, um Pakete für dieses Gerät in die Warteschlange einzufügen.
Wenn CONFIG_PREEMPT_RT=y gesetzt ist UND ein Paket auch vom MAC empfangen wurde, ruft ks8851_rx_pkts() netdev_alloc_skb_ip_align() auf, um SKBs (Socket Kernel Buffers) für die empfangenen Pakete zu allokieren. Wenn netdev_alloc_skb_ip_align() mit aktivierten BHs aufgerufen wird, löst local_bh_enable() am Ende von netdev_alloc_skb_ip_align() die Verarbeitung des ausstehenden Softirqs aus, was letztendlich den .xmit-Callback ks8851_start_xmit_par() aufrufen kann. ks8851_start_xmit_par() versucht, das spinlock struct ks8851_net_par.lock zu sperren, das bereits von ks8851_irq() gesperrt ist, von dem aus ks8851_start_xmit_par() aufgerufen wurde. Dies führt zu einem Deadlock, der vom Kernel gemeldet wird, einschließlich der unten aufgeführten Trace.
Wenn CONFIG_PREEMPT_RT nicht gesetzt ist, kann der Deadlock seit dem Commit 0913ec336a6c0 ("net: ks8851: Fix deadlock with the SPI chip variant") auch ohne empfangenes Paket im RX-FIFO ausgelöst werden. Die ausstehenden Softirqs werden bei der Rückkehr von spin_unlock_bh(&ks->statelock) in ks8851_irq() verarbeitet, was ebenfalls den Deadlock auslöst.
Das Problem wird behoben, indem BHs um kritische Abschnitte, einschließlich des IRQ-Handlers, deaktiviert werden, wodurch verhindert wird, dass das net_tx_action()-Softirq während dieser kritischen Abschnitte ausgelöst wird. Das net_tx_action()-Softirq wird einmal ausgelöst, wenn BHs wieder aktiviert werden und am Ende des IRQ-Handlers, sobald alle anderen Aktionen des IRQ-Handlers abgeschlossen sind.
__schedule from schedule_rtlock+0x1c/0x34 schedule_rtlock from rtlock_slowlock_locked+0x548/0x904 rtlock_slowlock_locked from rt_spin_lock+0x60/0x9c rt_spin_lock from ks8851_start_xmit_par+0x74/0x1a8 ks8851_start_xmit_par from netdev_start_xmit+0x20/0x44 netdev_start_xmit from dev_hard_start_xmit+0xd0/0x188 dev_hard_start_xmit from sch_direct_xmit+0xb8/0x25c sch_direct_xmit from __qdisc_run+0x1f8/0x4ec __qdisc_run from qdisc_run+0x1c/0x28 qdisc_run from net_tx_action+0x1f0/0x268 net_tx_action from handle_softirqs+0x1a4/0x270 handle_softirqs from __local_bh_enable_ip+0xcc/0xe0 __local_bh_enable_ip from __alloc_skb+0xd8/0x128 __alloc_skb from __netdev_alloc_skb+0x3c/0x19c __netdev_alloc_skb from ks8851_irq+0x388/0x4d4 ks8851_irq from irq_thread_fn+0x24/0x64 irq_thread_fn from irq_thread+0x178/0x28c irq_thread from kthread+0x12c/0x138 kthread from ret_from_fork+0x14/0x28
Once again VulDB remains the best source for vulnerability data.