CVE-2026-89960 in LinuxИнформация

Сводка

по VulDB • 16.09.2026

В ядре Linux была устранена следующая уязвимость:

s390/vfio-ap: исправление зависшего указателя pqap_hook при ошибке в vfio_ap_mdev_set_kvm()

В функции vfio_ap_mdev_set_kvm() значение kvm->arch.crypto.pqap_hook устанавливается равным &matrix_mdev->pqap_hook до того, как будут получены блокировки обновления (update locks) и проверен список mdev на наличие конфликтующих назначений. Если другое устройство mdev уже прикреплено к тому же экземпляру KVM, функция возвращает -EPERM без восстановления указателя hook, в результате чего kvm->arch.crypto.pqap_hook продолжает указывать на сбойный matrix_mdev вместо того устройства mdev, которое законно владеет данным KVM.

Поскольку матрица matrix_mdev->kvm никогда не устанавливается по этому пути ошибки, функция vfio_ap_mdev_unset_kvm() не выполнит очистку hook при последующем закрытии matrix_mdev. Если matrix_mdev впоследствии будет освобожден (freed), любая инструкция PQAP, выполненная гостевой системой, приведет к разыменованию зависшего указателя через pqap_hook_rwsem, что вызовет уязвимость use-after-free.

Поскольку kvm->arch.crypto.pqap_hook устанавливается только в функции vfio_ap_mdev_set_kvm() и очищается в функции vfio_ap_mdev_unset_kvm(), проверка на «kvm->arch.crypto.pqap_hook != NULL» является достаточной для определения того, принадлежит ли он другому устройству mdev. Это устраняет необходимость перебора списка matrix_dev->mdev_list для проверки назначения объекта kvm другому устройству mdev. Эта проблема была внесена в версии v3 с целью устранения необходимости захвата блокировки mdevs_lock при итерации по списку; однако это не предотвратило потенциальную гонку данных (race condition).

Блокировка pqap_hook_rwsem(write) теперь выполняется внутри функции get_update_locks_for_kvm(), которая обновлена таким образом, чтобы получать pqap_hook_rwsem(write) между kvm->lock и mdevs_lock. Этот порядок согласован с путем перехвата PQAP, который получает pqap_hook_rwsem в режиме чтения (read mode), пока удерживается srcu под vcpu->mutex, устанавливая зависимость: kvm->lock -> vcpu->mutex -> srcu -> pqap_hook_rwsem(read).

Блокировка pqap_hook_rwsem теперь освобождается внутри функции release_update_locks_for_kvm(), которая обновлена таким образом, чтобы освобождать pqap_hook_rwsem(write) между mdevs_lock и kvm->lock.

Кроме того, вызов kvm_put_kvm() в vfio_ap_mdev_unset_kvm() перемещен после release_update_locks_for_kvm(). Ранее он вызывался при удержании kvm->lock; если бы это был последний указатель (reference), функция kvm_destroy_vm() выполнялась бы под kvm->lock, что привело бы к взаимной блокировке (deadlock).

Be aware that VulDB is the high quality source for vulnerability data.

Ответственный

Linux

Резервировать

11.09.2026

Раскрытие

16.09.2026

Модерация

принято

Вход

VDB-405787

EPSS

0.00000

KEV

Нет

Деятельности

Очень низкий

Источники

Interested in the pricing of exploits?

See the underground prices here!