もう1つの脅威 - Meltdown

もう1つの新たに発見された攻撃にはMeltdownという名前が付いている。Meltdownも投機実行の隙を突く攻撃であるが、Spectreが条件分岐の予測ミスで発生する投機実行を利用するのに対して、MeltdownはException(例外)を発生させる命令を実行することで発生する投機実行を利用する。

元々のExceptionはメモリのパリティエラーなどのハードウェアの異常の通知やDivide by Zeroのような例外的な事象の発生を通知するものであったが、現在では、使用するメモリの新たな割り当てなど、ユーザプログラムからOSにサービスを依頼するためにも使われており、ユーザプログラムからExceptionを起こすことができるようになっている。

そして、Exceptionが起こると、プログラムの実行を中断して、例外事項の処理を行うExceptionハンドラを実行する。しかし、現在の高性能プロセサでは、投機実行によって、Exceptionを起こす命令の先にある命令もある程度、投機的に実行されてしまう。

この投機的に実行される命令で配列の範囲外のメモリの内容を読み出し、キャッシュを経由するFLUSH+RELOADの抜け道を使って本来はアクセスできない情報を盗み出すことができる。

この点はSpectreの範囲チェックのすり抜けと同じであるが、大きく異なるのは、Exceptionが発生し、OSの実行特権を持った状態で投機実行が行われる点である。このため、アクセスに使われるのは攻撃を受けたプログラムのユーザ状態で使えるページ一覧表ではなく、OSのページ一覧表になるという点である。

そして、現在の多くのOSでは、次の図のように、OSが使うメモリがそれぞれのプログラムが使うメモリを包含しているという構造になっており、特権状態ではすべてのメモリがアクセスできる状態になってしまう。こうなると、攻撃プログラムはどこにある情報でも盗めることになり、危険度は大きい。

  • 多くのOSでは、特権状態ではOSの仕事に使うメモリだけでなく、すべてのアプリケーションのメモリもアクセスできるようになっている

    多くのOSでは、特権状態ではOSの仕事に使うメモリだけでなく、すべてのアプリケーションのメモリもアクセスできるようになっている

これに対してOSのページテーブルを分離する「Kernel Page Table Isolation(KPTI)」というパッチがある。KPTIパッチを適用すると、使用できるページの一覧表は次のようになる。

  • 黄色のメモリページは特権状態だけで使用できる

    黄色のメモリページは特権状態だけで使用できる。OS走行時には全メモリページが使用できるが、A社の仕事をする場合は、A社の仕事のページだけが使用可能となる。そして、特権状態になってもOSの必要なページが使えるようになるだけ

このような構造にしておくと、OSの実行時にはすべてのメモリページが使えるが、例えばA社の仕事を処理する時にはそのアプリケーションのページのアクセスだけに制限される。Exceptionが発生した場合は特権状態に切り替わってOS領域にあるExceptionハンドラを実行するが、 OS領域の全ページが使えるのではなく、Exceptionハンドラなどの実行に必要な最小限のページだけが使用できる設定になっている。このため、KPTIを適用すると、Meltdownで特権状態に移行して範囲外のメモリを読もうとしても、読めるのは自分の仕事に使うメモリページと黄色で塗ったOSの一部のページのデータだけである。

この一部のページには、読まれて困るような情報を入れないようにすれば、Meltdownで攻撃されても被害を受けないことになる。

しかし、KPTIの使用には性能低下というデメリットがある。ユーザのアプリケーションを実行している状態では、特権状態になっても大部分のOSページは使えない状態となっている。この状態でシステムコールを発行して、OSの中のサービスを使おうとすると、サービスを行うバイナリは使用可能なページには入っていないので、ページフォールトが発生し、キャッシュミスをした場合のメモリアクセスと同じ程度のオーバヘッドが発生する。

人間が操作するスマホやPCの場合は、システムコールの頻度は低いので、このオーバヘッドによる性能低下は僅かで気が付かない程度であるが、サーバの場合は30%程度の性能低下が発生する場合があると報告されている。30%の性能低下があると、データセンタでは同じ性能を確保するためにはサーバ台数を1.4倍に増やすことが必要になり、それに伴いデータセンタの床面積も1.4倍、消費電力も1.4倍になってしまうので、大きなインパクトがある。

IntelのCPUとArmのCortex-A75などはMeltdownの攻撃を受けるが、AMDのEPYCは、Exceptionが発生した時には、その先の命令を投機的に実行しないマイクロアーキテクチャになっており、Meltdownの攻撃は効かない。また、ArmもMeltdownの影響を受けるのは投機実行を強化したA75だけで、その他のArmコアは影響を受けない。

中国のBaiduやMicrosoftのAzureなどでEPYCサーバを導入するデータセンタが出てきているが、Meltdown対策による性能低下がないEPYCサーバの導入が進むのではないかと思われる。

なお、パーソナルなシステムでもデータセンタのサーバでも、攻撃プログラムが侵入しなければ問題は生じない。しがたって、不審なメールなどを開かないという注意が重要である。また、サーバが、例えば画像認識だけのような特定用途だけの処理に使われ、攻撃プログラムが侵入することはないという環境であれば、KPTIパッチを適用する必要はない。