CVE-2025-38670 in Linux
要約
〜によって VulDB • 2026年05月20日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
arm64/entry: cpu_switch_to()およびcall_on_irq_stack()でDAIFをマスクする
`cpu_switch_to()`および`call_on_irq_stack()`は、シャドウコールスタック(Shadow Call Stack: SCS)が有効な場合、異なるスタックへ切り替えるためにSP(スタックポインタ)を操作します。これらの2つのスタック変更はアトミックに行えず、両方の関数がSErrorsやDebug Exceptionsによって割り込まれる可能性があります。これは発生頻度は低いものの、非常に深刻な問題です。割り込まれた場合、スタックとシャドウコールスタックの不一致が生じ、スタックが破壊される(clobbered)可能性があります。
`cpu_switch_to()`では、SP_EL0が新しいタスクを指しているが、x18はまだ古いタスクのSCSを指している場合に発生します。割り込みハンドラがタスクのSCSポインタを保存しようとした際、古いタスクのSCSポインタ(x18)を新しいタスクのstruct(SP_EL0が指す場所)に保存してしまい、これを破壊してしまいます。
`call_on_irq_stack()`では、タスクスタックからIRQスタックへの切り替え時、およびその逆の切り替え時に発生します。どちらの場合も、SCSポインタがIRQ SCSを指しているが、SPがタスクスタックを指している状態で割り込まれる可能性があります。ネストされた割り込みハンドラは、その戻りアドレスをIRQ SCSにプッシュします。その後、SPがタスクスタックを指していることを検出し、`call_on_irq_stack()`を呼び出して、タスクのSCSポインタをIRQ SCSポインタで上書きしてしまいます(このIRQ SCSポインタもその後使用されます)。
これにより、タスクが間違ったSCS、場合によってはIRQ SCS上のアドレスへ復帰することになり、CONFIG_VMAP_STACKやFPACが有効な場合、カーネルパニックを引き起こします。
デフォルト設定では発生する可能性はありますが、稀です。しかし、CONFIG_ARM64_PSEUDO_NMIを有効にすると、DAIFがアンマスクされ、代わりにGICが優先度に基づいてCPUが受信すべき割り込みをフィルタリングする責任を負います。NMIをエミュレートするという目的のため、擬似NMIは`cpu_switch_to()`および`call_on_irq_stack()`中でもCPUによって受信される可能性があり、システム構成やワークロードによっては*非常に*頻繁に発生し、予測不可能なカーネルパニックを引き起こす可能性があります。
`cpu_switch_to()`でDAIFを完全にマスクし、復帰時に復元します。`call_on_irq_stack()`でも同様に処理しますが、分岐の前後でマスクと復元を行います。すべての設定間で動作の一貫性を保つため、CONFIG_SHADOW_CALL_STACKが無効な場合でもDAIFをマスクします。
既存のマクロはIFのみをマスクして保存するため、DAIFの保存とマスクを行うアセンブリマクロを導入して使用します。
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.