CPUの高速化機能の間隙を突いた脆弱性「Meltdown/Spectre」。命令を先読みして実行する投機的実行機能を悪用する手法で、米インテル(Intel)や英Armといった主要なCPUが影響を受ける。PCでは問題の公表に前後して対策が進み、PCメーカーやOSベンダーが緩和策を施し始めた。気になるのは人気のIoTデバイス、Raspberry Pi(ラズパイ)や中国DFRobotの「LattePanda」といったPCボード製品の動向だ。

 2018年初頭に浮上したCPUの脆弱性は、本来であればアクセス権限の無い領域のメモリーを読み込めるというもの。通常、権限の無い領域を読み込む命令をCPUに発行すると、エラー(例外)が発生する。ところがMeltdownは「アウトオブオーダー実行」機能を、Spectreは「分岐予測」機能をそれぞれ悪用することで、このチェックをすり抜ける。いずれも現在のCPUの高速化手法として一般的な機能であるため、脆弱性の回避策が性能低下につながる。普通のパソコンに比べれば非力なラズパイやLattePandaにとっては致命傷になりかねない。

CPUの何が問題だったのか

 ラズパイはCPUがArmコアで公式OSはLinux、LattePandaはCPUがAtom Zコアで公式OSはWindowsと、両者はCPUとOSに違いがある。Meltdown/Spectreの影響と対策もそれぞれ異なるのだが、話の前提としてMeltdown/Spectre脆弱性をおさらいしておこう。

 Meltdownが悪用するアウトオブオーダー実行とは、実行中の命令とは別に、CPU内部で先読みした命令を先行して実行する機能だ。同機能はプログラムからは検知できないCPU内で、空いている演算器をなるべくフル稼働させるために内部的に処理を進めていく。Meltdown攻撃では、このアウトオブオーダー実行を見越して仮想メモリーにおける「カーネル空間」のデータを1バイト読み出して「ある処理」の対象とする命令を記述しておく。OSやデバイスドライバが利用するカーネル空間はCPUの特権モードによって保護されているが、攻撃者はユーザー空間のプログラムからMeltdown攻撃を成立させられる。

 「ある処理」というのは、読み出したカーネルメモリーのデータを、ユーザー空間のアドレスとして使う何らかの処理だ。読み取ったデータが「0x1A」だったとすると、これをデータとしてではなく攻撃コード内でアドレスとして扱う処理を実行させる。なぜこんなことをするのかというと、アウトオブオーダー実行によって指定したユーザー空間のアドレスにあるデータがキャッシュメモリーに残るからだ。攻撃者にとってユーザー空間のデータはどうでもよく、どのアドレスがキャッシュされたかを調べるのが狙い。キャッシュに乗ったアドレスこそが、カーネルメモリーのデータということになる。

 どのアドレスがキャッシュに乗ったのかは、ユーザー空間のアクセス速度をスキャンする別のプログラムによって判別する。メインメモリーに比べるとキャッシュメモリーへのアクセス速度はケタ違いに速いため、読み出し速度を測りながらアドレス空間をスキャンすればキャッシュに乗ったアドレスが分かってしまう。一連の攻撃は、OSから見れば例外が発生して読み込みに失敗するのだが、Meltdownの影響を受けるCPUではアウトオブオーダー実行によってキャッシュへのロードまで内部的には実行が済んでしまう。