1990年代以降、コンピュータの頭脳であるプロセッサは、プログラムの行き先をあらかじめ予測して先回りの計算を行うことで処理速度を極限まで高めてきた。2018年に脆弱性が発覚して以来、業界はこの予測機構を機密処理の直前に初期化し、クリーンな状態に保つことで安全を担保している。しかし、初期化の指示から実際に予測器が使用されるまでの間に存在するほんの一瞬の隙間が、新たな攻撃の糸口となった。
予測実行とSpectreが残した歴史的課題
処理速度の限界を超える先回りの論理
コンピュータの頭脳であるプロセッサは、半世紀以上にわたってクロック周波数を引き上げる工夫を重ねてきた。その中核にある技術が予測実行(Speculative Execution)である。
現代のプログラムは、無数の条件分岐命令で構成されている。あるユーザーが正規の権限を持っているかを確認する処理では、権限があれば承認処理を、なければ拒否処理を行う。条件分岐命令に直面したとき、メインメモリからデータを読み出すには数百クロックサイクルの時間がかかる。もしプロセッサがこのデータを待ってから処理を進めると、計算ユニットの大半が休止状態になってしまう。
これを避けるため、プロセッサは内部に備えられた分岐予測器という機構を用いて、過去の実行履歴から高い確率でたどる経路を推測し、関連する命令をあらかじめ実行する。この予測を支えるのが、分岐先アドレスを記憶するBTB(Branch Target Buffer)や、関数からの戻り先を記録するRSB(Return Stack Buffer)といった専用のハードウェア構造である。これらは過去の実行結果をテーブルとして保持し、次に同じ命令が現れた際の道標となる。予測が正しければ処理は高速に進む。予測が外れた場合、先回りして計算した結果は破棄され、プロセッサの状態は元の正しい経路へと巻き戻される。一見すると何も起きなかったように見えるが、キャッシュメモリの中には特定のデータが読み込まれたという微小な物理的痕跡が残る。
痕跡からデータを盗み出すSpectreの衝撃
2018年、この残留した痕跡からデータの読み出し時間の差を計測し、本来アクセスできないはずの機密情報を盗み出す手法が発見された。これが業界を震撼させたSpectre脆弱性である。
攻撃者は、被害者のプログラムと同じプロセッサ上で独自のプログラムを走らせる。そして、特定のメモリ領域にアクセスするまでの時間を計測する。キャッシュにデータが存在すればアクセスは数ナノ秒で終わり、メインメモリまで探しに行けば数百ナノ秒かかる。この手法はFlush+Reloadと呼ばれ、キャッシュ内の特定のデータをあらかじめ追い出し、被害者の処理後に再度読み込んで時間を測ることで、先回り実行の結果を高精度に読み取る。この時間差を観察することで、攻撃者は被害者のプログラムが先回り実行中に何を読み込んだのかを推測し、機密情報を1ビットずつ復元していく。
特にSpectre v2と呼ばれる変種は、分岐予測器そのものを標的とする。プログラムの分岐予測器は、システム全体で共有される資源だ。攻撃者はこの予測器に大量のダミーの分岐命令を入力し、特定の条件下では常に特定のアドレスへジャンプするという偽の履歴を学習させる。その後、被害者のプログラムに処理を移すと、被害者のプログラムは攻撃者が仕込んだ偽の履歴に従って、予期しないアドレスへジャンプして先回り実行を行ってしまう。被害者のプロセスが意図せず読み込んだデータはキャッシュに残り、攻撃者はそこから情報を盗み出す。チップメーカーは、ソフトウェアとハードウェアの両面から多層的な防御策を構築する必要に迫られた。
使う前に洗う防御策の落とし穴
予測器の初期化という基本戦略
Spectre v2に対する現在の主流の防御アプローチは、予測機構の無効化に基づく緩和策である。Intelが導入したeIBRSや、AMDが採用したSafe RETなどの機構がこれに該当する。例えばIntelのeIBRSは、予測器の履歴を特権レベルごとに論理的に分離し、低い権限のプログラムが残した履歴を高い権限のプログラムに影響させないようにする。AMDの機構も同様に、特権レベルが切り替わる際に予測器の内部状態をリセットする。
これらの防御策の論理は明快だ。オペレーティングシステムは、ユーザーが実行する一般のプログラムから、システム全体を管理するカーネルへと実行権限が移行する瞬間に、予測器の履歴を消去する。悪意あるプログラムが分岐予測器に罠を仕掛けていたとしても、機密性の高い領域に入る直前に洗い流してしまえばよい。使う直前にクリーンな状態へリセットすることで、攻撃者の介入を無効化するという考え方である。ユーザー側の怪しい学習履歴をカーネル側に持ち込ませないための強固な関所が設けられた。
ソフトウェアの脆弱性モデルを物理層へ持ち込む
しかし、マサチューセッツ工科大学コンピュータ科学人工知能研究所(MIT CSAIL)の研究者であるDaniël TrujilloとMengjia Yanは、この防御策に隠れた前提があることを見抜いた。予測器のデータを消去した瞬間から、安全になったはずの予測器が実際に使われる瞬間まで、いかなる悪意ある処理も介入しないという仮定である。
ソフトウェアの世界には、ファイルのアクセス権限を確認してから実際にファイルを開くまでのわずかな時間差を狙うTOCTOU(Time-of-Check to Time-of-Use)という脆弱性が古くから知られている。権限を確認した直後に別のプログラムがファイルをすり替えると、権限がないはずのファイルにアクセスできてしまう問題だ。
研究チームは、この概念をハードウェアのマイクロアーキテクチャの次元に持ち込んだ。プロセッサが予測器の消去命令を受け取ってから、次に分岐予測を利用する命令を実行するまでの間には、わずかながら時間差が存在する。彼らはこの時間差を狙う攻撃クラスをTONTOU(Time-of-Neutralization to Time-of-Use)と名付け、セキュリティカンファレンスのBlack Hat USA 2024およびUSENIX Security '24で発表した。
6バイトの隙間を射抜くハードウェア割り込み
ゼロクロックでは終わらない初期化の限界
防御機構によって予測器がリセットされたとしても、物理的なプロセッサの電気信号の処理において、消去と使用が完全にゼロクロックで同時に起こるわけではない。研究チームの解析によれば、AMDのZen 2アーキテクチャにおいてその隙間は2命令分、距離にして6バイトの長さが存在する。
プロセッサの処理速度は数ギガヘルツ、すなわち1秒間に数十億回のクロック信号を刻む。通常であれば、このごく短い時間の間に別のプログラムが入り込むことはない。2命令の隙間は数ナノ秒で通り過ぎる一瞬であり、外部から意図的に狙いを定めることは不可能に近いと考えられていた。
タイマー操作による精密な射撃
そこで研究チームは、ハードウェア割り込みを悪用する手法を開発した。コンピュータのオペレーティングシステムは、キーボードの入力やネットワークパケットの到着などに対応するため、現在の処理を一時停止して別の処理を割り込ませる仕組みを持っている。
Linux環境では、特別な権限を持たない一般ユーザーであっても、システムコールを通じてナノ秒単位の精度で割り込みタイマーを設定できる。攻撃者は、プロセッサが予測器をリセットした直後、かつ機密コードが分岐予測を利用する直前の、ちょうど2命令が実行される瞬間に割り込みを発生させる。
割り込みが発生すると、プロセッサは現在実行中の処理を中断し、カーネル内にある割り込みハンドラという別のプログラムを実行する。この割り込みハンドラ自身も、処理の過程で多数の分岐命令を実行する。すると、先ほど消去されたばかりの分岐予測器には、割り込みハンドラが実行した分岐の履歴が新たに記録される。結果として、防御機構が懸命にクリーンにした予測器が再び悪意ある状態に汚染され、元の処理に戻る。研究チームはこの具体的な攻撃手法をINTERRUPT INJECTIONと呼んでいる。
キャッシュ階層を操る時間の引き延ばし
兄弟スレッドを通じたキャッシュの意図的枯渇
タイマーを高精度に設定したとしても、数ナノ秒の隙間へ割り込みを正確に着弾させることは困難を極める。研究チームはこの課題を解決するため、プロセッサのキャッシュ階層を利用して時間を引き延ばす戦術をとった。
コンピュータのメモリには、容量は少ないが極めて高速なL1キャッシュ、中間のL2キャッシュ、そして大容量だが低速なメインメモリという階層構造がある。彼らは同じ物理コア上で動作する別のスレッドを利用し、標的となる命令が格納されているL1およびL2キャッシュの領域を大量の無関係なデータで上書きした。現代のプロセッサは複数のスレッドでキャッシュを共有しているため、一方のスレッドが大量のメモリにアクセスすると、もう一方のスレッドが必要とするデータがキャッシュから追い出されてしまう。
プロセッサが隙間の直前にある命令を実行しようとしたとき、その命令データは高速なキャッシュから消え去っている。プロセッサは低速なメインメモリまでデータを取りに行く必要があり、処理が数百クロックサイクルにわたって停滞する。この遅延によって6バイトの隙間を通過する時間が人為的に引き延ばされ、割り込みが命中する確率は5パーセントから12パーセントへと大幅に向上した。
レジスタ制御を通じた攻撃ルートの誘導
時間を引き延ばすことに成功した攻撃者は、さらに精度を高めるための工夫を凝らした。割り込み処理が終了して元の処理へ戻るとき、どの方向へジャンプさせるかを制御しなければ、情報を盗み出す先回り実行は発生しない。
研究チームは、割り込みハンドラが実行される過程で参照されるシステムコールを詳細に分析し、特定のレジスタの値を攻撃者がコントロールしやすい命令を特定した。システムコールを呼び出す際、攻撃者は汎用レジスタに任意の値を設定できる。この値が割り込みハンドラの実行過程で予測器に読み込まれ、攻撃者が指定したアドレスへの偽のジャンプ履歴として記録される。意図した通りにレジスタを操作しておくことで、割り込み終了後にクリーンなはずの分岐予測器へ悪意あるジャンプ先を確実に学習させる。この精密な誘導により、ターゲットプロセスは攻撃者の望むメモリ領域を自ら先回り実行してしまう。
18分で崩壊する権限分離の壁
緩和策をすり抜ける実証実験の環境
この理論的な脆弱性は、実際の攻撃を成功させるだけの破壊力を持っている。研究チームは、デフォルトのSpectre v2対策をすべて有効にしたLinux 6.1.4搭載のAMD Zen 2システムを用いて検証実験を行った。
| 比較項目 | 従来のSpectre v2攻撃 | TONTOU (INTERRUPT INJECTION) |
|---|---|---|
| 攻撃のタイミング | 防御策が実行される前 | 防御策の実行と実際の分岐処理の隙間 |
| 主な標的となる状態 | 分岐予測器の履歴全体 | クリーンにされた直後の空の分岐予測器 |
| 突破する防御機構 | ソフトウェアベースの境界チェック等 | AMD Safe RETやIntel eIBRSなどの最新緩和策 |
| 悪用するシステム機能 | プログラムの通常の分岐命令 | ナノ秒単位で制御されるハードウェアタイマー割り込み |
毎秒5.47バイトで漏出する機密データ
特殊な権限を持たない一般ユーザーのプロセスから攻撃を仕掛けた結果、カーネルのメモリから毎秒5.47バイトの速度でデータを読み出すことに成功した。読み出しの精度は91.97パーセントに達している。
標的となったのは、システム上の全ユーザーのパスワードハッシュを格納する機密ファイルである。現代のオペレーティングシステムは、一般ユーザーがシステムの核心部分にアクセスできないよう厳格な権限分離を行っている。通常、このファイルは最高権限を持つシステム管理者にしか読み取れない。
しかし、10回の試行のうち5回でファイルの正確な位置を特定し、内容を読み出すことに成功した。1回の成功に要した時間は平均して約18分である。漏洩速度の毎秒5.47バイトという数字は一見すると遅いように思えるが、パスワードハッシュや暗号鍵などの機密情報を盗み出すには十分な速度だ。数時間もあれば、システムの根幹を揺るがすデータが外部の手に渡ってしまう。防御機構が働いているはずの最新環境において、この速度と精度で機密ファイルが流出した事実は、現在の無効化ベースの緩和策が持つ限界を示している。研究チームによれば、IntelのCascade Lake RefreshやArrow Lake、AMDのZen 4といった他のアーキテクチャでも、分岐予測の誤判定を誘発できることが確認されている。
ハードウェア設計の根本的見直しへ
パッチによる対症療法の限界
発見された脆弱性に対し、AMDやIntelはLinuxカーネルの更新を通じてソフトウェアパッチによる対応を進めている。特定のレジスタの制御を制限し、隙間に割り込まれた際の影響を最小限に抑える試みである。
だが、ハードウェアの物理的な処理において、予測器の消去と使用を同一のクロックサイクルで実行できない限り、時間差そのものを完全にゼロにすることは難しい。ソフトウェアのアップデートによって数命令の隙間を狭めることはできても、外部からの割り込みが入り込む余地が残る限り、同様の手法が形を変えて現れるリスクは消えない。
アーキテクチャの根幹に潜む未解決の課題
最新のプロセッサは処理速度を追求するあまり、複雑な予測機構と割り込み処理を幾重にも絡み合わせてきた。アーキテクチャの根幹に潜む微小な時間差を設計段階からどう排除するか。
この課題は既存のx86アーキテクチャに限定されない。RISC-VやARMなどの異なる命令セットアーキテクチャにおいても、予測実行と割り込み機構を実装している以上、同じ原理の隙間が生じる可能性がある。完全な防御を実現するためには、割り込みの発生タイミングをプロセッサ側で遅延させる仕組みや、予測器の状態をコンテキストごとに完全に隔離するハードウェア設計の変更が必要となる。
ソフトウェアとハードウェアの境界線で発生する数ナノ秒のレースコンディションを、シリコンの物理層でいかに防ぐか。複雑化する予測機構に対して、どのような条件で割り込みを許可すべきか。次世代のプロセッサ設計において、未解決の問いが残されている。



