今回はまず、米アドビシステムズの最新版「Adobe Reader」を狙った新たなゼロデイ攻撃についての分析結果から紹介する。米マカフィーがブログで報告している。

 同社によれば、今回の攻撃コードは米マイクロソフトの「Internet Explorer(IE)」を狙うゼロデイ攻撃とは異なり、「完全武装している」という。ASLR(アドレス空間配置のランダム化)やDEP(データ実行防止)といったセキュリティ対策機構を回避する手段を備えている。

 この攻撃で使われる悪質なPDFファイルは主に、高度に難読化されたJavaScriptコード、フラット化されたXFA(Adobe XML Forms Architecture)オブジェクト、暗号化されたバイナリーストリームの3つで構成される。

 難読化されたJavaScriptコードは、ROP(return-oriented programming)ペイロードを備えたヒープスプレーコードと、XFAオブジェクトを改ざんするためのJavaScriptから成る。また暗号化されたバイナリーストリームは、投下される2つのDLLに関連すると見られる。

 攻撃は2ステップで展開される。サンドボックス化したプロセス内での第1ステップの攻撃実行は、「AcroForm.api」モジュールで発生する。vtableポインターがヒープスプレーされた領域から読み込まれ、のちにコール命令で使用される。埋め込まれたJavaScriptコードは現行版Readerを見つけるのに使われ、すべてのROPペイロードはランタイムで構築される。

 最も重要な点は、従来ながらのシェルコードがまったく使われていないことだ。必要なシェルコード機能はすべてROPのコードレベルに実装されている。従って、ほとんどのエミュレーションベースのシェルコード検出機能には正当なモジュールのアドレス群にしか見えないため、見過ごしてしまう。

 ROPシェルコードはメモリーに埋め込まれたDDL(D.T)を復号して「AppData\Local\Temp\acrord32_sbx」フォルダーに投下し、そのD.Tを現在のプロセスに読み込む。その後、乗っ取られたスレッドは「Kernel32!Sleep」APIをコールして自身を停止する。D.Tがサンドボックス化されたプロセス内で稼働すると新たなDLL(L2P.Tなど)を投下し、別の脆弱性を突いてサンドボックスをすり抜けられる状態になる。

 第2ステップのコード実行はブローカープロセス内で発生する。コール命令のデスティネーションは攻撃者によって指定される。第2ステップのROPシェルコードが投下されたL2P.Tを読み込む。L2P.Tは上位権限のブローカープロセスで実行されるため、この時点で攻撃はReaderのサンドボックスから脱出することに成功している。

 これほど完全にサンドボックスを通過する攻撃は、「pwn2own」などのようなハッキング大会で聞いたことはあったが、ユーザー環境で見るのは初めてだとマカフィーはいう。高度に難読化されたJavaScript、ROPのみのシェルコード、マルチステージのマルウエアなど、さまざまな手段を使ってネットワークセキュリティやエンドポイントセキュリティを回避する。首尾よく検知をすり抜けると、攻撃コードは乗っ取ったプロセスから抜け出し、新たなプロセスを作成して問題のないPDFファイルを表示する。攻撃はほんの短時間に実行されるので、もとの不正PDFファイルを開いたユーザーが不審な挙動に気づくことはない。