CVE-2026-89960 in Linux情報

要約

〜によって VulDB • 2026年09月16日

Linuxカーネルにおいて、以下の脆弱性が修正されました:

s390/vfio-ap: vfio_ap_mdev_set_kvm()におけるエラー時のpqap_hookポインタの古くなった(stale)状態を修正

vfio_ap_mdev_set_kvm()関数内では、更新ロックが取得され、競合する割り当てについてmdevリストがチェックされる前に、kvm->arch.crypto.pqap_hookに&matrix_mdev->pqap_hookが設定されます。もし他のmdevが既に同じKVMインスタンスにアタッチされている場合、この関数はフックポインタを復元せずに-EPERMを返します。これにより、kvm->arch.crypto.pqap_hookは正当にKVMの所有者であるmdevではなく、失敗したmatrix_mdevを指し続けることになります。

このエラーパスではmatrix_mdev->kvmが設定されないため、後にmatrix_mdevがクローズされる際にvfio_ap_mdev_unset_kvm()によってフックのクリーンアップが行われません。もしその後matrix_mdevが解放されると、ゲストによって実行された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に属しているかどうかを判断できます。これにより、kvmオブジェクトが別のmdevに割り当てられているかを確認するためにmatrix_dev->mdev_listリストを反復処理する必要が軽減されます。これはv3で導入され、リストの反復中にmdevs_lockを取得する必要性を軽減するためのものでしたが、潜在的なrace conditionを防ぐものではありませんでした。

pqap_hook_rwsem(write)は現在get_update_locks_for_kvm()内で実行されており、この関数はkvm->lockとmdevs_lockの間でpqap_hook_rwsem(write)を取得するように更新されました。この順序付けはPQAPインターセプトパスと一致しており、srcuがvcpu->mutexの下で保持されている間にreadモードでpqap_hook_rwsemを取得します。これにより、依存関係kvm->lock -> vcpu->mutex -> srcu -> pqap_hook_rwsem(read)が確立されます。

pqap_hook_rwsemは現在release_update_locks_for_kvm()内で解放されており、この関数はmdevs_lockとkvm->lockの間でpqap_hook_rwsem(write)を解放するように更新されました。

さらに、vfio_ap_mdev_unset_kvm()内のkvm_put_kvm()呼び出しがrelease_update_locks_for_kvm()の後に移動されました。以前はkvm->ロック保持中にこの関数が呼ばれていましたが、もしそれが最後の参照であった場合、kvm_destroy_vm()がkvm->lockの下で実行されデッドロックを引き起こす可能性があります。

Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.

責任者

Linux

予約する

2026年09月11日

モデレーション

承諾済み

エントリ

VDB-405787

EPSS

0.00000

アクティビティ

非常低い

ソース

Do you know our Splunk app?

Download it now for free!