ニュース

既存のx86/ARM CPUほぼ全てに通用するJavaScript攻撃が発見される

~アドレス空間配置のランダム化を突破

AnC攻撃イメージ

 アムステルダム自由大学(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 v5Skylake2015
Intel Core i7-6700KSkylake2015
Intel Celeron N2840Silvermont2014
Intel Xeon E5-2658 v2Ivy Bridge EP2013
Intel Atom C2750Silvermont2013
Intel Core i7-4500UHaswell2013
Intel Core i7-3632QMIvy Bridge2012
Intel Core i7-2620QMSandy Bridge2011
Intel Core i5 M480Westmere2010
Intel Core i7 920Nehalem2008
AMD FX-8350 8-CorePiledriver2012
AMD FX-8320 8-CorePiledriver2012
AMD FX-8120 8-CoreBulldozer2011
AMD Athlon II 640 X4K102010
AMD E-350Bobcat2010
AMD Phenom 9550 4-CoreK102008
Allwinner A64ARM Cortex A532016
Samsung Exynos 5800ARM Cortex A152014
Samsung Exynos 5800ARM Cortex A72014
Nvidia Tegra K1 CD580M-A1ARM Cortex A152014
Nvidia Tegra K1 CD570M-A1ARM Cortex A15; LPAE2014

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

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

AnCによるブラウザ内のデータポインタのエントロピー減少にかかった時間を示した図
FirefoxでのAnC攻撃によるASLR無効化
より高速なランダマイズ無効化

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

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

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