2018 年 1 月 2 日に明らかになった「Spectre」エクスプロイト (CVE-2017-5753 および CVE-2017-5715) の使用例
Spectre は、異なるアプリケーション間の分離を打ち破ります。これにより、攻撃者はベスト プラクティスに従ってエラーのないプログラムをだまして秘密を漏らすことができます。実際、上記のベスト プラクティスの安全性チェックにより、攻撃対象領域が実際に増加し、アプリケーションが Spectre の影響を受けやすくなる可能性があります。
C はライブラリを使用します。
「The Magic Words are Squeamish Ossifrage」というテキストを入れています。メモリ内にあるものをエクスプロイトを使用して読み取ろうとしています。システムが脆弱な場合は、メモリから読み取られた同じテキストが出力に表示されます。
このコードでは、 victim_function()
内のコンパイルされた命令が厳密なプログラム順序で実行された場合、array1 のサイズ = 16 であるため、関数はarray1[0..15]
からのみ読み取ります。ただし、投機的に実行されると、範囲外の読み取りが行われます。可能です。 readMemoryByte()
関数は、 victim_function()
へのトレーニング呼び出しをいくつか行って、分岐予測子が x の有効な値を期待するようにしてから、範囲外の x で呼び出します。条件付き分岐は予測を誤り、その後の投機的実行により、範囲外の x を使用して秘密のバイトが読み取られます。次に、投機的コードはarray2[array1[x] * 512]
から読み取り、 array1[x]
の値をキャッシュ状態にリークします。攻撃を完了するには、単純なフラッシュとプローブを使用して、 array2
のどのキャッシュ ラインがロードされたかを特定し、メモリの内容を明らかにします。この攻撃は数回繰り返されるため、ターゲット バイトが最初はキャッシュされていなかったとしても、最初の反復でキャッシュに取り込まれます。
最適化されていないコードの読み取り速度は、i7 Surface Pro 3 上で約 10 KB/秒です。
gcc -std=c99 Source.c -o spectre.out
またはmake
新しい空のプロジェクトを作成し、Source.c を追加して、[Build] をクリックします。
.spectre.out
パラメータなし。
.spectre.out {address} {length}
パラメータ付き: