キャッシュアタックについてのまとめ
例のリレーブログです。
前回はこちら。
今回のテーマは「キャッシュアタック」です。サイドチャネル攻撃の一種なのらしいのですが、私自身はじめて知った攻撃手法なのでなんとか頑張りたいと思います。
ちなみに不正確な記述がある可能性が高いです。あくまでもこの分野の取っ掛かり程度に見てください。
また、この分野に詳しい人はどんどん間違い等指摘してくださると幸いです。
サイドチャネル攻撃とは
サイドチャネル攻撃(サイドチャネルこうげき、side-channel attack)とは、暗号装置の動作状況を様々な物理的手段で観察することにより、装置内部のセンシティブな情報を取得しようとする攻撃(暗号解読)方法の総称である。(Wikipedia)
似た攻撃手法としてテンペスト攻撃がありますが、これは微弱な電磁波を傍受して情報を得る攻撃です。一方サイドチャネル攻撃は暗号解読に重きを置いているので、その点が異なるらしいです。
サイドチャネル攻撃にはその手法から、タイミング攻撃、故障利用攻撃、電力解析攻撃、電磁波解析攻撃、音響解析攻撃などいくつもの種類に分けられ、キャッシュアタックもそのひとつです。ただ、日本語の情報が少なく、(キャッシュアタックで検索するとDNSキャッシュポイズニングが出てくる)情報の収集に苦労しました。
サイドチャネル攻撃の種類
- タイミング攻撃
計算の実行にかかる時間を測定してその差を利用して攻撃を行う
- 故障利用攻撃
計算に意図的に不正な値などを入れることで得られる値と正規の値を比較して攻撃を行う
- 電磁波解析攻撃
機器から漏れ出した微弱な電磁波を傍受して攻撃を行う
- 電力解析攻撃
機器の消費電力を解析して攻撃を行う
- 音響解析攻撃
機器から出るノイズなどを解析して攻撃を行う
- キャッシュ攻撃
本日の本題。
キャッシュアタックとは
いよいよ本命のこれです。例によってまずはWikipediaからの引用です。
仮想化環境やクラウドサービスのような共有された物理システムにおいて、被害者が行ったキャッシュアクセスを監視する攻撃者の能力に起因する攻撃。(Wikipedia)
後述する例では仮想環境やクラウドサービスなどに限らず、ハードウェアやOSレベルでの攻撃を見ていくのですが、大意としてはキャッシュアクセスを監視することによって情報を盗み取るという感じですかね。
また、キャッシュアタックは攻撃側のプログラムと被害側のプログラムが同じキャッシュ領域を使っていないと成り立ちません。
そのため、対象となるキャッシュはLLC(Last Level Cache 最近は専らL3キャッシュ)となります。LLC side-channel attackなどで検索するといい感じに情報が出てきます。(英語ですが……)
Spectre & Meltdown
例として、2017年に一世を風靡した脆弱性である「Spectre(CVE-2017-5753 CVE-2017-5715)」「Meltdown(CVE-2017-5754)」もCPUのキャッシュを利用したサイドチャネル攻撃であるとされています。
これらは現代のCPUに実装された投機的実行という最適化を悪用したものです。Out of Order(OoO)という依存関係にない命令の並列化や分岐予測器を組み合わせることによって成り立っているのですが、例えばSpectreは、この時にできるキャッシュから本来は読み取ることのできないメモリデータをロードできてしまうという脆弱性です。
主要なCPUの多くがこの脆弱性を持つことが明らかになり、大きな話題となりました。
その後、OSレベルでの対策が取られています。
Flush + Reload
ちなみにキャッシュの読み取りにはFlush + Reloadという技術が使われるらしいです。
この攻撃の前提条件として、攻撃側と被害側が同じメモリ領域を共有している必要があります。
メモリアクセスのレイテンシの差を利用した攻撃で、
- まずキャッシュをクリアする(追い出す)
- 一定時間待つ
- 対象のキャッシュにアクセス
というステップで実行されます。
3のレイテンシが短ければ2の間に対象のプログラムが対象のキャッシュ領域を使ったことが分かります。
Page Cache Attacks
また、「Page Cache Attacks(CVE-2019-5489)」というものもあり、こちらはハードウェアに依存しないソフトウェアレベルの脆弱性です。
Linuxカーネルでは、補助記憶からデータを読み書きする時にまずページキャッシュという主記憶上の空間を参照します。ページキャッシュに目的のデータがあればそれを参照し、なければ補助記憶から読みだし他データをそこに追加されます。
攻撃プログラムは、対象のプログラムと同じページキャッシュにアクセス可能な時(同じ共有ライブラリやファイルを利用しているなど)、ページキャッシュ内の特定のページがアクセスされたかどうかという情報を利用して対象のプログラムの動作を知ることができます。
具体的にはmincore()システムコールを使うことで効率的にページキャッシュに特定のファイルが存在するか否かを調べることができるということです。
Linux各ディストリビューションではmincore()の動作を一部変更することによって対策が施されました。
終わりに
今回の攻撃を根本から理解するためにはCPUアーキテクチャやLinuxカーネルなどに対する一定程度の知識がないと厳しそうです。
私も余り理解できていません!低レイヤ難しい!
ただ、サイドチャネル攻撃自体、表面を触る程度しか勉強してこなかったのでこんなにも奥が深いものなのかと思わされました。特にキャッシュ攻撃はハードウェアソフトウェア問わず色々な分野で起こり得るので今後もアンテナを張っていきたいです。
このような全然知らない分野を勉強できるのはリレーブログの強みですね。
間違い等どんどん指摘してください!
次回はこちらの予定です。
参考文献
Side-channel attack - Wikipedia
Page Cache Attacks (CVE-2019-5489) について - Qiita
[SpectrePrime] [MeltdownPrime] とCPUのサイドチャネル攻撃 〜Evict-Time/Prime-Probe/Flush-Reload〜 | SEの道標