キャッシュ攻撃(キャッシュこうげき、英: Cache attack)、または、キャッシュサイドチャネル攻撃(キャッシュサイドチャネルこうげき、英: Cache side-channel attack)または、キャッシュタイミング攻撃(キャッシュタイミングこうげき、英: Cache timing attack)とは、暗号化システムやプログラムが物理デバイス上で実行される際に生じるキャッシュのアクセスパターンなどの物理的な痕跡を観測・解析することで、機密情報を抽出するサイドチャネル攻撃である。アルゴリズムの数学的な脆弱性を直接突くのではなく、ハードウェアの実装上の副次的な情報を悪用するのが特徴である。
プロセッサコアとメインメモリ間の処理速度の格差を解消するために実装されている複雑なキャッシュメモリ(L1、L2、共有L3など)の仕組みを標的とする。攻撃の痕跡はキャッシュヒットとキャッシュミスのアクセス時間の差異(数十から数百サイクル)として現れ、被害者のメモリアクセスパターンに関するメタデータを漏洩させる。
キャッシュサイドチャネル攻撃は、AESやRSAなどの暗号アルゴリズムの実装に対して深刻な脅威となる。近年では、投機的実行を悪用するSpectreやMeltdownといったプロセッサのアーキテクチャレベルの脆弱性を狙った攻撃があり、話題となった。米国国立標準技術研究所(NIST)のFIPS 140-3規格における評価要件にも組み込まれるなど、システム設計における最重要課題の一つとなっている。
概要 攻撃者は、アルゴリズムの実行時間やキャッシュの状態を監視することで、内部状態や秘密鍵を推測する。この過程において、アルゴリズム固有の最適化手法が攻撃の足場(フットプリント)として機能することが多い。
AESのソフトウェア実装においては、処理の高速化を目的としてT-Tableが頻繁に用いられる。AESの暗号化プロセスでは、平文と秘密鍵の排他的論理和(XOR)が計算され、その結果がT-Tableのインデックスとして使用される。T-Tableへのメモリアクセスはデータ依存であるため、攻撃者がキャッシュの状態を監視し、どのキャッシュラインがアクセスされたかを特定できれば、逆算によって秘密鍵の特定の情報を抽出することが可能となる。
RSA暗号アルゴリズムは、本質的に計算コストの高いモジュラべき乗演算に依存している。計算時間を短縮するために、ソフトウェアライブラリは多数の数学的最適化を実装している。例えば、中国の剰余定理(CRT)を適用してべき乗演算を素数pとqの剰余演算に分割する手法や、複数の指数ビットを一度に処理するスライディングウィンドウ法、事前計算された乗数を用いてモジュラ乗算を高速化するモンゴメリ乗算、さらにはオペランドの桁数が等しい場合に有効なカラツバ法などである。これらの最適化は処理を劇的に高速化する一方で、メモリアクセスパターンや分岐の実行タイミングに大きな差異を生じさせる。例えば、「Square and Multiply」アルゴリズムの実行中に、乗数オペランドがキャッシュに存在するか否かのアクセス時間を計測することで、攻撃者は512ビットのRSA指数のうち最大で200ビットを抽出できることが実証されている。
攻撃の種類 主要な攻撃手法は、そのメカニズムや観測対象によって以下の3つに大別される。
Flush+Reload(再利用ベースの攻撃) Flush+Reloadは、攻撃者と被害者がOSのページ重複排除や共有ライブラリなどを通じて物理メモリを共有している環境において有効な、アクセス駆動型の攻撃手法である。攻撃は主に「Flush(排出)」「Idle(待機)」「Reload(再読込)」の3フェーズで構成される。まず攻撃者は特定のメモリアドレスをキャッシュから強制的に排出する。一定の待機時間を与えて被害者に処理を行わせた後、攻撃者は再び同じアドレスにアクセスし、その応答時間を計測する。応答時間が短ければ、被害者が待機中にそのデータにアクセスし、キャッシュに再ロードしたと推測できる。高精度な監視が可能である反面、対象データが共有メモリ上に存在し、かつ特定のキャッシュ操作命令(clflushなど)が実行可能であるという環境的制約を伴う。
Prime+Probe(競合ベースの攻撃) Prime+Probeは、メモリの共有を前提とせず、任意のアーキテクチャに対して広く適用可能な競合ベースの攻撃手法である。本手法は「Prime(充填)」「Idle(待機)」「Probe(探査)」の3フェーズから成る。攻撃者はまず、標的とするキャッシュセットを自身のデータ(Eviction Set)で完全に埋め尽くす。被害者の実行を待機した後、攻撃者は再び自身のデータにアクセスし、それぞれのアクセス時間を計測する。このときアクセスに遅延が生じていれば、ハードウェアの置換ポリシーによって攻撃者のデータが押し出された(すなわち、被害者が当該キャッシュセットを利用した)ことが証明される。共有メモリが不要であるため脅威の適用範囲は広いが、現代のプロセッサにおける複雑なキャッシュ構造や非公開のハッシュ関数を特定し、正確なセットを構築する高度な技術が要求される。
Evict+Time(タイミング駆動型の攻撃) Evict+Timeは、個々のメモリアクセスを監視するのではなく、対象となる処理全体の実行時間を計測するタイミング駆動型の同期型攻撃手法である。攻撃プロセスとして、まず特定のキャッシュセットを意図的に排出しておく。その後、被害者プロセスに対して暗号化などの操作をトリガーし、その処理にかかった総実行時間を計測する。もし被害者の実行プロセスにおいて、事前に排出されたキャッシュセットのデータが必要となった場合、キャッシュミスによるペナルティが発生して全体の処理時間が通常より長くなる。この微小な時間差を統計的に分析することで、被害者がアクセスしたキャッシュ領域を推測する。処理全体を計測するという性質上、システム内の様々なタイミングノイズの影響を強く受けるため、精度は比較的低く、情報抽出には膨大な試行回数を要する。
Meltdown
Meltdownは、プロセッサの例外実行の副作用を悪用し、カーネル空間とユーザ空間のメモリ分離を破壊するハードウェアレベルの脆弱性である。
現代のプロセッサは、パイプラインのストールを避けてスループットを最大化するため、先行する命令がメモリフェッチ等で待機している間、リソースが利用可能な後続の命令をプログラムの順序に関係なく実行する。ユーザ権限のプロセスが、アクセス権限のないカーネル空間や物理メモリアドレスからデータを読み出そうとした場合、アーキテクチャレベルでは最終的にページテーブルの権限チェックに失敗し、例外が発生する。これにより、不正な命令によるレジスタへの書き込みやメモリへの変更はすべて破棄され、プログラムは強制終了または例外ハンドラに移行する。
しかし、Meltdownの脆弱性を持つプロセッサでは、権限チェックの完了を待つ間に、アウトオブオーダ実行ロジックが特権メモリから読み出した機密データを一時的な内部レジスタに格納し、さらにその後続のトランジェント命令を継続して実行してしまう。攻撃者は、この取得した機密データをインデックスとして使用し、ユーザ空間に用意したプローブ配列にアクセスするコードを巧妙に記述する。例えば、機密データのバイト値がkである場合、プローブ配列へのアクセスアドレスは次のように計算される。
Address = ProbeArray + (k * 4096)
ここで4096を乗算しているのは、ハードウェアプリフェッチャによる隣接キャッシュラインの自動ロードを防ぎ、純粋に機密データに依存した単一のページのみがキャッシュにロードされるようにするための工夫である。例外の発生に伴い、アーキテクチャ上のレジスタ状態は完全にリセットされるが、インデックスkに対応するキャッシュラインはL1キャッシュに残存したままとなる。
攻撃者は、TSXなどを用いて例外を抑制したのち、Flush+Reload手法を用いてプローブ配列の全256ページをスキャンする。最もアクセス時間が短いページを特定することで、間接的にkの値を完全に復元する。Meltdownは、最適化された条件下において最大で503 KB/sの速度で物理メモリ全体をダンプする能力があり、エラー率も0.003%という極めて高い精度を誇る。
Spectre
Spectreは投機的実行とそれを制御する分岐予測器を標的とする。このため、Spectreは特定の権限バイパスバグに依存せず、広範なアーキテクチャに影響を及ぼす。
条件分岐の評価に時間がかかる場合、プロセッサは過去の実行履歴を元に分岐の方向を予測し、そのパスを投機的に実行する。Spectre Variant 1では、攻撃者は配列の境界チェックロジックを悪用する。 攻撃者はまず、正当な範囲内のxの値を繰り返し入力し、プロセッサの分岐予測器に対してこの分岐は常に真であると学習させる。その後、攻撃者は悪意のある境界外のxを入力する。プロセッサはキャッシュミスなどにより実際の条件評価が遅延している間、分岐予測器の履歴に従ってブロックの内部を投機的に実行してしまう。
この投機的実行中、境界外の機密データが読み出され、それがメモリアクセスのインデックスとして使用される。プロセッサが誤予測に気付き、投機的実行を破棄してレジスタをロールバックした時点では、既に該当するキャッシュラインがロードされた後である。攻撃者は再びFlush+Reload等の手法を用いてキャッシュの変化から機密データを読み取る。
Variant 2は、さらに高度な手法である。攻撃者は分岐先予測バッファを汚染し、間接分岐を攻撃者が選定した任意のガジェットへ投機的にジャンプさせる。
その他の攻撃
Foreshadow / L1TF (CVE-2018-3615) - 無効なページテーブルエントリの処理を悪用し、Intel SGXエンクレーブ内から暗号鍵を抽出する。 MDS (ZombieLoad, RIDL, Fallout) - L1キャッシュミス時に使用されるLFBなどから、投機的実行中に他プロセスのデータを無差別にサンプリングする。 Retbleed (CVE-2022-29900) - RSBのアンダーフロー状態を意図的に引き起こすことで、Retpolineを完全にバイパスし、任意の投機的実行を引き起こす。 Downfall / GDS (CVE-2022-40982) - AVX2/AVX-512におけるGather命令の最適化処理の欠陥を突き、ベクトルレジスタの残存データを窃取する。 Zenbleed (CVE-2023-20593) - vzeroupper命令の投機的実行とそのリカバリ処理のバグを突き、XMMレジスタの内容をプロセス境界を越えて流出させる。 Inception (CVE-2023-20569) - Phantom攻撃を応用し、短命な予測ミスを利用して戻り先アドレスを汚染する。
防御・緩和策
キャッシュの分離 学術界では、命令セットアーキテクチャを拡張し、機密データをキャッシュラインにロックすることで他プロセスからのエビクションを防ぐ概念が提唱されている。商用実装例として、IntelはResource Director Technology (RDT)、AMDはPlatform Quality of Service Extensions (QoSE)という高度なリソース管理機能を提供している。RDTの中核を成すCATは、L2/L3キャッシュの容量をソフトウェアから制御する仕組みである。
Linuxカーネルにおいては、resctrlファイルシステムを通じてRDTが管理される。排他モードを利用すると、特定のセキュリティ重視のプロセスに専用のキャッシュ領域を割り当て、他のプロセスとの重複を完全に排除できる。また、疑似ロック機能は、割り当てたキャッシュ領域をキャラクターデバイスとしてメモリにマッピングし、機密データをキャッシュ内にピン留めする機能である。これにより、攻撃者がEvictやPrimeを試みても機密データが追い出されることがなくなり、タイミングの変動を観測されるリスクを排除できる。さらにRDTは、コードとデータを分離して割り当てるCDPや、メモリ帯域幅を制御するMBAなどを統合的に提供している。
キャッシュマッピングのランダム化 キャッシュマッピングをランダム化することで、メモリアドレスとキャッシュ内の格納場所の固定的な対応関係を破壊し、攻撃者が標的のデータ位置を特定することを防ぐことができる。RPcacheやCEASERといったアーキテクチャは、暗号論的にランダム化する。
しかし、近年の体系的なセキュリティ分析により、ランダム化アーキテクチャであっても、最適化手法やマルチステップ・プロファイリングを用いることで、統計的に衝突セットを再構築可能であることが証明されている。ランダム化によって真のセキュリティを担保するには頻繁な鍵の更新が不可欠であるが、結果として甚大なパフォーマンス低下を引き起こす結果となっている。
OSレベルのアイソレーション機能 Meltdownに対する決定的なソフトウェア緩和策として実装されたのがKPTIである。KPTIは、カーネルのページテーブルをユーザ空間の仮想アドレス空間にマッピングしないようにするOSの改修である。しかし、特定のワークロードにおいてはパフォーマンスに影響を与える。
また、再利用ベースの攻撃は、OSによるメモリの重複排除メカニズムに依存している。主要なハイパーバイザは、デフォルトでこの機能を無効化することで強力な防御手段としている。さらに、ページカラーリング技術は、ハードウェアの改修なしに論理的にキャッシュのパーティショニングを実現する。
定数時間アルゴリズムによるセキュアコーディング 暗号ライブラリにおける根本的な解決策は、アルゴリズムの実行時間やメモリアクセスパターンが入力データに一切依存しない定数時間の実行を保証することである。例えば、OpenSSLにおけるAESの実装は、キャッシュ依存のT-Tableによる実装から、論理演算のみで処理を行うビットスライス実装や、定数時間のAES-NI命令群への依存へと移行している。
HPC 最新のCPUに内蔵されたHPCが積極的に活用されている。サイドチャネル攻撃者は、特異なイベントのスパイクが発生する。監視システムは、HPCのデータを常時監視し、特有のアクセスパターンを高精度で検出する。近年では、収集されたHPCデータに対してディープラーニングやニューラルネットワークのモデルを適用するシステムが登場し、リアルタイムに分類・ブロックする統合防御システムへと進化している。しかし、既存のHPCベースの検知ロジックはキャッシュミスのスパイクを捉えきれず無力化される可能性が示摘されている。
脚注
関連項目 サイドチャネル攻撃 Spectre Meltdown キャッシュメモリ