
公開された'Spectre'エクスプロイト(CVE-2017-5753およびCVE-2017-5715)の使用例
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()関数は、分岐予測器にxの有効な値を期待させるためにvictim_function()を複数回トレーニング呼び出しし、その後範囲外のxで呼び出します。条件分岐が誤予測され、その後の投機的実行により範囲外のxを使用して秘密のバイトを読み取ります。投機コードは次にarray2[array1[x] * 512]から読み取り、array1[x]の値をキャッシュ状態に漏洩させます。攻撃を完了するために、単純なflush+probeを使用してarray2のどのキャッシュラインがロードされたかを特定し、メモリ内容を明らかにします。攻撃は複数回繰り返されるため、ターゲットバイトが最初はキャッシュされていなくても、最初の反復でキャッシュに取り込まれます。
最適化されていないコードは、i7 Surface Pro 3上で約10KB/秒の読み取り速度です。
gcc -std=c99 Source.c -o spectre.out
または
make
新しい空のプロジェクトを作成し、Source.cを追加して、ビルドをクリックします。
.\spectre.out パラメータなし
.\spectre.out {address} {length} パラメータ: