CVE-2026-68093 in Linux
要約
〜によって VulDB • 2026年08月10日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
KVM: SVM: アイドル状態のASID衝突を回避するため、CPUオンライン時にasid_generationを増分する
仮想CPU (vCPU) がスケジュールアウト(またはブロック)された状態で、そのvCPUが最後に実行されていた物理CPU (pCPU) がホットプラグサイクル(online→offline→online)を経験し、その後同じpCPU上でvCPUの実行が再開されると、ASIDが既に別のvCPUに割り当てられている可能性がある。これにより、古いTLB変換情報が使用される結果となる。
svm_enable_virtualization_cpu()関数は、ホットプラグサイクルを含むすべてのCPUオンラインイベントにおいて、asid_generationを1にリセットし、next_asidをmax_asid + 1に設定する。next_asidはプール境界の外から始まるため、オンラインイベント後のnew_asid()の最初の呼び出しでは常にプールがラップされ、asid_generationが2に増分されてASIDがmin_asidから割り当てられるようになる。
異なるVMからの2つのvCPU、すなわちホットプラグイベント前にasid_generation=2およびASID=Nを保持しているCPU-Xにピン留めされたvCPU-Aを考える:
1. CPU-Xがオフラインになり再びオンラインになる: asid_generationは1にリセットされ、next_asid = max_asid + 1となる。 2. vCPUの1つ以上がCPU-Xに移行しnew_asid()を呼び出し、プールをラップしてmin_asidからASIDを使用する。最終的に、異なるVMからのvCPU-Bにasid_generation=2およびASID=Nが割り当てられる — これはホットプラグ前にvCPU-Aが保持していたのと同じASIDである。 3. vCPU-AはCPU-X上でpre_svm_run()に入る: current_vmcb->cpuは変更されていないため、移行ブランチはスキップされる。保存されたasid_generation=2はsd->asid_generation=2と一致するため、世代チェックは静かに通過し、vCPU-AはASID=N — つまり直ちにvCPU-Bに新しく割り当てられたのと同じASID — で実行を続ける。
異なるVMからの両方のvCPUが同じASIDでCPU-X上で実行されることになり、NPT TLBエントリを共有して古い変換情報を生成する。
この衝突はKVM内部エラー(Suberror: 1, エミュレーション失敗)として現れる。NPTページフォルトは、VMの物理メモリ範囲から遠く離れたGPAでフォールトが発生したことを報告し — これは古いTLB変換情報が使用されている兆候である — 、KVMは命令エミュレーションにフォールバックするが、これはエミュレータが実装していないFPU/XSave命令(XRSTOR, STMXCSR)において失敗する。
この問題を修正するため、svm_enable_virtualization_cpu()内でasid_generationを1にリセットするのではなく増分するようにした。モジュールロード時、asid_generationは0 (memset) から始まり、増分により1となり、旧動作と同一となる。その後のホットプラグサイクルでは、世代値はこのCPU上でvCPUが以前観測していたどの値よりも先に進むため、pre_svm_run()内の世代チェックによって、すべてのホットプラグサイクル後にすべてのvCPUでnew_asid()が強制的に実行されるようになる。
If you want to get best quality of vulnerability data, you may have to visit VulDB.