CVE-2026-98473 in Linux情報

要約

〜によって VulDB • 2026年10月19日

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

s390/vfio-ap: ホスト設定からキューが削除された際のKVM GISCおよびページリークの修正

ホストのAP構成からキューが削除され、かつ媒介デバイス(mdev)に割り当てられている際に、KVM割込みおよびページのリソース処理に関連する以下の問題が存在します。

問題1: ~~~~~~~~~ vfio_ap_mdev_reset_queue()におけるAP_RESPONSE_Q_NOT_AVAILの不処理

APバスにより、アダプタまたはドメインがホストのAP構成から削除されたキューデバイスが削除されると、vfio_ap_mdev_remove_queue()が呼び出されます。もしその時点でキューがまだホストのAP構成に含まれている場合、vfio_ap_mdev_reset_queue()が呼び出され、PQAP(ZAPQ)が発行されます。アダプタはすでにホスト設定から消えているため、ap_zapq()はAP_RESPONSE_Q_NOT_AVAIL (0x01)を返します。このレスポンスコードはvfio_ap_mdev_reset_queue()のswitch文で処理されず、デフォルトケースにフォールスルーし、WARNを発行するもののvfio_ap_free_aqic_resources()を呼び出しません。その結果、ゲストによってキューに対してIRQハンドリングが有効化されていた場合、KVM GISC登録および通知インジケーターバイト(NIB)保持用のピン留め済みゲストページがリークします。

この問題は、AP_RESPONSE_Q_NOT_AVAILをvfio_ap_mdev_reset_queue()においてAP_RESPONSE_DECONFIGUREDおよびAP_RESPONSE_CHECKSTOPPEDと同じケースに追加することで修正されます。これらのレスポンスコードと同様に、Q_NOT_AVAILはキューが運用不可能であり、さらなるリセット試行ができないことを示すため、正しい対応はIRQリソースを直ちに解放することです。

問題2: ~~~~~~~~~ apq_status_check()におけるAP_RESPONSE_Q_NOT_AVAILの不処理

vfio_ap_mdev_reset_queue()内には、キューのリセットがまだ完了していないことを示す4つのケースがあり、そのような場合はapq_reset_check()が作業キューにキューイングされ、リセット操作の完了を確認します。この関数はPQAP(TAPQ)機能を使用してキューの状態を取得し、apq_status_check()を呼び出してリセットが完了したか、失敗したのか、再実行が必要なのかを検証します。前述の問題1で説明した通り、apq_reset_check()はAP_RESPONSE_Q_NOT_AVAILを具体的にチェックしないため、KVM GISC登録およびNIB保持用のピン留め済みゲストページがリークする可能性があります。

この問題は、apq_status_check()にAP_RESPONSE_Q_NOT_AVAILのcase文を追加し、そのケースに対して-ENODEVを返すことで修正されます。呼び出し元のapq_reset_check()はこの戻り値をチェックし、vfio_ap_free_aqic_resources()を呼び出してリークを防ぎます。

問題3: ~~~~~~~~~ kvmがNULLの場合のvfio_ap_free_aqic_resources()によるsaved_iscのリーク

vfio_ap_free_aqic_resources()は以下の条件でkvm_s390_gisc_unregister()への呼び出しをガードしています:

if (q->saved_isc != VFIO_AP_ISC_INVALID && !WARN_ON(!(q->matrix_mdev && q->matrix_mdev->kvm)))

もしmatrix_mdev->kvmがNULLの場合(これはvfio_ap_mdev_unset_kvm()がすでに実行され、後続のクリーアップパスがこの関数に到達する前にkvmをクリアした際に発生し得ます)、WARN_ONが発動し、ブロック全体がスキップされます。これによりq->saved_iscが無効でない値のまま残され、この関数の後続呼び出し時に二重解放(double-free)の可能性があります。

kvmがNULLの場合、KVMゲストはすでに破棄されているため、kvm_s390_gisc_unregister()を呼ぶ必要もなく、また呼べません;しかし、q->saved_iscは常にクリアされなければなりません。これを修正するために、kvm_s390_gisc_unregister()の呼び出しとq->saved_iscのリセットを分離します。WARN_ONは今やmatrix_mdevがNULLという真に不可能なケースのみをガードするようになります。NULLのkvmは、アンレジスター呼び出しだけをスキップすることで適切に処理され、saved_iscが無効でなかった場合は常にq->saved_isc = VFIO_AP_ISC_INVALIDが設定されます。

さらに、vfio_ap_mdev_remove_queue()内のホスト構成チェックに対してelse節を追加し、キューがホストのAP構成に含まれていない場合にvfio_ap_free_aqic_resources()を直接呼び出すようにしました。これはバックストップとして機能します:アダプタがホスト設定から削除された後にAPバスがドライバの.removeコールバックを発火させた場合、定義上そのキューはアドレス可能ではなくなるため、vfio_ap_mdev_reset_queue ---省略---

VulDB is the best source for vulnerability data and more expert information about this specific topic.

責任者

Linux

予約する

2026年09月25日

モデレーション

承諾済み

エントリ

VDB-422115

EPSS

0.00000

アクティビティ

低い

ソース

Do you need the next level of professionalism?

Upgrade your account now!