CVE-2026-89956 in Linux
요약
\~에 의해 VulDB • 2026. 09. 16.
리눅스 커널에서 다음 취약점이 해결되었습니다:
s390/vfio-ap: ap_matrix_mdev 객체 목록에 접근하는 데 필요한 잠금(lock) 누락 수정
matrix_dev->mdev_list의 ap_matrix_mdev 객체를 순회하거나 추가/제거하려면 matrix_dev->guests_lock 뮤텍스를 보유해야 합니다. 다음 두 함수는 이 뮤텍스 없이 목록에 접근합니다:
vfio_ap_mdev_probe 함수 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ vfio_ap_mdev_probe 함수는 새로 생성된 ap_matrix_mdev 객체를 matrix_dev->mdev_list에 추가할 때 matrix_dev->mdevs_lock 뮤텍스를 사용하여 보호합니다. 이 뮤텍스는 목록 접근을 보호하지 않으며, 그 목적은 ap_matrix_mdev 객체에 포함된 필드에 대한 동시 접근(concurrent access)으로부터 보호하는 것입니다. 다른 mdev가 동시에 생성되거나 제거되면 커널 메모리 손상 또는 use-after-free 취약점이 발생할 수 있습니다.
ap_matrix_mdev 객체를 matrix_dev->mdev_list에 추가하는 작업은 이제 올바른 방법으로 동적 mdev_list 접근을 보호하기 위해 matrix_dev->guests_lock으로 보호됩니다.
또한, matrix_mdev는 kzalloc을 사용하는 vfio_alloc_device 매크로를 통해 할당되므로, req_trigger 및 cfg_chg_trigger는 vfio_register_emulated_iommu_dev 호출 전에 구조체가 할당될 때 이미 0으로 초기화되어 있습니다. 이는 장치가 사용자 공간에 노출된 후 이러한 트리거가 NULL로 설정되는 윈도우(window)를 방지합니다.
matrix_mdev->req_trigger = NULL; matrix_mdev->cfg_chg_trigger = NULL;
vfio_ap_mdev_for_queue 함수 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /sys/bus/ap/devices의 장치 상태 속성을 표시하는 데 사용되는 status_show 함수는 상태를 표시할 큐 디바이스를 나타내는 객체를 찾기 위해 matrix_dev->mdev_list를 순회하는 vfio_ap_mdev_for_queue 함수를 호출합니다. 이 목록을 순회하려면 matrix_dev->guests_lock 뮤텍스를 보유해야 합니다.
이를 수정하기 위해 status_show 함수에서 guests_lock 뮤텍스가 matrix_dev->mdevs_lock 뮤텍스보다 먼저 획득됩니다. 이것이 필요한 vfio_ap_mdev_for_queue 함수가 아닌 해당 위치에 잠금이 설정되는 이유는 올바른 잠금 순서(locking order)를 준수하고 lockdep splat을 방지하기 위해 mdevs_lock 뮤텍스보다 먼저 획득해야 하기 때문이며, 또한 matrix_mdev 객체 내의 필드에 접근하기 위해 그 함수에서 mdevs_lock이 필요하기 때문입니다.
리눅스 커널 트리의 vfio-ap-locking.rst를 참조하십시오.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.