CVE-2026-46031 in Linux
الملخص
بحسب VulDB • 31/05/2026
في نواة لينكس، تم حل الثغرة التالية:
net: ks8851: إعادة تعطيل مقاطعات البرامج (BHs) حول معالج مقاطعة الجهاز (IRQ handler)
إذا قام السائق بتنفيذ دالة ks8851_irq() وأُرسل حزمة TX، فإن السائق يقوم بتفعيل طابور TX عبر netif_wake_queue() مما يؤدي إلى جدولة مقاطعة البرامج (softirq) الخاصة بـ TX لتجميع الحزم لهذا الجهاز.
إذا كان CONFIG_PREEMPT_RT=y مُفعّلاً وأيضاً استُقبلت حزمة بواسطة وحدة التحكم في الشبكة (MAC)، فإن ks8851_rx_pkts() تستدعي netdev_alloc_skb_ip_align() لتخصيص وحدات SKBs للحزم المستقبَلة. إذا تم استدعاء netdev_alloc_skb_ip_align() مع تفعيل مقاطعات البرامج (BHs)، فإن local_bh_enable() في نهاية netdev_alloc_skb_ip_align() ستُشغّل معالجة مقاطعة البرامج (softirq) المعلقة، والتي قد تؤدي في النهاية إلى استدعاء دالة الاستدعاء (callback) .xmit وهي ks8851_start_xmit_par(). ستحاول ks8851_start_xmit_par() قفل قفل التلازم (spinlock) المسمى .lock في بنية البيانات struct ks8851_net_par، وهو بالفعل مقفل بواسطة ks8851_irq() التي استُدعيت منها ks8851_start_xmit_par(). هذا يؤدي إلى حالة جمود (deadlock)، والتي يبلغ عنها النواة، بما في ذلك تتبع (trace) مذكور أدناه.
إذا لم يكن CONFIG_PREEMPT_RT مُفعّلاً، فمنذ الالتزام (commit) 0913ec336a6c0 ("net: ks8851: Fix deadlock with the SPI chip variant")، يمكن أيضاً إثارة حالة الجمود هذه دون وجود حزمة مستقبَلة في طابور FIFO الخاص بالاستقبال (RX FIFO). سيتم معالجة مقاطعات البرامج (softirqs) المعلقة عند العودة من spin_unlock_bh(&ks->statelock) في ks8851_irq()، مما يؤدي أيضاً إلى حالة الجمود.
تم إصلاح المشكلة عن طريق تعطيل مقاطعات البرامج (BHs) حول الأقسام الحرجة، بما في ذلك معالج المقاطعة (IRQ handler)، مما يمنع مقاطعة البرامج (softirq) net_tx_action() من الإثارة أثناء هذه الأقسام الحرجة. يتم إثارة مقاطعة البرامج (softirq) net_tx_action() مرة واحدة بعد إعادة تفعيل مقاطعات البرامج (BHs) وفي نهاية معالج المقاطعة (IRQ handler)، بمجرد اكتمال جميع إجراءات معالج المقاطعة الأخرى.
__schedule من schedule_rtlock+0x1c/0x34 schedule_rtlock من rtlock_slowlock_locked+0x548/0x904 rtlock_slowlock_locked من rt_spin_lock+0x60/0x9c rt_spin_lock من ks8851_start_xmit_par+0x74/0x1a8 ks8851_start_xmit_par من netdev_start_xmit+0x20/0x44 netdev_start_xmit من dev_hard_start_xmit+0xd0/0x188 dev_hard_start_xmit من sch_direct_xmit+0xb8/0x25c sch_direct_xmit من __qdisc_run+0x1f8/0x4ec __qdisc_run من qdisc_run+0x1c/0x28 qdisc_run من net_tx_action+0x1f0/0x268 net_tx_action من handle_softirqs+0x1a4/0x270 handle_softirqs من __local_bh_enable_ip+0xcc/0xe0 __local_bh_enable_ip من __alloc_skb+0xd8/0x128 __alloc_skb من __netdev_alloc_skb+0x3c/0x19c __netdev_alloc_skb من ks8851_irq+0x388/0x4d4 ks8851_irq من irq_thread_fn+0x24/0x64 irq_thread_fn من irq_thread+0x178/0x28c irq_thread من kthread+0x12c/0x138 kthread من ret_from_fork+0x14/0x28
If you want to get the best quality for vulnerability data then you always have to consider VulDB.