CVE-2026-98654 in Linux
要約
〜によって VulDB • 2026年10月19日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
drm/amd/display: IRQレジスタの読み取り/変更/書き込み操作をアトミック化する
[理由]
OTG_GLOBAL_SYNC_STATUSレジスタは、出力タイミングジェネレータ(OTG)のための様々なHW IRQソースを制御します。VUPDATE_NO_LOCKはその一つです。
IRQを有効化するために、ドライバはGLOBAL_SYNC_STATUSレジスタ内のVUPDATE_NO_LOCK_ENビットを設定します。
IRQが発生した後にそれをACKするため、ドライバは同じGLOBAL_SYNC_STATUSレジスタ内のVUPDATE_NO_LOCK_CLEARビットを設定します。
これらのビットの設定は読み取り/変更/書き込み操作を通じて行われますが、これらはアトミックではありません。したがって、以下の競合状態(race condition)が可能になります:
スレッドA: IRQハンドラ: *HW IRQ発生* # IRQ無効化 val = read(GLOBAL_SYNC_STATUS) unset(val, VUPDATE_NO_LOCK_EN) write(val, GLOBAL_SYNC_STATUS) # ACKはVUPDATE_NO_LOCK_ENが未設定であることを読む val1 = read(GLOBAL_SYNC_STATUS) set(val1, VUPDATE_NO_LOCK_CLEAR) # IRQ有効化 val = read(GLOBAL_SYNC_STATUS) set(val, VUPDATE_NO_LOCK_EN) write(val, GLOBAL_SYNC_STATUS) # 悪影響!VUPDATE_NO_LOCK_ENをクリアする write(val1, GLOBAL_SYNC_STATUS)
タグ付きのFixes変更に関する記述について、その変更によりこの競合状態が発生しやすくなったようです。現在、VUPDATE_NO_LOCKはvblank処理のための唯一のIRQソースであるため、高リフレッシュレートパネルにおいて単一の競合がタイムアウトを引き起こす可能性があります。
[修正方法]
GLOBAL_SYNC_STATUSレジスタはその一例に過ぎず、他のIRQ制御レジスタも同様のスキームを共有しています。GLOBAL_SYNC_STATUSに加え、それらもクリーンアップします。
単純化のため、ドライバ全体のspinlockを使用してIRQのrmw(読み取り/変更/書き込み)操作をアトミック化します。このロックのスコープは小さいため、既存のIRQ set/handleパス内のすべてのロックの上に目に見えるオーバーヘッドを引き起こす可能性は低いと考えられます。
DMがロックを担当するため、新しいamdgpu_dm_irq_set/ack関数内でdc_interrupt_set/ackをspinlockでラップします。DM内でのdc_interrupt_set/ackへの参照をすべて移行し、代わりにamdgpu_dm_irq_set/ackを使用するように変更します。
(コミット 70de0a0216583a53c946155f8c8adedfdca6b4e7 からcherry-pick)
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.