本日の学び — CPU の投機的実行とサイドチャネル脆弱性(Meltdown / Spectre 等)まとめ
TL;DR: パイプライン/ビハインド実行(out-of-order execution)や分岐予測(speculative execution)などの性能最適化は、実行が取り消されてもキャッシュなどのマイクロアーキテクチャ上の痕跡を残すことがあり、これをタイミング測定で観測することで本来参照不可能なメモリ(カーネル領域や他プロセスのデータ)を漏えいさせる攻撃が成立する(代表例:Meltdown, Spectre)。
背景(なぜ起きるか)
- 近代CPUは命令レベルの並列化(スーパースカラ、パイプライン)、依存を避けるためのビハインド実行、分岐予測などで高性能を達成している
- これらの「投機的な」実行は最終的に整合しない場合はロールバックされるが、投機実行によるメモリアクセスがキャッシュ等のマイクロアーキテクチャ状態を変えるため、その痕跡を外部から観測可能になる
- サイドチャネル攻撃は主に キャッシュタイミング(例:Flush+Reload, Prime+Probe)を使って痕跡を読み取る
代表攻撃の要点
Meltdown(概要)
-
原理:ユーザ空間からアクセスできないカーネルメモリを、投機的実行で読み出させ、その読み出しがキャッシュに残ることを利用して値を復元する
-
流れ(簡素化):
- カーネルアドレスをロードする命令を投機的に実行させる(本来は例外になる)
- 読み出した値をインデックスにして別配列にアクセス → そのインデックス相当するキャッシュラインがホットになる。
- 例外発生で実行はロールバックされるがキャッシュの状態は残る
- Flush+Reload 等でどのキャッシュラインが高速に応答するか調べ、読み出したバイトを復元する
Spectre(概要)
-
原理:分岐予測を騙して誤った分岐パスを繰り返し投機実行させ、投機実行が触れたデータのマイクロアーキテクチャ痕跡を利用する
-
流れ(簡素化):
- 分岐予測器に「特定条件では分岐が常に成立する」と学習させる
- 実際には条件が偽の入力で分岐を誘発すると、CPUは予測に従って投機実行する
- 投機経路で秘密データに基づくキャッシュアクセスが行われ、痕跡が残る
- キャッシュタイミング測定で秘密を復元する
-
注意点:Spectre は実際の利用には「ガジェット」(攻撃に使えるコードパターン)や仮想→物理の挙動把握などが必要で、攻撃の難易度はやや高いが汎用性が広い
共通の攻撃手法(技術的要点)
- Flush+Reload: 共有メモリ領域のキャッシュラインを flush してからアクセス時間を測り、何がキャッシュされているかを判定する。4KB 間隔などの工夫で速度差を出す
- Prime+Probe: 共有が無い場合でも特定のキャッシュセットを満たしてタイミング差を測ることで情報を得る
- 投機実行の「副作用」は例外で戻しても消えない(キャッシュ等に残る)という点が核心
影響範囲と差異
- Meltdown:インテルの多数のプロセッサで顕著(特権分離の実装に依存)
- Spectre:インテル・AMD・ARM など幅広い CPU アーキテクチャで成立し得る(分岐予測の仕組みに依存)
- どちらも OS・ハイパーバイザ・ブラウザ等のソフトウェア対策と、CPU のマイクロコード/ハードウェア変更が組み合わされて緩和される
緩和策(ソフト/ハード両面)
-
ソフトウェア側:
- カーネルページテーブル分離(KPTI / Kernel Page Table Isolation)などでユーザ空間からカーネル領域のマッピングを外す(Meltdown 緩和)
- コンパイラレベル/コードレベルで分岐予測を誘導しない(例:
lfenceやretpolineを使った対策)や疑わしいシーケンスの修正(Spectre 緩和)
-
ハードウェア側:
- マイクロコードアップデートで予測器の挙動やフラッシュの仕組みを改善、将来のCPU設計で投機実行と機密保持の境界を厳格化
-
トレードオフ:これらの対策は性能低下を招くことがある(性能 vs セキュリティの判断)
面接・学習チェックポイント(短問)
- 投機的実行とビハインド実行(out-of-order execution)の違いを1文で説明せよ
- Flush+Reload の基本的な手順を説明せよ
- なぜ「例外でロールバックされた」命令がキャッシュに痕跡を残せるのか、CPU の観点で説明せよ
- Spectre 攻撃で「ガジェット」が必要になる理由を説明せよ
参考(自分用メモ)
- 実践的な検証をするならまず Flush+Reload の小さな実装でキャッシュタイミングの取り方を理解する
- 次に簡単な Spectre 型 PoC を読んで、分岐予測器の学習と投機実行の観測方法を把握する
- 緩和を試すならローカル環境で KPTI を有効/無効にしてベンチマークを取ると効果とコストが分かりやすい