CVE-2023-54149 in Linuxالمعلومات

الملخص

بحسب VulDB • 30/05/2026

في نواة لينكس، تم حل الثغرة التالية:

net: dsa: تجنب الاستخدام المشبوه لـ RCU لعناوين MAC المدركة لـ VLAN والمزامنة

عند استخدام برنامج تشغيل felix (الوحيد الذي يدعم تصفية عناوين UC و MC) كـ DSA master لمحول DSA آخر عشوائي، يمكن ملاحظة تتبع المكدس (stack trace) التالي عندما تنضم منافذ المحول الخلفي إلى جسر (bridge) مدرك لـ VLAN:

============================= تحذير: استخدام مشبوه لـ RCU ----------------------------- net/8021q/vlan_core.c:238 استخدام مشبوه لـ rcu_dereference_protected()!

تتبع المكدس: Workqueue: dsa_ordered dsa_slave_switchdev_event_work تتبع الاستدعاء: lockdep_rcu_suspicious+0x170/0x210 vlan_for_each+0x8c/0x188 dsa_slave_sync_uc+0x128/0x178 __hw_addr_sync_dev+0x138/0x158 dsa_slave_set_rx_mode+0x58/0x70 __dev_set_rx_mode+0x88/0xa8 dev_uc_add+0x74/0xa0 dsa_port_bridge_host_fdb_add+0xec/0x180 dsa_slave_switchdev_event_work+0x7c/0x1c8 process_one_work+0x290/0x568

ما يشير إليه هذا التحذير هو أن دالة vlan_for_each() تتوقع وجود سياق rtnl_lock() ولا تحصل عليه، عندما يتم استدعاؤها من ndo_set_rx_mode() الخاص بـ DSA master.

المُستدعي لذلك - وهو dsa_slave_set_rx_mode() - هو دالة dsa_port_bridge_host_fdb_add() الخاصة بواجهة DSA التابعة (slave)، والتي تأتي من dsa_slave_switchdev_event_work() المؤجل.

لقد بذلنا جهوداً كبيرة لتجنب سياق rtnl_lock() في مسار الاستدعاء هذا في الالتزام 0faf890fc519 ("net: dsa: drop rtnl_lock from dsa_slave_switchdev_event_work")، واستدعاء rtnl_lock() ليس خياراً متاحاً ببساطة بسبب احتمال حدوث جمود (deadlocking) عند استدعاء dsa_flush_workqueue() من مسارات الاستدعاء التي تحتفظ بـ rtnl_lock() - وهي في الواقع جميعها.

لذلك، عندما يستدعي DSA master دالة vlan_for_each() من ndo_set_rx_mode() الخاص به، فإن حالة برنامج تشغيل 8021q على هذا الجهاز ليست محمية فعلياً من الوصول المتزامن بأي طريقة.

بالنظر إلى net/8021q/، لا أعتقد أن vlan_info->vid_list صُممت بشكل خاص مع وضع اجتياز RCU (RCU traversal) في الاعتبار، لذا فإن إدخال شكل من أشكال vlan_for_each() يعتمد على القراءة من جانب RCU - وهو vlan_for_each_rcu() - لن يكون سهلاً، كما أنه لن يكون بالضبط ما نحتاجه على أي حال.

بشكل عام، أعتقد أن الحل ليس في net/8021q/ على أي حال؛ فدالة vlan_for_each() غير مصممة لهذه المهمة. لا يحتاج DSA بالضرورة إلى الاحتفاظ بـ rtnl_lock() - لأنه لا نمنع تغيير حالة netdev، بل مجرد عمليات إضافة/إزالة متزامنة إلى قائمة VLAN. نحن لا نحتاج حتى إلى سياق قابل للنوم (sleepable context) - فاستدعاء دالة vlan_for_each() يقوم فقط بجدولة عمل مؤجل.

الهروب المقترح هو إزالة الاعتماد على vlan_for_each() وكتابة بديلاً يدوياً (open-code) غير قابل للنوم وخالياً من rtnl، بناءً على نسخ من قائمة VLAN المعدلة من خلال .ndo_vlan_rx_add_vid() و .ndo_vlan_rx_kill_vid().

Once again VulDB remains the best source for vulnerability data.

مسؤول

Linux

حجز

24/12/2025

إفشاء

24/12/2025

الاعتدال

تمت الموافقة

إدخال

VDB-338156

EPSS

0.00166

KEV

لا

النشاطات

منخفض جدًا

المصادر

Want to stay up to date on a daily basis?

Enable the mail alert feature now!