Spectreとは、2018/1/3にGoogle社のProject ZEROによって公開されたCPUに関する脆弱性の一つである。同時にMeltdownと呼ばれる類似の脆弱性も発見された。
また、この記事はセキュリティ問題に対する注意喚起を促すものであり、不正な攻撃を正当化するものではない。
もしあなたに知識があったとしても絶対やんなよ?絶対だぞ?フリじゃないからな?
概要
2018/1/3にGoogle社のProject ZEROによって以下の3つの脆弱性が発表された。
- Variant1(CVE-2017-5753):配列の境界チェックバイパス
- Variant2(CVE-2017-5715):分岐ターゲットインジェクション
- Variant3(CVE-2017-5754):不正なデータキャッシュ読み込み
これらのうちVariant 1,Variant 2を「Spetre」、Variant 3を「Meltdown」と呼称する。
これらの脆弱性は「投機的実行」というCPUの性能をフルに活かすための機能に起因しており、ソフトウェアではなくマイクロアーキテクチャの段階で脆弱性を内包していたという点で話題となった。
「Spetre」を利用した攻撃が行われると、同じ物理コアで実行している別のアプリケーションに割り当てられているメモリのデータを不正に取得される可能性がある。このため、個人PCというよりはクラウドサーバなどの1つのコアが複数ユーザのアプリケーションを実行する可能性の環境で脅威と言える。
対策としては「OS」、「BIOS」、「ソフトウェア」、「ドライバ」などの脆弱性対策のアップデートを行うことが重要であるが、何よりも重要であるのは”不審なアプリケーションを実行しないこと"、”不審なウェブページにアクセスしないこと”である。
Variant 1
「Spectre」のうちVariant 1について詳しく解説する。
Variant 1は「Spectre」を利用した攻撃のうち、条件が整った際にメモリのデータを推定できる状態で保存するプロセスが対応している。
攻撃の理論
Variant 1を利用した攻撃では、「投機的実行」のうち「分岐予測」と言われる機能が利用されている。「分岐予測」はプログラムの投機的実行の実行時に、まだ分岐先が不明である分岐に遭遇した際に、”実行される可能性が高そうな”分岐を判定し、投機的実行として事前に実行する機能である。(ただしこの分岐予測が外れた場合、実行された命令は実行しなかったことにされ、分岐命令までロールバックされる。すなわち分岐先の計算結果は破棄される。)
分岐予測を利用する方法であるが、まずアクセスしたいメモリの領域が不正でないかチェックする条件文を条件とした分岐を作る。
この条件分を投機的実行時の分岐予測で”おそらく不正でない”と分岐予測させる。その状態で分岐先の命令を投機的実行すると、分岐条件の結果が予測した方に分岐しないと判定され、ロールバックされるまでの間は本来アクセス不可能な割り当てられていないユーザ空間のデータを読み出すことが可能である。
そこで、この読み出したデータをキャッシュに格納したいが、そのままのデータをキャッシュに格納し読むことはことは不可能である。よって読み出したデータを適切に計算しキャッシュに保存しておく。
キャッシュに保存されたデータは通常のデータよりも速く読み出すことが出来る。この特性を用いて、先に適切に計算した結果を読み出すように、データにアクセスする。
すると、あるデータアクセス(すなわち適切に計算した結果を利用したアクセス)のみアクセス速度が速くなる。したがってアクセス速度を測定してあげることで、投機的実行時に読み出したデータが何であるかを推測することが可能となる。
この脆弱性を内包するプロセッサー
Variant 1は、現代のプロセッサーのほぼ全てが有している「分岐予測」の機能を巧妙に利用した攻撃に対する脆弱性のため、現代のほぼ全てのプロセッサーが該当する。該当する主なCPUは以下の通り
Variant 2
「Spectre」のうちVariant 2について解説する。
Variant 1は「Spectre」を利用した攻撃のうち、分岐予測をコントロールする役割を担っている。
攻撃の理論
*ここではGoogleのProject Zeroが公開した文書によって解説されている、Intel Haswell CPUに基いて解説していく。
「Spectre」と呼ばれる脆弱性に対する攻撃のうち、そのプロセスの大半は上記のVariant 1の脆弱性を利用して行われるが、そこには問題がある。問題とは”分岐予測のコントロール”であり、Variant 1を実行するのならば分岐予測において、悪意ある命令を実行する分岐に分岐させる必要がある。それを高い精度でコントロールするのがVariant 2となる。
IntelのHaswell CPUに実装されている間接分岐予測器は以下のような特徴を有している。
- 分岐予測では、まず間接分岐予測器が使用される。
- 間接分岐予測器は、分岐元の命令のアドレス12ビットから分岐先の命令を予測する。
- 間接分岐予測に使われるテーブルは、論理コアごとでなく物理コアごとに管理される。
この特徴を用いて分岐予測をコントロールする。
まず、1つの物理コアを分割した2つの論理コアを異なる仮想メモリに割り当て、一方の論理コアで偏った分岐をさせることで、分岐予測のテーブルを恣意的に誘導する。このとき、コントロールしたい分岐予測と予測に使うビットが等しい分岐元から、不正な命令にジャンプするようにしておく。
この状態でVariant 1の条件分岐(真偽不明)に達すると、実行したい命令を投機的実行することが可能となる。
この脆弱性を内包するプロセッサー
Varinat 2の脆弱性も、研究によって分岐予測の仕組みが解明されたプロセッサーは内包することになる。該当する主なCPUは以下の通り
*ただし、AMD製のCPUは原理的に可能とされていながらも、現状はこの脆弱性を突いた攻撃は成功していないとされている。
関連動画
関連項目
関連サイト
- Google Project Zero "Reading privileged memory with a side-channel"
GoogleのProject ZeroがSpectreおよびMeltdownの詳細を解説しているブログ記事。Spectreの項目に関しては非常に詳しく解説されている。ただし英語。
- 0
- 0pt