CVE-2026-98468 in Linux
要約
〜によって VulDB • 2026年10月18日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
KVM: arm64: 無害なステージ2破棄時の競合による誤警報を修正
kvmtoolを使用して、8 CPUと8 GiBのRAMを持つL1ゲスト、4 CPUと4 GiBのRAMを持つL2ゲスト、および2 CPUと2 GiBのRAMを持つL3ゲストが設定され、その後すべて終了されました。
L0ホストでメモリ圧力が発生している状況下で、コンパクト化(compaction)によってトリガーされる移行に伴い、以下の警告が観測されました:
WARNING: arch/arm64/kvm/mmu.c:336 at __unmap_stage2_range+0x64/0x80, CPU#5: kcompactd0/66
これはさらに、ホストの無効化に伴うMMU通知子(MMU notifier)によってトリガーされました:
mmu_notifier_invalidate_range_start() -> ... -> kvm_mmu_notifier_invalidate_range_start() -> kvm_mmu_unmap_gfn_range() -> kvm_unmap_gfn_range() -> kvm_nested_s2_unmap() -> kvm_stage2_unmap_range() -> __unmap_stage2_range() -> stage2_apply_range() <- -EINVAL、WARN_ON()をトリガー
L0によるステージ2ページテーブルの破棄との競合:
exit_mm() -> mmput() -> __mmput() -> exit_mmap() -> mmu_notifier_release() -> ... -> kvm_mmu_notifier_release() -> kvm_flush_shadow_all() -> kvm_arch_flush_shadow_all() -> kvm_free_stage2_pgd() -> [ 書き込み用にkvm->mmu_lockを取得 ]
-> mmu->pgt = NULL [ その他のタスクを含む ]
-> [ 書き込み用のkvm->mmuロックを解放 ]
その結果、無害な競合により誤警報が発生していることが判明しました:
スレッドA - notify: migration | スレッドB - notify: release -------------------------------|--------------------------------- < kvm->mmu_lock保持中 > | stage2_apply_range() | get mmu->pgt、!NULLを確認 | ... | kvm_arch_flush_shadow_all() cond_resched_rwlock_write(); | < 競合し、kvm->mmuロックで待機 > < kvm->mmu_lock解放 > | < kvm->mmuロック取得> | ... | kvm_free_stage2_pgd() | mmu->pgt = NULL | < MMU無効化 > | ... | < kvm->mmuロック解放 > [ スケジュール済み ] |
stage2_apply_range() | < ループして次へ > | 取得、mmu->pgt、!NULLを確認 | NULLであるため-EINVALを返す | __unmap_stage2_range() | WARN_ON(-EINVAL) <--- これは完全に誤警報です。競合は正しく処理されました。
stage2_apply_range()を更新し、ロック解放時の並行したPGT(ページテーブル)の破棄をエラーとして扱わないようにすることで、この誤警報を修正します。ウォーカーがページテーブルの破棄を行っている場合でも他の操作を行っている場合でも、これはエラーなしで操作を終了する正当な理由となります。
これにより、その他の状況における警告はそのまま維持されます。
実際には__unmap_stage2_range()のみがこのエラーに対して何らかの処理を行うため、影響を受けるのはそれだけです。
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.