アムステルダム自由大学(VU)内のセキュリティグループVUSecは、JavaScriptを用いて「アドレス空間配置のランダム化(Address Space Layout Randomization: ASLR)」を無効化する攻撃を公開した。

ASLRは、仮想アドレス空間内のアプリケーションのコードおよびデータ(exeデータやモジュールなど)の場所をランダム化してクラッキングを困難にする技術で、バッファオーバーフロー攻撃などに有効な対策として知られている。

これまで、ネイティブコードを実行できるローカルからの攻撃などにより、カーネルレベルのASLRを無効化できることが分かっていたものの、Webブラウザなどの環境では、優れた防御策であるとされてきた。

今回発見された新たな攻撃方法は、現行の多くのプロセッサが行なっているメモリ管理を利用したもので、ソフトウェアに依存せず、JavaScriptからASLRの完全な非ランダム化を実現する。VUSecは、ASLRというセキュリティ技術そのものの限界を示すものであるとしている。

最新プロセッサのメモリ管理ユニット(MMU)は、ページテーブルウォークの性能を向上させるため、プロセッサのキャッシュ階層を使用しており、効率的なコードの実行を実現するための基本的な実装となっている。

VUSecでは、このキャッシュ階層が、ブラウザで実行されているJavaScriptコードなど、信頼できないアプリケーションでも共有されている点に着目し、EVICT+TIMEキャッシュと呼ばれるサイドチャネル攻撃を構築。これは、MMUによって実行されるページテーブルウォークの間に、ページテーブルページのどの位置にアクセスされるかを検出することができるという。

例えば、x86_64アーキテクチャでは、4つのページテーブルページのそれぞれについて、MMUによってアクセスされるオフセットを検出でき、各ページ内のオフセットは9bitのエントロピーを破壊するため、36bitのエントロピーを備えた“完全なASLR”の実装でも安全ではないとしている。

VUSecは、「ASLR Cache(AnC)」と称するこの攻撃を、ネイティブコードおよびJavaScriptで実装。検証では、ネイティブ版を使用して、22種のマイクロアーキテクチャでMMUの信号観測を行ない、JavaScript版を使用して、FirefoxとChromeでコードとヒープポインタの検索を行なっている。

その結果、Intel/AMD/ARMの22個のプロセッサ全てで、MMU信号が観測されたという。

CPU アーキテクチャ 年 Intel Xeon E3-1240 v5 Skylake 2015 Intel Core i7-6700K Skylake 2015 Intel Celeron N2840 Silvermont 2014 Intel Xeon E5-2658 v2 Ivy Bridge EP 2013 Intel Atom C2750 Silvermont 2013 Intel Core i7-4500U Haswell 2013 Intel Core i7-3632QM Ivy Bridge 2012 Intel Core i7-2620QM Sandy Bridge 2011 Intel Core i5 M480 Westmere 2010 Intel Core i7 920 Nehalem 2008 AMD FX-8350 8-Core Piledriver 2012 AMD FX-8320 8-Core Piledriver 2012 AMD FX-8120 8-Core Bulldozer 2011 AMD Athlon II 640 X4 K10 2010 AMD E-350 Bobcat 2010 AMD Phenom 9550 4-Core 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

またVUSecは、AnC攻撃を実現するため、Webブラウザが設けているJavaScriptタイマーのブロック回避と、プロセッサごとに異なるページテーブルキャッシュのリバースエンジニアリングを行なっており、それらもブラウザ上の既知のキャッシュ攻撃や、Rowhammer問題(DRAMスケーリングの課題と打開策)を用いたページテーブルを操作する攻撃など、動作にキャッシュのフラッシュを必要とする攻撃に応用できるとしている。

実際にJavaScriptによるAnC攻撃では、100秒未満という現実的な時間でFirefoxで64bitエントロピーのランダマイズ無効化を達成している。

VUSecでは、ページテーブルキャッシュをリバースエンジニアリングするライブラリとして、AnCのネイティブバージョンをgithub上で公開している。

悪意ある攻撃者によるAnCを用いた攻撃を防ぐため、JavaScriptバージョンのAnCを公開する予定はないとしているが、高度な技術レベルを持つ攻撃者であれば、公開された論文を基に、数週間でAnC攻撃用のJavaScriptを再現できるとの予測を示している。

VUSecでは、AnCはハードウェアの実装を悪用しているため、ユーザーができる対策としては「NoScript」などのプラグインを使用してJavaScriptをブロックし、信頼できないJavaScriptコードが実行されるのを防ぐなどの対処を行なうしかないとしている。