マイライブラリ
マイライブラリ

+ マイライブラリに追加

電話

お問い合わせ履歴

電話(英語)

+7 (495) 789-45-86

Profile

ニュース一覧に戻る

コラム:新たな脆弱性Meltdownとは? その仕組みを解説

2018年2月26日

株式会社Doctor Web Pacific


新年、すべての種類のCPUに影響を与えるという新たな脆弱性に関する多くのニュースが報じられ、世間をパニックに陥れました。世界中のプログラマーは休日を返上してまで、その脆弱性を分析し、システムを保護する方法を模索していました。

脆弱性は3つ発見されました。1つ目は Meltdown(CVE-2017-5754)と呼ばれ、残りの2つは総称して Specter(CVE-2017-5753およびCVE-2017-5715) とされています。今回はシンプルに物事を考えるため、そのうちの1つ、Meltdownだけ取り上げてみます。

異なる権限を持つユーザーは当然同じコンピュータを使用できます。すべてのユーザーは、さまざまなアクセス権を持つアプリケーションを実行します。許可されていないアプリケーションが特定の情報にアクセスできないように、それらのデータは同じCPUによって処理されます。これまで、オペレーティングシステムとアプリケーションの脆弱性は、攻撃者がプライベートデータにアクセスするために特権を昇格させることが知られていましたが、これまでに発見された脆弱性はCPUには関係していませんでした。

物理メモリに直接アクセスする代わりに、アプリケーションは物理メモリにマップされた仮想アドレス空間で動作します。 異なるアプリケーションの仮想アドレスの範囲は重複しません。 MMU(Memory Management Unit) と呼ばれるハードウェアは、アドレス範囲の制御を容易にします。

これは、それぞれが必要に応じて割り当てられた独自のメモリを使用する仮想マシンに多少類似しています。ハードウェアユニットは、異なるプロセスで使用されるデータが重複しないようにします。そして、これは健全なアプローチのようですが、実は落とし穴があります。

あなたが通りを歩いているところ想像してみてください。A地点からB地点へ行くには、N歩進む必要があります。 それで、あなたは一歩ずつ歩いていきます。そして、あなたがポイントA1からポイントA2に移動した場合、あなたはA2からA3へ、A3からA4へ同様の手順を取る可能性が非常に高いと予測できます。しかし、すべての操作をワンステップで実行できるなら、瞬時にB地点に到達できます。

これが最新のCPUの仕組みです。各アプリケーションの処理には時間がかかりますが、一方で、ほとんどのプログラムのアクションは、同時にではなくシーケンスで実行されるよう意図しています。ですが、現代のプロセッサーは複数のタスクを同時に実行することができます。プログラムのコードをステップごとに処理する場合、処理に時間がかかり、一部のCPU容量が使用されなくなります。そのため、実行可能コードは同時に処理させたい部分に割り当てられます。これには、現在実行される必要があるコードと、後で処理されるコードが含まれます。 科学的には、この機能を担う技術は、投機的実行と分岐予測と呼ばれています。

次に例を示します。

これらの手法は、RAMを含む他のシステムコンポーネントがCPUよりもはるかに遅い場合、システム全体のパフォーマンスを向上させることができます。ある命令を実行するために、CPUはデータ入力を待つ必要がある場合、CPUは待機するのではなく、受信しようとしているデータに関する予測に従って命令に続くコードを実行します。

そして、これは最初の警鐘です。CPUは、将来のステップが実行されるためにプロセスがどのデータにアクセスすることができるかの手がかりがないため、プロセスがアクセスするはずの情報を含め、すべてのデータにアクセスできると想定します。もっとわかり易く説明してみましょう。プログラムが200要素のデータ配列を宣言し、要素で同様のアクションを実行するのに時間がかかります。CPUは「わかった!」と言って、あらかじめアクションを実行します。そして、実行される必要のあるプログラムコードは、配列外のデータへのアクセスを要求します(いくつかのプログラミング言語では、データの構造的境界をオーバーランすることは正当な操作と見なすことができます)。 そして、CPUは、プログラムが使用するはずのデータをしきりに要求します。

変数Xがデータ配列の外にあるだけでなく、プロセスに割り当てられた仮想アドレス範囲外にある場合はどうなると思いますか? CPUはとにかく命令を実行します。これは、プロセスがアドレスXにアクセスすることを許可されているかどうかを判断する責任を負うMMUも、そのジョブを実行する時間が必要なために発生します。そのため、投機的実行の場合、MMUは外部バスとまったく同じ方法で処理されます。つまり、MMUがコードを実行できるかどうかを返信する前に実行されます。

MMUがコードを実行できないと報告した場合、実行結果は単に破棄されます。

しかし、予測が誤っていたことが判明し、実行された命令の実際のデータ入力は予想されたものではありません。これ自体は問題にならず、単純に 実行出力が破棄され、再度命令が実行されます。プログラムが使用するはずだったデータはプロセスに渡されません。また、別のパフォーマンス最適化手法、つまりキャッシュでなければ、何もかも完全に安全です。

処理されたデータはすべてキャッシュ内で終了します。そして、キャッシュは、格納されているかなりの量の異なるデータを区別しません。データが投機的な実行出力であるか、命令が順番に実行されたか、あるいはそれが正しいかどうかにかかわらず、データが受信された方法と理由を気にすることはなく、データを受信したから格納しているだけです。

これは、不正なアドレスを使用したものであると判断した後も、キャッシュに不適切な出力が残ることを意味しています。また、攻撃者はキャッシュからデータを取得する必要があります。しかし、問題は、プログラムがキャッシュに直接アクセスできないことです。 しかし、応答時間は、CPUが事前にメモリ領域にアクセスしたかどうかを判断するのに役立ちます。応答時間が平均より短ければ、おそらくその現象が発生すると考えられます。

プログラムはデータとアドレスで動作しており、アドレスはデータの場所を指しています。以前、データにアクセスしたことがある場合には、再度検索する時間は必要ありません。

プロセスが0~9,999の範囲内のアドレスにアクセスできると仮定し、カーネルのメモリ空間が10,000~20,000の範囲内にあると仮定しましょう。私たちの場合、数字が実際の住所範囲を表すかどうかは関係ありません。そこで、ある命令が投機的実行モードで処理されるようにコードを配置します(たとえば、1回のループを1,000回繰り返し、エラーなしで999回、前回の反復を実行します)。命令では、アドレス15,000に格納されている値と一致します。

  1. 投機的実行の一部として、CPUはアドレス15,000のデータを検索します。格納された値が98であると仮定します(事前に実行された命令は、プロセスがアクセスするはずのデータではなく、0 .~9,999の範囲内のアドレスにプロセスがアクセスできることを覚えておいてください)。
  2. CPUはアドレス98(アドレス15000に位置する値)のデータを読み込みます。
  3. MMUはアドレス15,000が無効であると応答します(ユニットがデータにアクセス可能かどうかを判断する前に命令が実行されることを覚えておいてください)。
  4. CPUがパイプラインどっと流れ込み、アドレス98の値の代わりにエラーが発生します。
  5. 私たちのアプリケーションは、割り当てられたメモリ空間内の0以上のアドレスでデータの読み取りを開始し、各アドレスにアクセスするのにかかる時間を測定します。投機的実行を誘発させないよう、アドレスを順番にアクセスしません。
  6. そして、突然、他のアドレスのデータを読み取るよりも、アドレス98にアクセスする方が数倍速くなることが判明しました。

これは、誰かが最近このアドレスでデータを読み取ったことが判明したためです。そのためにデータをキャッシュしています。誰がキャッシュさせたのかと言えば、CPUです。この値98はアドレス15,000に格納されます。

これは、現代のオペレーティングシステムで物理メモリ全体がマップされているメモリのカーネル全体のメモリを読み取る方法です。

どのCPUがMeltdownの影響を受けますか?

少なくともすべてのIntel Core CPU、 Xeon、 Celeron、 Core-Series Pentium CPUが該当します。

ARM Cortex-A75チップも脆弱ではありますが、まだ消費者向けのデバイスには搭載されていません。一方、 Kryo 385とCortex-A75、 Cortex-A53を搭載したQualcomm Snapdragon 845は1ヶ月前に発表されています。Kryo 385はMeltdownに対しても脆弱である可能性が高いです。

Appleによると、iOSを実行しているすべてのデバイスが影響を受けていると発表されています。どうやらiPhoneやiPadで使用されていたCPU(たとえばiPhone 4はCortex-A8を使用しています)のすべてが含まれているわけではありませんが、現代のiPhoneやiPadのARMチップは脆弱性があるとみなされます。

Tell us what you think

To ask Doctor Web’s site administration about a news item, enter @admin at the beginning of your comment. If your question is for the author of one of the comments, put @ before their names.


Other comments