プロセッサ内のメモリ管理ユニット(MMU)によるキャッシュアクセスの記録は、テーブル階層の異なるレベル間の違いを検出するために設計された特別なパターンに従ってページが呼び出されます。 たとえば、「ラダー」パターン(左)は、32Kページを呼び出すときの階層の最初のレベル、つまりPTL1を示します。 階層の他のレベルには、検出方法もあります。
アムステルダムフリー大学(オランダ)の5人の研究者が、最新のプロセッサ上のASLRメモリ保護技術の根本的な脆弱性を証明しました。 彼らは、 ソースコードとAnC攻撃 (ASLRASCache)の詳細な説明をレイアウトしました。これは、ほぼすべてのプロセッサに影響します。
研究者は、異なるアーキテクチャの22のプロセッサでAnCをテストしましたが、サードパーティチャネルでこの種の攻撃から保護される単一のプロセッサは見つかりませんでした。 すべてのプロセッサが動的変換バッファを使用して、仮想アドレスに変換されるメモリアドレスをキャッシュするため、これは理解できます。 プロセッサキャッシュを無効にすることによってのみ、この攻撃から身を守ることができます。
アドレス空間割り当てのランダム化(ASLR)は、実行可能ファイルイメージ、ロードされたライブラリ、ヒープ、スタックなど、プロセスアドレス空間内の重要なデータ構造の場所をランダムに変更するオペレーティングシステムで使用される技術です。 このテクノロジーは、いくつかのタイプの脆弱性の操作を複雑にするために作成されました。 バッファオーバーフローによるエクスプロイトからメモリを保護する必要があると想定されています-おそらくASLRは、攻撃者がシェルコードを書き込むことができる特定のアドレスデータ構造がオーバーフロー後に見つけられることを許可しません。
過去に、研究者はASLR保護がいくつかのケースで回避できることを何度か示しました。 たとえば、攻撃者がシステムで完全な権限を持っている場合、OSのカーネルレベルでASLRを破ることができます。 しかし、ブラウザを介した攻撃に対する典型的な条件では、ASLRは非常に信頼性の高い保護と見なされていました。 いえいえ
2016年、オランダの同じ専門家グループは、サードパーティのメモリ重複排除チャネルへの攻撃を使用して、Microsoft EdgeブラウザーでJavaScript ASLR保護をバイパスする方法を示しました。 Microsoftは、ユーザーを保護するために、メモリの重複排除をすぐにオフにしました。 しかし、これは、プロセッサ内のメモリ管理デバイス(MMU)自体の動作に関連する基本レベルでのASLR問題を解決しませんでした。
最新のプロセッサでは、MMUはキャッシュ階層を使用して、メモリ内の階層ページテーブルのスループットパフォーマンスを向上させます。 これは、最新のプロセッサの不可欠な機能です。 問題の根本は、ブラウザからのJavaScriptスクリプトを含むサードパーティアプリケーションでL3キャッシュが利用できることです。
最新のIntelプロセッサのメモリの構成
ハッカーはJavaScriptを使用して、ページテーブルのどのページがMMUモジュールによって最も頻繁にアクセスされるかを判断できました。 決定の精度は、36ビットのエントロピーであってもASLRをバイパスするのに十分です。
攻撃原理
ASLR⊕Cache攻撃の原理は、MMUがページテーブルを通過した結果、プロセッサキャッシュに書き込まれるという事実に基づいています。 この操作は、仮想アドレスをメモリ内の対応する物理アドレスに変換する際にも実行されます。 したがって、各プロセッサの動的変換バッファ(TLB)は常に最新のアドレス変換を保存します。
TLBキャッシュを超えてミスが発生した場合、MMUは変換を実行するために特定のプロセス(メインメモリにも格納されている)のすべてのページテーブルを調べる必要があります。 この状況でMMUのパフォーマンスを向上させるために、ページテーブルはL3プロセッサの高速キャッシュにキャッシュされ、それらへのアクセスが高速化されます。
ASLRセキュリティメカニズムを使用すると、ページテーブル自体が機密情報の管理者になります。各レベルのページテーブルエントリの開始番号(オフセット経由)には、変換中に使用されたシークレット仮想アドレスの一部が含まれます。
MMUはページテーブルを通過して、アドレス0x644b321f4000をx86_64アーキテクチャ上の対応するメモリページに変換します
ハッカーはメモリをスキャンするための特別な手法を開発し(ブラウザよりも優れたタイマーが必要)、データポインターが逆参照されたときにページテーブルを通過した後、MMUがアクセスするキャッシュセット(セクター化ダイレクトマッピングキャッシュの特定の行)を決定しますコード命令の実行。 特定のアドレスのみが特定のキャッシュセットに対応できるため、これらのセットに関する情報を受信すると、階層の各レベルで必要なページテーブルエントリのレコードの開始番号が得られ、ASLRのランダム化が解除されます。
研究者は、22の最新のプロセッサーでChromeとFirefoxのエクスプロイトをテストし、その成功した動作を示しました。
ChromeとFirefoxの成功率と誤検知の割合
ブラウザの開発者による正確なJavaScriptタイマー
performance.now()
の意図的な破壊などの組み込みの保護メカニズムでさえ、保存されません。
ChromeとFirefoxの壊れたperformance.now()タイマー
エクスプロイト作成者は独自のタイマーを作成しました。
Firefox攻撃デモ
この攻撃は、次のプロセッサでテストされました。
プロセッサモデル | マイクロアーキテクチャ | 年 |
Intel Xeon E3-1240 v5 | スカイレイク | 2015 |
Intel Core i7-6700K | スカイレイク | 2015 |
Intel Celeron N2840 | シルバーモント | 2014 |
Intel Xeon E5-2658 v2 | アイビーブリッジEP | 2013 |
Intel Atom C2750 | シルバーモント | 2013 |
Intel Core i7-4500U | ハスウェル | 2013 |
Intel Core i7-3632QM | アイビーブリッジ | 2012 |
Intel Core i7-2620QM | サンディブリッジ | 2011 |
Intel Core i5 M480 | ウェストミア | 2010 |
Intel Core i7 920 | ネハレム | 2008年 |
AMD FX-8350 8コア | まんぐり | 2012 |
AMD FX-8320 8コア | まんぐり | 2012 |
AMD FX-8120 8コア | ブルドーザー | 2011 |
AMD Athlon II 640 X4 | K10 | 2010 |
AMD E-350 | ボブキャット | 2010 |
AMD Phenom 9550 4-コア | K10 | 2008年 |
Allwinner A64 | ARM Cortex A53 | 2016年 |
Samsung Exynos 5800 | ARM Cortex A15 | 2014 |
Samsung Exynos 5800 | ARM Cortex A7 | 2014 |
Nvidia Tegra K1 CD580M-A1 | ARM Cortex A15 | 2014 |
Nvidia Tegra K1 CD570M-A1 | ARM Cortex A15; LPAE | 2014 |
AnC攻撃は現在、4つのセキュリティ情報で文書化されています。
- CVE-2017-5925-Intelプロセッサー用。
- CVE-2017-5926-AMDプロセッサー用。
- CVE-2017-5927-ARMプロセッサ用。
- CVE-2017-5928-さまざまなブラウザーのJavaScriptテイヤー向け。
著者によると、ユーザーを保護する唯一の方法は、ブラウザでサードパーティのJavaScriptスクリプトの実行をブロックするNoScriptなどのプログラムを使用することです。