また、プログラムには、ループや条件が付きものですが、分岐するかどうかはその命令を終えて、条件が確定しないと判断できません。
そうすると、この場合も前の命令が終わるまで次の命令を開始できないことになります。特に科学技術計算では、ループを多用しますから、処理速度に大きな影響を与えます。
そこで、考え出されたのが「投機的実行」です。条件が確定する前にとにかく次の命令を実行してしまい、もし駄目だったらそれまでの結果は破棄して正しい命令にとりかかるということです。
“イチかバチか”ということで「投機的」なのですね。もちろん、失敗が続くと処理速度が遅くなってしまいますから、さまざまな手段を使って予測精度をあげる工夫がされています。「分岐予測」などもその1つです。
パイプライン処理や半導体技術の進化によって、プロセッサ内部での処理は高速化していきますが、メインメモリであるDRAMへのアクセス速度は上がっていません。そのため、メモリからのデータを待つためにプロセッサのパイプラインが止ってしまうことになります。
そこで、メインメモリよりも高速なメモリを間に配置し、データアクセスを高速化しようとするのが「キャッシュメモリ」です。
プロセッサがメインメモリからデータを読み込むとき、ひとまとまり(数十〜数百バイト)のデータがキャッシュに読み込まれます。データはまとまって置かれていることが多いため、プロセッサが次のデータを読もうとしたときに、キャッシュにデータがある可能性が高いのです。
キャッシュに目的のデータがあれば、メインメモリまで読みに行かなくても、そのデータを読み込むことができ、処理の高速化につながります。(キャッシュにもいろいろな種類がありますが、これはリードスルーキャッシュです。)
全てのメモリを高速化すればよさそうなものですが、高速なメモリはコストがかかるのです。
現代のプロセッサは、キャッシュメモリをプロセッサ内部に持っており、パイプラインと同期して動作させることができます。ここで大事なのが、当面、プロセッサが要求していないデータもキャッシュに読み込まれることと、そのデータが使われなくても特に操作をしない限りデータはキャッシュに残ることです(その後もデータの読み込みが続いてキャッシュが足りなくなれば、古いデータは上書きされていきます)。
さて、やっとMeltdownの説明ができる準備が整いました。ある不正なプログラムが、不正な命令(本来ユーザープロセスからアクセス不可能なメモリエリアからのデータ読み出し)を発行したとしましょう。
この不正な命令自身は、プロセッサが命令を実行する過程で不正なメモリアクセスであることが認識され、命令の実行はキャンセルされます。
しかし、不正な命令であることが認識されないステージでメモリアクセスが行われた場合、メモリからキャッシュへのデータ読み込みは実行されてしまいます。命令がキャンセルされても、キャッシュ上のデータは残ります。
ここで攻撃者が引き続きメモリをアクセスする命令を絶妙なタイミングで発行した場合、キャッシュに残った(本来アクセスしてはいけない)データを読み取ることが(理論的には)可能になります。
しかし、この脆弱性を悪用した実際の攻撃は現時点で確認されていません。いくつかの命令を絶妙なタイミングで実行させなければならないなど、技術的難易度は相当高いといわれていますが、ハードウェアのアーキテクチャレベルで脆弱性が見つかったこと自体が、業界に大きな衝撃を与えているわけです。
Copyright © ITmedia, Inc. All Rights Reserved.