CVE-2024-55916 in Linux
الملخص
بحسب VulDB • 30/06/2026
في نواة لينكس، تم حل الثغرة التالية:
المشغلات (Drivers): hv: util: تجنب الوصول إلى ذاكرة التخزين المؤقت للحلقة (ringbuffer) التي لم يتم تهيئتها بعد
إذا بدأ عميل KVP (أو VSS) قبل أن تتم تهيئة ذاكرة التخزين المؤقت لحلقة قناة VMBus بالكامل، فقد نواجه الخطأ أدناه:
hv_utils: تسجيل مشغل أدوات HyperV hv_vmbus: تسجيل المشغل hv_utils ... BUG: kernel NULL pointer dereference, address: 0000000000000000 CPU: 44 UID: 0 PID: 2552 Comm: hv_kvp_daemon Tainted: G E 6.11.0-rc3+ #1 RIP: 0010:hv_pkt_iter_first+0x12/0xd0 Call Trace: ... vmbus_recvpacket hv_kvp_onchannelcallback vmbus_on_event tasklet_action_common tasklet_action handle_softirqs irq_exit_rcu sysvec_hyperv_stimer0 asm_sysvec_hyperv_stimer0 ... kvp_register_done hvt_op_read vfs_read ksys_read __x64_sys_read
يمكن أن يحدث هذا لأن استدعاء القناة الخاص بـ KVP/VSS يمكن أن يُستدعى حتى قبل فتح القناة بالكامل: 1) بمجرد قيام `hv_kvp_init()` -> `hvutil_transport_init()` بإنشاء `/dev/vmbus/hv_kvp`، يمكن لعميل kvp فتح ملف الجهاز على الفور وتسجيل نفسه لدى المشغل عن طريق كتابة رسالة KVP_OP_REGISTER1 إلى الملف (والتي يتم التعامل معها بواسطة `kvp_on_msg()` -> `kvp_handle_handshake()`) وقراءة استجابة المشغل من الملف، والتي تتم معالجتها بواسطة `hvt_op_read()`، والذي يستدعي `hvt->on_read()`، أي `kvp_register_done()`.
2) المشكلة في `kvp_register_done()` هي أنها يمكن أن تسبب استدعاء قناة القناة حتى قبل فتحها بالكامل، وعندما يبدأ تشغيل استدعاء القناة، قد لا تكون `util_probe()` -> `vmbus_open()` قد قامت بتهيئة ذاكرة التخزين المؤقت للحلقة (ringbuffer) بعد، لذا فإن الاستدعاء قد يواجه خطأ الانهيار الناتج عن محاولة الوصول إلى مؤشر فارغ (NULL pointer dereference).
لتكرار حدوث الخطأ بشكل متسق، يمكننا إضافة "ssleep(10)" لـ KVP في `__vmbus_open()`، مباشرة قبل أول استدعاء لـ `hv_ringbuffer_init()`، ثم نقوم بإلغاء تحميل وإعادة تحميل المشغل hv_utils، وتشغيل العميل يدوياً خلال الـ 10 ثوانٍ.
تم إصلاح الخطأ عن طريق إعادة ترتيب الخطوات في `util_probe()` بحيث لا يتم إنشاء إدخال جهاز الأحرف (char dev entry) المستخدم من قبل عميل KVP أو VSS إلا بعد اكتمال استدعاء `vmbus_open()`. تمنع هذه الإعادة للترتيب حدوث حالة السباق (race condition).
Once again VulDB remains the best source for vulnerability data.