[SpectrePrime] [MeltdownPrime] とCPUのサイドチャネル攻撃 〜Evict-Time/Prime-Probe/Flush-Reload〜

CPU のキャッシュサイドチャネル(CSC: Cache Side Channel)攻撃の概要と種類

Spectre/Meltdown の登場以降、CPUのキャッシュサイドチャネル攻撃というのがよく話題に上がるようになりました。

このキャッシュサイドチャネル攻撃は、「攻撃者のプログラムと攻撃を受けるプログラムが互いにキャッシュ領域を奪い合う状態」を利用したものです。対象となるキャッシュはLLC(Last Level Cache)、つまり最下層のキャッシュです。最近の主流はL3キャッシュです。

L3キャッシュではL1/L2キャッシュとは異なり、全てのCPUコアで共有された領域となり、サイドチャネル攻撃を実行するのに適しています。

サイドチャネル攻撃の概要

例えば攻撃者が興味対象のキャッシュ領域をクリアし、一定時間待った後にそのキャッシュ領域へのアクセスを試みます。アクセス時間が短ければキャッシュがあるので「攻撃対象のプログラムは興味対象のキャッシュ領域を使った」と判断できます。逆に長ければ「攻撃対象は興味対象のキャッシュ領域を使わなかった」と判断できます。

このように、攻撃者はあるキャッシュ領域を自分が把握できる状態にし、その後アクセスを試み、その時間の長短を測ることで、攻撃対象のプログラムがキャッシュを使ったかどうかを観測できます。

サイドチャネル攻撃の種類

このキャッシュサイドチャネル攻撃はいくつか種類がありますが、よく使われるものとしては3種類あります。

Evict+Time

この攻撃の前提は、悪意あるプログラムが「攻撃対象の関数を自由に呼び出せる」ことです。

STEPは以下の通りです。

  1. 攻撃対象の関数を呼び出し、実行時間を計測(Time)
  2. 興味対象のキャッシュセット領域を自身のデータで埋め尽くし、既存キャッシュを追いやる(Evict)
  3. 再度攻撃対象の関数を呼び出し、実行時間を計測(Time)

もし1と3の実行時間が同じくらいであれば、「その領域は使われていなかった」と判断でき、また、1よりも3のほうが実行時間が長ければ、「1の時点ではキャッシュが使われていた」と判断できます。

この攻撃のメリットは、時間軸を考慮する必要が無いことですが、デメリット(前提)として前述の通り攻撃対象の関数を自由に呼び出す必要があることです。

Prime+Probe

この攻撃の前提は特にありません。STEPは以下の通りです。

  1. 興味対象のキャッシュセット領域を自身のデータで埋め尽くす(Prime)
  2. 攻撃対象が活動する時間として一定時間待つ
  3. 興味対象のキャッシュセット領域へアクセス(Probe)

もし3でのアクセス時間が長ければ、キャッシュが無くなったと解釈し、「2の一定時間で攻撃対象が興味対象のキャッシュセットを利用した」と考えられます。

この攻撃のメリットは、攻撃対象の関数を呼び出す必要が無いことです。ただし、デメリットとして攻撃対象の活動とシンクロする必要があること、攻撃対象以外の関数の影響を受けてしまうことが挙げられます。

Flush+Reload

この攻撃の前提は「悪意あるプログラムが攻撃対象とメモリを共有している」ことです。具体的なシナリオは、ハイパーバイザの機能による、VM間のメモリ共有です。ハイパーバイザ上で同一バージョンの同一OSを複数動作させる場合、それらのメモリの使い方は非常に似通っているため、メモリ節約の観点で、重複する箇所を1つに共有することが仮想化環境ではよくあります。

STEPは以下の通りです。

  1. 攻撃対象のキャッシュラインをclflush等でクリア(Flush)
  2. 攻撃対象が活動する時間として一定時間待つ
  3. 興味対象のキャッシュラインへアクセス(Reload)

もし3でのアクセス時間が短ければ「2の一定時間で攻撃対象が興味対象のキャッシュセットを利用した」と考えられます。

この攻撃のメリットは、キャッシュセットではなくキャッシュラインをクリアするため、観測範囲をより限定でき、ノイズが少ないことです。ただし、デメリットとして前述の通り、攻撃対象とメモリを共有している必要があります。

SpectrePrime と MeltdownPrime

2018年2月14日、SpectreとMeltdownの新たなバリエーション(Variant)が発見されました。発見したのはNVIDIAとプリンストン大学の研究者です。

これらの攻撃は SpectrePrimeMeltdownPrime と名付けられました。由来は、これらの攻撃の基本は変わらず、サイドチャネル攻撃の方式が『Flush+Reload』では無く『Prime+Probe』を使うためです。

Flush+Reload では悪意あるプログラムと攻撃対象のプログラムがメモリ空間を共有している必要がありますが、Prime+Probe ではその必要がありません。

オリジナルのMeltdownの論文の5ページ目には以下のように書かれており、精度が低いことを理由として選択肢から除外しています。

There are other side channels as well which also detect whether a speci c memory location is cached, including Prime+Probe [28, 24, 26], Evict+ Reload [23], or Flush+Flush [10]. However, as Flush+ Reload is the most accurate known cache side channel and is simple to implement, we do not consider any other side channel for this example.

Spectre の論文も同様に以下のように記載しています。

In this work we use the Flush+Reload technique [21, 36] and its variant, Evict+Reload [20] for leaking sensitive information.

この攻撃発見者の主張としては、以下の通りです。

  1. 独自開発したツールにより今回の脆弱性を発見できた
  2. SpectreとMeltdownの論文では精度を理由にPrime+Probeの選択肢を除外しているが、同レベルでのPrime+Probeでの攻撃は可能である
  3. ソフトウェアレベルのパッチはSpectre, Meltdown と同じもので効果はあるが、ハードウェアレベルの修正は異なるものになるはずだ

どちらかというと、新たな攻撃手法の発見というよりは、独自開発した脆弱性発見ツールが有能だということを主張したいように見えました。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする