GoogleがCPUに含まれるバグを発見したということが話題です。
その後、インテルがCPUのマイクロコードを修正するアップデートを公開しましたが、これが原因でPCが起動しなくなることがあったとしてアップデートを取り消したというのでまたニュースになりました。(そして、マイクロコードってアップデートできるんだ、という素朴な驚きがありました。)
そんなCPUのバグですが、こちらの解説によると、大きく3つあったそうで、以下にざっと書くと、
1、Spectre(分岐予測の脆弱性 その1)
分岐先の処理を先にやっちゃうことの脆弱性
インテル、ARM、AMDのCPUが影響
2、Spectre(分岐予測の脆弱性 その2)
キャッシュされたアドレスに不正にアクセスされてしまう脆弱性
インテル、ARMのCPUが影響
3、Meltdown(投機実行の脆弱性)
先行する処理を先にやっちゃうことの脆弱性
インテル、ARMのCPUが影響
詳しくは以下に書きますが、全部キャッシュメモリに関する脆弱性みたいです。
以下、もう少し詳しく書きます。
1、Spectre(分岐予測の脆弱性 その1)
分岐予測っていうのがCPU内にあるのですが、例えば以下の処理を行うプログラムがあったとします。
①「A=1か?」
②「YES」の時の処理
③「NO」の時の処理
人間が①〜③のプログラムをやる場合、
①の比較処理をやって、「A=1」だったら②をやる。(③はやらない)
となるのですが、
実際にはCPUは高速化の為に内部で複数の処理を並行して行うようになっているので、
CPU内部では①と②と③の処理が全部同時に行われるそうです。
とりあえず①も②も③も同時にやっておいて、①の比較の結果が分かったら②か③のどちらかの処理をなかったことにする。
⭐️何が危険なのか?
プログラムの変数「A」を、カーネル内の変数にすると、CPUによって境界チェックが行われてカーネルデータが読み取れないよう保護されるんですが、その時にカーネルデータがキャッシュに読み込まれた状態になります。
同時に投機実行によって②も③も行われるので、②か③にそのデータを利用する処理があった場合、カーネルデータを推定できてしまう、という脆弱性みたいです。
2、Spectre(分岐予測の脆弱性 その2)
最近のCPUは、Core i7は4コア8スレッドとか言われるように、1つのコア内に複数のスレッドというのがあります。
ある特定のスレッドでカーネルが処理を行っていたとして、カーネルがデータを読み込むと、そのデータはキャッシュに格納されます。
ところで、もう1つ別のスレッドで一般のアプリケーションプログラムが処理を行っていたとします。
そのプログラムがカーネルのデータを読み込もうとしても、普通はCPUの保護機能が働いてアクセスできないんですが、先にカーネルがキャッシュしたアドレスの12ビットは分岐予測のためスレッド間で共通して利用できるようになっています。
⭐️何が危険なのか?
カーネルがキャッシュしたメモリを、別スレッドの一般プログラムが読み出せるというのが脆弱性です。
ただ、これを悪用するのはすごく難しそうです。
3、Meltdown(投機実行の脆弱性)
これは1の脆弱性と似ています。
例えば、次の処理を行うプログラムがあるとして、
①カーネルのデータを読み込む
②カーネルのデータを利用して別のデータを読み込む
①の処理が行われた時点でCPUの保護機能が働いてプログラムは強制終了されます。
ところが、CPUは高速化のため、①と②の処理を同時に全部行います。
⭐️何が危険なのか?
②の処理が行われる為、キャッシュのアクセス時間を計測することでカーネル内のデータが推定できてしまうそうです。
結論:内容は難しいが、悪用も難しい。そして対策すれば遅くなるのは当然。
脆弱性の内容を理解するのが難しいですが(自分も良く分かってません)、それを悪用するのはもっと難しいと思われます。
キャッシュメモリのアクセス時間を計測したり、特定のスレッドでプログラムを動かす必要があるので、これを悪意のある人物がリモートで行うのは困難と思われます。
ただし、怪しいプログラムと分かっていながら(または騙されて)、プログラムを動かしてしまったりするのは例外です。怪しいサイトにアクセスしたり、怪しいプログラムを起動するのは絶対にやめましょう。
そして、すべてCPUの高速化手法に関する脆弱性なので、これを対策してしまうと、当然遅くなります。それは対策する会社の技術力にもよるかもしれませんが、アップルは数パーセント程度遅くなる対策をすでに公開していますが、マイクロソフトはいつものようにアップデート後にPCが起動しなくなるバグを発生させたりと、メーカーの技術力の差によって遅くなる度合いも様々なようです。
結論2:Googleは独自の新しいCPUを開発している
そもそも何故Googleがこんなことを発見したのかと言えば、CPUをリバースエンジニアリングしていたからです。
ということは、アップルみたいに独自にCPUを作ろうとして、高速化処理でインテルはどうやってるんだろうなー、的なノリでインテルのCPUを調べてたってことです。
実は、今回のニュースで一番の収穫はこれだったりして。
