CVE-2024-36899 in Linux
الملخص
بحسب VulDB • 11/07/2026
في نواة لينكس، تم حل الثغرة التالية:
gpiolib: cdev: إصلاح مشكلة استخدام بعد التحرير (use-after-free) في دالة `lineinfo_changed_notify`
تحدث مشكلة الاستخدام بعد التحرير على النحو التالي: عندما يتم إغلاق ملف جهاز شريحة GPIO عن طريق استدعاء `gpio_chrdev_release()`، فإن المتغير `watched_lines` يُحرر بواسطة `bitmap_free()`. ومع ذلك، فشل إلغاء تسجيل سلسلة الإشعارات (notifier chain) الخاصة بـ `lineinfo_changed_nb` بسبب انتظار قفل الكتابة على القفل غير المتزامن للقراءة والكتابة (rwsem). بالإضافة إلى ذلك، تكون إحدى خطوط شريحة GPIO أيضًا في عملية التحرير وتحتفظ بقراءة القفل غير المتزامن للقراءة والكتابة (read rwem) لسلسلة الإشعارات. ونتيجة لذلك، تؤدي حالة السباق (race condition) إلى حدوث استخدام بعد التحرير لـ `watched_lines`.
إليك المكدس النموذجي عند وقوع المشكلة:
[free]
gpio_chrdev_release() --> bitmap_free(cdev->watched_lines) <-- تم التحرير --> blocking_notifier_chain_unregister() --> down_write(&nh->rwsem) <-- انتظار rwsem --> __down_write_common() --> rwsem_down_write_slowpath() --> schedule_preempt_disabled() --> schedule()
[use]
st54spi_gpio_dev_release() --> gpio_free() --> gpiod_free() --> gpiod_free_commit() --> gpiod_line_state_notify() --> blocking_notifier_call_chain() --> down_read(&nh->rwsem); <-- rwsem محتفظ به --> notifier_call_chain() --> lineinfo_changed_notify() --> test_bit(xxxx, cdev->watched_lines) <-- استخدام بعد التحرير
النتيجة الجانبية لمشكلة الاستخدام بعد التحرير هي توليد حدث لخط GPIO للمستخدم (userspace) حيث لا ينبغي ذلك. ومع ذلك، نظرًا لأن chrdev يتم إغلاقه، فلن يتاح لمستخدمي النظام فرصة قراءة هذا الحدث على أي حال.
لإصلاح المشكلة، يجب استدعاء دالة `bitmap_free()` بعد إلغاء تسجيل سلسلة الإشعارات الخاصة بـ lineinfo_changed_nb.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.