Spectre Variant 3 : rogue data cache load (Meltdown)(CVE-2017-5754) を解説

#はじめに
2018年1月、Meltdown/Spectreで大騒ぎになりました。ここではMeltdownについて扱います。MeltdownはCPUのmicro-architectureの脆弱性を利用したサイドチャネル攻撃で、読めないはずのカーネルメモリの内容を読めてしまうという、カーネルを守る壁を溶かしてしまう不思議な攻撃です。
どうやっているんでしょうね？

#脆弱性の内容
##前提知識
CPU cache、out-of-order実行、例外(一般保護違反)


##Meltdown
[【論文】Meltdown](https://meltdownattack.com/meltdown.pdf) にPoCが載っています。

```
1     ; rcx = kernel address
2     ; rbx = probe array
3 retry:
4     mov al, byte [rcx] ; kernelのメモリを1バイト読み出す
                         ; 権限がないのでここで例外(一般保護違反)が上がるが、
                         ; 上る前に下のコードがout-of-order実行機構に
                         ; よって実行されるというのがキモの部分。
5     shl rax, 0xc       ; 読み出した値に 4096 をかける
6     jz retry           ; 4行目でkernelメモリを読み出すときに例外が投げ
                         ; られ読めなかった時、alは0になる場合があるそう
                         ; です。その時は読めるまでリトライするそうです。
                         ; (論文の5.2より)
                         ; でもkernelメモリの値が0だったときに引っかかりますね。
7     mov rbx, qword [rbx + rax] ; array[rax * 4096] ということ
```

5行目の 4096 という数字はpage size(=4KB)と一致します。もしかしたらOSによってpage inしたときにページ内のデータがすべてキャッシュに乗る場合がある時対策かもしれません。

C言語で擬似コードを書くと以下ですね。

```c:
static int probe[256 * 4096];
// probeのすべての領域をフラッシュしてキャッシュから追い出す.
unsigned char k = &0xXXXXXXXX; // 読みたい kernel memory アドレス.
unsigned char a = *k; // カーネルメモリから1バイト読み出す.
int tmp = probe[a * 4096]; // カーネルから読み出した値をインデックスとして値読み出し。つまりキャッシュに乗る。
```
もちろんカーネルメモリを読めないので処理は巻き戻って状態が元に戻りますが、CPUキャッシュに特定のアドレスが載っている載っていないという情報は残るのでそこをうまく使ったということです。


あとはprobe配列の値を 
1 * 4096
2 * 4096
3 * 4096
・・・
と時間を測りつつ読み出していき、キャッシュに載っている場合は高速で読み出せるのでそこのインデックスからカーネルメモリの値がわかるというものです。
(ちなみにここがサイドチャネル攻撃と呼ばれる部分)

![003.jpg](https://qiita-image-store.s3.amazonaws.com/0/272771/2be22796-c378-5ff1-d708-4bfad76630e1.jpeg)
論文のFig.4から抜粋。一つだけアクセスタイムが200 cycleというのがありますが、ここがカーネルメモリの値ということです。


#感想
カーネルメモリを読みに行ったときに上がる例外のタイミングが遅いからこうなるってことなんでしょうね。AMDは命令を実行する時、逐次権限チェックをしっかりしてるんでしょう(たぶん)。

かなり面白い手法です。

ちなみにMeltdownの攻撃手法は Spectre Variant 1 とほとんど同じなんですが、あちらは分岐予測と投棄実行を利用、こちらはooo実行を利用というのが違います。

#CVE
CVE-2017-5754
CVSSv3=5.5, AV:L/AC:L/PR:N/UI:N/S:C/C:H/I:L/A:N

#参考

[【論文】Spectre Attacks: Exploiting Speculative Execution](https://spectreattack.com/spectre.pdf)

[【論文】Meltdown](https://meltdownattack.com/meltdown.pdf)

[【wikipedia】Spectre](https://ja.wikipedia.org/wiki/Spectre)

[【wikipedia】Meltdown](https://ja.wikipedia.org/wiki/Meltdown)

[【Project Zero】Reading privileged memory with a side-channel](https://googleprojectzero.blogspot.com/2018/01/reading-privileged-memory-with-side.html)

[【PDF】Meltdown Spectre - SANS.org](https://www.sans.org/webcasts/downloads/106815/slides)

[【wikipedia】アウト・オブ・オーダー実行](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%A6%E3%83%88%E3%83%BB%E3%82%AA%E3%83%96%E3%83%BB%E3%82%AA%E3%83%BC%E3%83%80%E3%83%BC%E5%AE%9F%E8%A1%8C)

[【@IT】第212回 大騒ぎのSpectreとMeltdownの脆弱性をざっくりと解説](http://www.atmarkit.co.jp/ait/articles/1801/23/news021.html)

[【Qiita@msmania】Windows で Meltdown する](https://qiita.com/msmania/items/794e3dbe82db86c4c4e6)

[【Qiita@msmania】Windows で Spectre する](https://qiita.com/msmania/items/eab61240f8b4f71b0177)

[【はてな】Spectre & Meltdown を防ぐマイクロアーキテクチャSafeSpecの論文を読む](http://msyksphinz.hatenablog.com/entry/2018/06/20/040000)

[【Hisa Ando】新たな脅威 - SpectreとMeltdown](https://news.mynavi.jp/series/spectre_meltdown)

[CVE-2017-5754 - Red Hat Customer Portal](https://access.redhat.com/ja/security/cve/cve-2017-5754)

#履歴
2018/08/12 初版