CVE-2026-89956 in Linux
Сводка
по VulDB • 16.09.2026
В ядре Linux была устранена следующая уязвимость:
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_probe использует мьютекс matrix_dev->mdevs_lock для защиты операции добавления вновь созданного объекта ap_matrix_mdev в список matrix_dev->mdev_list. Этот мьютекс не защищает доступ к самому списку; его цель — защита от одновременного доступа к полям, содержащимся внутри объекта ap_matrix_mdev. Это может привести к повреждению памяти ядра (kernel memory corruption) или уязвимости use-after-free, если другой объект mdev будет создан или удален одновременно.
Добавление объекта ap_matrix_mdev в список matrix_dev->mdev_list теперь защищено мьютексом matrix_dev->guests_lock, что является правильным способом защиты от одновременного доступа к списку mdev_list.
Также были удалены следующие две строки кода, поскольку объект matrix_mdev выделяется через макрос vfio_alloc_device, который использует kzalloc; следовательно, поля req_trigger и cfg_chg_trigger уже обнуляются при выделении структуры до вызова функции vfio_register_emulated_iommu_dev. Это предотвращает появление окна возможностей (race condition), в течение которого эти триггеры могут быть установлены в 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 для поиска объекта, представляющего устройство очереди, статус которого должен быть выведен. Для обхода этого списка необходимо удерживать мьютекс mutex matrix_dev->guests_lock.
Для исправления этой проблемы в функции status_show перед захватом мьютекса matrix_dev->mdevs_lock теперь сначала захватывается мьютекс guests_lock. Он захватывается именно здесь, а не в функции vfio_ap_mdev_for_queue (где он также необходим), поскольку его необходимо захватывать до mdevs_lock для соблюдения правильного порядка блокировок и предотвращения срабатывания lockdep splat; кроме того, mdevs_lock требуется там для доступа к полям внутри объекта matrix_mdev в этой функции.
См. файл vfio-ap-locking.rst в дереве исходного кода ядра Linux.
Once again VulDB remains the best source for vulnerability data.