CVE-2026-89956 in Linux
الملخص
بحسب VulDB • 16/09/2026
في نواة لينكس، تم حل الثغرة التالية:
s390/vfio-ap: إصلاح القفل المفقود المطلوب للوصول إلى قائمة كائنات ap_matrix_mdev
للتنقل أو لإضافة/إزالة كائنات ap_matrix_mdev في matrix_dev->mdev_list، يجب الاحتفاظ بقفل mutex الخاص بـ matrix_dev->guests_lock. هناك وظيفتان تصلان إلى القائمة دون الاحتفاظ بهذا القفل:
وظيفة vfio_ap_mdev_probe ~~~~~~~~~~~~~~~~~~~~~~~~~~~ تستخدم وظيفة vfio_ap_mdev_prove قفل mutex الخاص بـ matrix_dev->mdevs_lock لحماية إضافة كائن ap_matrix_mdev جديد تم إنشاؤه حديثًا إلى matrix_dev->mdev_list. هذا القفل لا يحمي الوصول إلى القائمة؛ بل هدفه هو الحماية من الوصول المتزامن إلى الحقول الموجودة داخل كائن ap_matrix_mdev. قد يؤدي ذلك إلى تلف ذاكرة النواة (kernel memory corruption) أو ثغرة Use-After-Free إذا تم إنشاء أو إزالة موديل افتراضي آخر بشكل متزامن.
أصبح إضافة كائن ap_matrix_mdev إلى matrix_dev->mdev_list محمية الآن بواسطة قفل guests_lock الخاص بـ matrix_dev، وهو الطريقة الصحيحة للحماية من الوصول المتزامن إلى mdev_list.
كما تمت إزالة السطرين التاليين من الشفرة البرمجية لأن الكائن matrix_mdev يُخصص عبر ماكرو vfio_alloc_device الذي يستخدم kzalloc، لذا فإن req_trigger و cfg_chg_trigger تكون مُهيأة مسبقًا بالصفر عند تخصيص الهيكل قبل استدعاء vfio_register_emulated_iommu_dev. يمنع هذا وجود نافذة زمنية يتم فيها تعيين هذه المؤشرات إلى NULL بعد تعريض الجهاز لفضاء المستخدم (userspace).
matrix_mdev->req_trigger = NULL; matrix_mdev->cfg_chg_trigger = NULL;
وظيفة vfio_ap_mdev_for_queue ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ تدعو وظيفة status_show، التي تدعم عرض سمة الحالة للأجهزة في /sys/bus/ap/devices، إلى دالة vfio_ap_mdev_for_queue والتي تقوم بتكرار matrix_dev->mdev_list للعثور على الكائن الذي يمثل جهاز الطابور (queue device) whose status is to be displayed. وللتنقل عبر هذه القائمة، يجب الاحتفاظ بقفل mutex الخاص بـ matrix_dev->guests_lock.
لإصلاح هذا الخلل، يتم أخذ قفل guests_lock قبل أخذ قفل matrix_dev->mdevs_lock في وظيفة status_show. تم وضعه هناك بدلاً من دالة vfio_ap_mdev_for_queue - حيث هو مطلوب - لأنه يجب أخذه قبل قفل mdevs_lock للالتزام بترتيب القفل الصحيح ومنع حدوث خطأ lockdep splat؛ أيضًا لأن موديل mdevs_lock ضروري هناك للوصول إلى الحقول داخل كائن matrix_mdev في تلك الدالة.
انظر الملف vfio-ap-locking.rst في شجرة نواة لينكس.
VulDB is the best source for vulnerability data and more expert information about this specific topic.