2018/01/04

CPU の脆弱性「Meltdown」と「Spectre」

Main Board マザーボード 基盤 CPU チップ チップセット
2018 年 1 月 4 日 Marc Laliberte 著

2018 年 1 月 3 日、Google、グラーツ工科大学、および複数の教育機関のセキュリティ研究者が、最新の Intel、AMD、および ARM プロセッサに見つかった複数の脆弱性を公開しました。深刻度が高い方の脆弱性「Meltdown」(CVE-2017-5754)は、10 年前から現在までに開発された Intel プロセッサだけに存在するとみられています。もう 1 つの脆弱性「Spectre」(CVE-2017-5715 および CVE-2017-5753)は、理論的には、Intel、AMD、ARM、そしておそらくはその他のメーカーの最新プロセッサを含む、投機的実行を使用しているすべてのプロセッサに影響します。

ウォッチガード製品をご利用いただいている、これらの脆弱性の影響を先に確認しておきたいとお考えのお客様は、これらの脆弱性の概要とその仕組みの説明の前に、この件に関するウォッチガードのナレッジベースの記事(英文)をお読みください。記事の内容を簡単にまとめると、ウォッチガードの一部の製品に影響を受けるプロセッサが使用されていますが、エクスプロイトに必要な任意コード実行が許可されていないため、これらの脆弱性による実際の影響は少ないと言えます。

CPU アーキテクチャの危機

最近のオペレーティングシステムは、いくつかのセキュリティ機能を使うことで、非特権プロセスが他の非特権プロセスや特権プロセス(システムカーネルなど)のメモリを読み取ることができないようにしています。具体例として、たとえば、パスワードマネージャが使用するメモリを Web ブラウザアプリケーションが読み取ることのないようにする必要があります。オペレーティングシステムと CPU が連携して、プロセスごとに専用の仮想メモリプールを割り当て、仮想/物理メモリ間のマッピングのたびに、読み取り、書き込み、実行、ユーザアクセスといったいくつかの特権チェックを設定することで、非特権プロセスによるメモリアクセスを防止します。アクセスが禁止されているメモリマッピングに非特権プロセスがアクセスしようとすると、CPU が例外を発生させて、プロセスの実行が停止します。

最近の CPU は、「投機的実行」と呼ばれる機能も使用しますが、これは、一種のパイプライン処理であり、順次ではなく並列で複数の処理命令が実行されます。命令の実行中に問題が発生しなければ、各命令の実行の完了を待つことなく、必要に応じて CPU が結果を準備して次の命令へと進むことで、時間を節約します。ただし、命令の実行中に例外が発生した場合は、例外の後に実行される命令が破棄されます。

「Meltdown」脆弱性

「Meltdown」脆弱性の報告者たちは、Intel CPU のこの投機的実行機能を悪用することで、サイドチャネル攻撃を作成し、他のプロセスやシステムカーネルそのものが使用する任意のメモリ位置の読み取りが可能であることに気付きました。そして、CPU は、例外発生後に論理的に実行される命令(例外が発生した命令と並列で実行されていた命令)の結果を適切に破棄するものの、その場合であっても、結果がキャッシュされることを発見しました。攻撃者は、FLUSH+RELOAD などのサイドチャネル攻撃を使用することで、キャッシュされた結果を読み取ることができます。

「Meltdown」のホワイトペーパーに記載されている攻撃方法は独創的なものであり、C やおそらくは JavaScript などの高水準プログラミング言語を使用して悪用できるものです。このホワイトペーパーで紹介されている例では、攻撃者が最初に 256 x 4,096 バイト(一般的なページサイズである 4KB を想定)の「プローブ」配列を割り当てます。この配列サイズは、メモリの 1 バイトに対する異なる候補値の数である 256 と一致します。攻撃者は次に、特権付きメモリの 1 バイトを読み取って、そのメモリの値に 4,096 を乗算し、その結果を使ってプローブ配列のインデックスを作成しようとします。投機的実行であるため、メモリの読み取り、乗算、および配列インデックスの命令は、特権付きのメモリアクセスで例外が生成される前にすべて終了しているものと考えられます。結果は残っていないものの、配列インデックスが CPU によってキャッシュされています。次に、別のプロセスで FLUSH+RELOAD 攻撃を使用して、プローブ配列全体に対して繰り返します。この際に、戻り時間を比較すれば、アクセスされたインデックスを特定できます。これは、キャッシュされたインデックスであれば、キャッシュされていない配列よりもはるかに短時間で返されるためです。攻撃者は、このプロセスを繰り返すことで、約 502KB/s の速度でシステムのメモリ全体(あるいは、オペレーティングシステムによっては大部分)を読み取ることができます。

要点

要約すると、攻撃者が「Meltdown」を悪用すれば、メモリから機密情報を直接読み取ることができるということになり、これには、パスワードや暗号鍵なども含まれている可能性があります。もう 1 つの脆弱性である「Spectre」は、攻撃方法は似ているものの、オペレーティングシステムのカーネルではなく、他の非特権プロセスからのみ、メモリを読み取ることができます。また、それぞれの標的のソフトウェア環境に合わせて「Spectre」攻撃をカスタマイズする必要もあるため、エクスプロイトの成功率はさらに低いと考えられます。ただし、理論的には、「Spectre」は、Intel、AMD、ARM のほとんどの最新プロセッサを始めとする、投機的実行を使用するすべてのプロセッサに影響します。

この記事の執筆時現在、多くの主要オペレーティングシステムのベンダからのパッチの公開が始まっています。「Meltdown」対策の修正によって、Intel を搭載するシステムのパフォーマンスに 5% ~ 30% の影響が出るとされていますが、これらの深刻な脆弱性が解決された後に、さらにいくつかのアップデートが公開されて、パフォーマンスへの影響が緩和される可能性があります。お使いのコンピュータへのパッチの適用方法の詳細は、オペレーティングシステムベンダが提供するセキュリティアップデート、または「Meltdown」の FAQ を参照してください。– Marc Laliberte