CPU のキャッシュサイドチャネル(CSC: Cache Side Channel)攻撃の概要と種類
Spectre/Meltdown の登場以降、CPU のキャッシュサイドチャネル攻撃というのがよく話題に上がるようになりました。
このキャッシュサイドチャネル攻撃は、「攻撃者のプログラムと攻撃を受けるプログラムが互いにキャッシュ領域を奪い合う状態」を利用したものです。対象となるキャッシュは LLC (Last Level Cache)、つまり最下層のキャッシュです。最近の主流は L3 キャッシュです。
L3 キャッシュでは L1/L2 キャッシュとは異なり、全ての CPU コアで共有された領域となり、サイドチャネル攻撃を実行するのに適しています。
サイドチャネル攻撃の概要
例えば攻撃者が興味対象のキャッシュ領域をクリアし、一定時間待った後にそのキャッシュ領域へのアクセスを試みます。
アクセス時間が短ければキャッシュがあるので「攻撃対象のプログラムは興味対象のキャッシュ領域を使った」と判断できます。
逆に長ければ「攻撃対象は興味対象のキャッシュ領域を使わなかった」と判断できます。
このように、攻撃者はあるキャッシュ領域を自分が把握できる状態にし、その後アクセスを試み、その時間の長短を測ることで、攻撃対象のプログラムがキャッシュを使ったかどうかを観測できます。
サイドチャネル攻撃の種類
このキャッシュサイドチャネル攻撃はいくつか種類がありますが、よく使われるものとしては 3 種類あります。
Evict+Time
この攻撃の前提は、悪意あるプログラムが「攻撃対象の関数を自由に呼び出せる」ことです。
STEP は以下の通りです。
- 攻撃対象の関数を呼び出し、実行時間を計測(Time)
- 興味対象のキャッシュセット領域を自身のデータで埋め尽くし、既存キャッシュを追いやる(Evict)
- 再度攻撃対象の関数を呼び出し、実行時間を計測(Time)
もし 1 と 3 の実行時間が同じくらいであれば、「その領域は使われていなかった」と判断でき、また、1 よりも 3 のほうが実行時間が長ければ、「1 の時点ではキャッシュが使われていた」と判断できます。
この攻撃のメリットは、時間軸を考慮する必要が無いことですが、デメリット (前提) として前述の通り攻撃対象の関数を自由に呼び出す必要があることです。
Prime+Probe
この攻撃の前提は特にありません。STEP は以下の通りです。
- 興味対象のキャッシュセット領域を自身のデータで埋め尽くす (Prime)
- 攻撃対象が活動する時間として一定時間待つ
- 興味対象のキャッシュセット領域へアクセス (Probe)
もし 3 でのアクセス時間が長ければ、キャッシュが無くなったと解釈し、「2 の一定時間で攻撃対象が興味対象のキャッシュセットを利用した」と考えられます。
この攻撃のメリットは、攻撃対象の関数を呼び出す必要が無いことです。ただし、デメリットとして攻撃対象の活動とシンクロする必要があること、攻撃対象以外の関数の影響を受けてしまうことが挙げられます。
Flush+Reload
この攻撃の前提は「悪意あるプログラムが攻撃対象とメモリを共有している」ことです。
具体的なシナリオは、ハイパーバイザの機能による、VM 間のメモリ共有です。ハイパーバイザ上で同一バージョンの同一 OS を複数動作させる場合、それらのメモリの使い方は非常に似通っているため、メモリ節約の観点で、重複する箇所を 1 つに共有することが仮想化環境ではよくあります。
STEP は以下の通りです。
- 攻撃対象のキャッシュラインを clflush 等でクリア (Flush)
- 攻撃対象が活動する時間として一定時間待つ
- 興味対象のキャッシュラインへアクセス (Reload)
もし 3 でのアクセス時間が短ければ「2 の一定時間で攻撃対象が興味対象のキャッシュセットを利用した」と考えられます。
この攻撃のメリットは、キャッシュセットではなくキャッシュラインをクリアするため、観測範囲をより限定でき、ノイズが少ないことです。ただし、デメリットとして前述の通り、攻撃対象とメモリを共有している必要があります。
SpectrePrime と MeltdownPrime
2018年2月14日、Spectre と Meltdown の新たなバリエーション (Variant) が発見されました。発見したのは NVIDIA とプリンストン大学の研究者です。
これらの攻撃は SpectrePrime と MeltdownPrime と名付けられました。由来は、これらの攻撃の基本は変わらず、サイドチャネル攻撃の方式が『Flush+Reload』では無く『Prime+Probe』を使うためです。
Flush+Reload では悪意あるプログラムと攻撃対象のプログラムがメモリ空間を共有している必要がありますが、Prime+Probe ではその必要がありません。
オリジナルの Meltdown の論文の 5 ページ目には以下のように書かれており、精度が低いことを理由として選択肢から除外しています。
Spectre の論文も同様に以下のように記載しています。
この攻撃発見者の主張としては、以下の通りです。
- 独自開発したツールにより今回の脆弱性を発見できた
- Spectre と Meltdown の論文では精度を理由に Prime+Probe の選択肢を除外しているが、同レベルでの Prime+Probe での攻撃は可能である
- ソフトウェアレベルのパッチは Spectre, Meltdown と同じもので効果はあるが、ハードウェアレベルの修正は異なるものになるはずだ
どちらかというと、新たな攻撃手法の発見というよりは、独自開発した脆弱性発見ツールが有能だということを主張したいように見えました。
コメント