CPU脆弱性(Spectre, Meltdown)、問題なのはむしろこれから
2018年開始早々に騒動になったCPUの脆弱性 Spectre, Meltdown。各社の対策も進んできて、もう一段落ついたと思っているかも知れないが・・・
Intel製CPUだけでなく、スマートフォン等で使用されているようなARM製CPUなど、最近のモダンなCPUであればほぼ影響を受けると言われている脆弱性のSpectre, Meltdown。CPUを高速化するための投機的実行(Speculative Execution)、アウトオブオーダー実行(Out of Order Execution)に起因すると判明しており、以下の3種類からなる。
名称 |
Variant # |
CVE |
脆弱性の原因となる動作 |
Spectre |
Variant 1 |
CVE-2017-5753 |
CPUの投機的実行により、メモリアクセス境界チェック(メモリ保護機能)を回避し、カーネルメモリ領域にアクセスすることが可能。 |
Variant 2 |
CVE-2017-5715 |
複数のcoreを持つCPUであっても分岐予測機能で使用するBTB(Branch Target Buffer)が1つである事を利用し、他方のcoreに不正な分岐アドレス先の命令を投機的実行させることでキャッシュに痕跡を残させ、カーネルメモリ領域にアクセス、または類推することが可能。 |
Meltdown |
Variant 3 |
CVE-2017-5754 |
CPUの投機的実行+アウトオブオーダー実行により、本来はアクセス権限のないカーネルメモリの内容をデータキャッシュより不正に読み込む(観測する)ことが可能。
Spectreに比べ比較的単純で、単独でプログラムを実行するだけで脆弱性を利用した攻撃が可能なため、より重大な脆弱性と考えられている。 |
既に多くのサイトで解説されており、かつ難解な内容のため、詳細についてはそちらを参照して欲しい。これらの脆弱性を突いた攻撃は難しいものの、放置するわけにもいかず、各社が対応に追われている。既に主要なOS(Windows, Linux, macOS, iOS, Android)については対策が進んでおり、大分落ち着いて来たと感じている人も多いと思う。しかし、その認識は甘いと思う。問題になるのは、これからだろう。
先ず、OSやアプリケーションの修正は基本的に「緩和策」であって、Meltdown脆弱性はOSの修正でかなり防げるものの、Spectre脆弱性に関する脆弱性を根本的に修正するためにはCPUのμコードを修正、あるいはCPU自体を脆弱性が無いCPUに交換する必要がある。後者のCPUを交換すると言うのは現実的でないので、現在あるCPUのμコードを更新するのが現実的な対応となる。ところが、Intelから提供されたμコードのアップデータ(これはBIOSやUEFIファームウェアを通じて更新される)は、最初にリリースされた物に不具合があり、不定期に再起動がかかるなどのトラブルが発生した。そのためIntelは慌てて、これを適用しないようにアナウンスした。その後、Intelからの正式版リリースは遅れに遅れ、つい最近になってようやく正式版がリリースされたばかりだ。これを受けて、ベンダー各社が機種毎にBIOSやUEFIのアップデータを提供することになる。
そして、この最新版μコードを使うと性能低下が起こる。修正方法が投機的実行したキャッシュや分岐予測した結果を定期的にフラッシュする(捨てる)、あるいは分岐予測の利用を制限すると言うのだから当然だ。そのため、外部から(例えばBIOS設定、Windowsのレジストリ設定や、Linuxではカーネルパラメタ(sysctl や debugfs)設定で)今回の修正を有効/無効化することができる仕組みが組み込まれている(ただしWindowsで無効化できるのはSpectre脆弱性の修正だけで、Meltdown脆弱性の修正は無効化できないようだ。Linuxでは全てについて無効化パラメタが用意されている)。
このような脆弱性の修正を無効化できる機能が提供されているのはサーバー用途CPU、つまりXeonだけのようで、一般向けのCPU(Intel Core i5/7/9等)には提供されていない(必ず有効になる)らしい。そのため、一般的なPCではOSの修正で対策済みとされている。一般的なPCでの性能低下は、最新のCPUでは数%程度とのことで性能低下を感じることは殆ど無く、世代の古いCPUでは数%〜10数%の性能低下で、こちらは一般的な使用でも性能低下に気付く事があるだろうとのこと。と、あまり大したことではないかのように言われている。
問題は、わざわざ修正を無効化する機能を付けたサーバー用途のCPUの方だ。実は、こちらの方は修正による性能低下の影響を大きく受ける。性能低下はOSのシステムコール呼び出し、プロセスのコンテキストスイッチ、デバイスドライバとのデータ受け渡し、入出力処理で顕著であることが分かっており、半分以下の性能にまで低下することもある。そして、これらの処理はサーバー機において多用される機能でもある。つまり、サーバーの性能は最大で50%程度にまで低下しても不思議ではないと言うことだ。
多くのサーバー機を稼働させ、クラウドサービス等を提供しているデータセンターなどでは、これは大問題となる。これまでと同等レベルのサービスを提供しようとするのであれば、サーバーの台数を2倍以上に増やして負荷分散させなければならない。それでも、CPU自体の性能が低下しているのだから、利用しているユーザーからは「以前より遅くなった」、「処理が追い付かなくて業務が回らなくなった」との苦情が来るだろう。
そこで、データセンターに対しては、サーバー群は(他の周辺機能等で)ある程度セキュリティが確保されているという前程で、先の修正無効化の機能をオンにして性能低下を抑えさせようと言うのである(*1)。Intel はセキュリティと性能のどちらを取るかの判断を利用者に丸投げしていると言える(Linus Torvaldsがブチ切れるのも当然と言えよう)。
サーバー機のハードベンダーが自社機用のBIOS、UEFIファームウェアの提供を始めるのはこれからなので、場合によっては、かなりの設備投資が必要となり、今後は性能低下が大問題となって来るだろう。
それ以外にも、Intelから修正が提供されないような古い世代のXeon、例えばワタシのMac Pro Early 2008 はXeon Harpertown なのだが、Intelからμコードの修正は提供されず(*2)放置状態になる。macOSは無理やり最新版のHigh Sierraをインストールして使っているが、世の中にはCPUもOSもEoLになったPC、サーバー機が大量に存在しているだろう。これらのマシンが、社会インフラ等の重要な箇所に使用されていない事を祈る。
(*1):因に Windows Server もデフォルトではSpectre脆弱性の修正は有効にならず、有効化するためにはレジストリを設定する必要があるとのことだ。詳しくは「Windows Server を投機的実行のサイドチャネルの脆弱性から保護するためのガイダンス」を参照。これはIntelが最初にリリースした修正に、不定期に再起動するバグが含まれていたことへの対策なのかもしれない。
サーバーのHyper-V上の仮想マシンで Windows Server を動作させている場合は、仮想マシンに対してもレジストリを設定する必要があることと、OSの再起動ではなく仮想マシンを一旦シャットダウンさせる必要がある事に注意が必要だろう。
(*2):今回 Intel がμコードパッチを提供するのは、過去5年以内(Haswell〜Skylake, Coffee Lake世代)のCPUが対象との方針らしいため。たとえIntelが提供したとしても、Appleからファームウェアアップデートとして提供される可能性は無いだろう。
|