CVE-2026-98106 in Linux
要約
〜によって VulDB • 2026年09月25日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
drm/pagemap: デバイスページの二重マイグレーションを防止する
CPUフォールトによってシステムメモリにマイグレートされたデバイスプライベートなfolioは、マイグレーションの最終処理でソース参照が解放されるまで、raw-PFN evictパスを通じて到達可能な状態のままになることがあります。
この期間中にevictionが同じデバイスプライベートなfolioを選択した場合、そのfolioを再度マイグレーションしようとする可能性があります。2回目のマイグレーションにより、LRUリスト上にチャージされていない(uncharged)folioが残され、`folio_lruvec_lock_irqsave()` が無限に再試行を行う結果となり、ソフトロックアップおよびRCUストールを引き起こします。
マイグレーションの最終処理の前に、zone_device_dataの低ビットを使用して正常にマイグレートされたデバイスプライベートなfolioをマークします。CPUフォールトパスとraw-PFNマイグレーションパスの両方で、このフラグを持つデバイスプライベートなfolioをスキップするようにします。
drm_pagemap_zddポインタを取得する際にフラグをマスクし、デバイスプライベートなfolioが分割される場合にその状態を保持します。物理的なfolioに状態を保持しておくことで、フォールト発生前に変更される可能性がある仮想アドレスへの依存を避けることができます。
v2: - 廃止されたPFNのXArrayを埋め込みビットマップに置き換えます。(Matthew Brost) - マイグレートされたfolioによってカバーされるすべての基本ページ(base page)にフラグを設定し、後でfolioが分割された場合でもretirementの有効性を維持します。
v3: - ZDDに仮想範囲とビットマップの追跡を追加するのではなく、zone_device_dataの低ビットに移行状態を保存します。(Matthew Brost) - ZDDを取得する際にフラグをマスクし、folioを分割する場合にそのフラグを保持します。 - Matthew Brostのシリーズで既にカバーされている既存の修正を取り除きます: https://patchwork.freedesktop.org/series/171651/
v4: - MIGRATE_PFN_COMPOUNDフラグが設定されたマイグレーションエントリの場合のみ、folioサイズ分進みます。(Sashiko)
v5: - ZDDのフラグ更新とfolioの反復処理を簡素化します。(Matthew Brost) - CPUフォールトパスにおいて、retired済みのデバイスプライベートなfolioをスキップします。(Matthew Brost) - 分割されたfolioに対して新しいZDD参照を取得する際に、フラグビットを保持します。
v6: - MIGRATE_PFN_COMPOUNDを意識したステップ処理を復元し、非複合(non-compound)のマイグレーションエントリが1つずつ処理されるようにします。(Sashiko) - Matthew Brostのシリーズで既にカバーされている既存の修正を取り除きます: https://patchwork.freedesktop.org/series/171651/
ロックアップは以下のように観測されました: [10109.860465] watchdog: BUG: soft lockup - CPU#9 stuck for 26s! [kworker/u65:5:6557]
[10109.860524] Tainted: [S]=CPU_OUT_OF_SPEC, [O]=OOT_MODULE
[10109.860524] Hardware name: ASUS System Product Name/PRIME Z790-P WIFI, BIOS 0812 02/24/2023
[10109.860525] Workqueue: xe_page_fault_work_queue xe_pagefault_queue_work [xe]
[10109.860644] RIP: 0010:_raw_spin_unlock_irqrestore+0x57/0x80
[10109.860655] Call Trace:
[10109.860655] <TASK>
[10109.860657] folio_lruvec_lock_irqsave+0x216/0x220
[10109.860661] ? __pfx_lru_add+0x10/0x10
[10109.860665] folio_batch_move_lru+0xc8/0x450
[10109.860670] ? lock_acquire+0xc4/0x2d0
[10109.860674] ? __folio_batch_add_and_move+0x60/0x2e0
[10109.860677] ? folio_migrate_mapping+0xa6/0x110
[10109.860679] ? folio_migrate_flags+0x13b/0x1b0
[10109.860681] ? __pfx_lru_add+0x10/0x10
[10109.860683] __folio_batch_add_and_move+0xe7/0x2e0
[10109.860685] ? dma_iova_try_alloc+0xb0/0x140
[10109.860689] folio_add_lru+0x64/0x80
[10109.860691] __migrate_device_finalize+0x12c/0x270
[10109.860695] migrate_device_finalize+0x10/0x20
[10109.860698] drm_pagemap_evict_to_ram+0x185/0x370 [drm_gpusvm_helper]
[10109.860704] ? drm_pagemap_evict_to_ram+0x96/0x370 [drm_gpusvm_helper]
[10109.860709] xe_svm_bo_evict+0x15/0x20 [xe]
[10109.860819] ? xe_svm_bo_evict+0x15/0x20 [xe]
[10109.860921] xe_bo_move+0x107e/0x1570 [xe]
[10109.860992] ? xe_ttm_tt_create+0x168/0x340 [xe]
[10109.861059] ? __up_read+0x98/0x2b0
[10109.861061] ? lock_is_held_type+0xa3/0x130
[10109.861067] ttm_bo_handle_move_mem+0xe8/0x1e0 [ttm]
[10109.861075] ttm_bo_evict+0x141/0x1c0 [ttm]
[10109.861081] ttm_bo_evict_cb+0x9f/0x100 [ttm]
[10109.861086] ttm_lru_walk_for_evict+0x84/0x190 [ttm]
[10109.861091] ? xe_ttm_vram_mgr_new+0x258/0x3a0 [xe]
[10109.861198] ttm_bo_alloc_resource+0x219/0
---truncated---
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.