2018-01-15

MeltdownとSpectreの原理についてメモ

最近大騒ぎになっているIntelなどのCPUレベル脆弱性、MeltdownとSpectreについてメモ最初キャッシュ内のデータを読み取るのかと勘違いしていたのでその点を中心に。

CPUによってアクセス制限されているはずのカーネル領域データへのアクセスがアウト・オブ・オーダー実行(OoO)で動作してしまうことがある(Meltdown)
OSによってアクセス制限されているはずの別プロセスユーザー領域データへのアクセス投機的実行で動作してしまうことがある(Spectre)

ただし
OoO投機的実行でアクセス制限されている領域へのアクセスが行われても、ソフトウェアアクセス可能レジスタやメインメモリ上の値は、OoO投機的実行もないCPUと変わらない。MeltdownとSpectreでこの原理が破れたわけではない。
キャッシュにはアクセスできない領域データが入っているかもしれないが、ソフトウェアから「L1キャッシュのn番目のデータを読む」といった操作はできないし、実のところMeltdownとSpectreではキャッシュにどんな値が入っているか関係ない。

そこで、OoO投機的実行でアクセス制限されている領域へのアクセスが行われている間に、次のような処理が走るようにする。

a = *kptr; /* kptrはアクセス制限されている領域へのポインタ */
b = array[a<<12]; /* 配列arrayは自プロセス領域12ビットシフトハードウェアプリフェッチャによる先読みの影響を防ぐため。 */

参考:
hiuchidaさん 「MeltdownとSpectreの違いについて分かったこと」
https://qiita.com/hiuchida/items/2248b379197a5052029e
品川高廣さんのツイート
https://twitter.com/utshina2/status/948809945327157253

配列arrayは自プロセス領域内なので後から問題なくアクセス可能変数nをカウントアップしながらarray[n<<12]のアクセス時間順次計測すると、array[(*kptr)<<12]はキャッシュに残っているのでアクセス時間が早い。これによって*kptrの値が推定できる。

まりキャッシュに入っている値そのものではなく、あるアドレスキャッシュされているか否かという形でOoO投機的実行中の一時的な値を記憶させてしまう。

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん