Tapping into the IE 7 JavaScript Interpreter」より
September 5, 2007 Posted by Moti Joseph

 JavaScriptの難読化(Obfuscation)は,さまざまな難読化技術を活用し,侵入検知システム(IDS)によるシグネチャ検出を回避しようとする悪意あるコードの作者にとっては目新しいものではない。

 以下に示すスクリーン・ショットは,あるHTMLページに組み込まれ,難読化がほどこされた悪意のあるJavaScriptコードの例だ。

難読化がほどこされたJavaScriptコード

 米マイクロソフトの「Internet Explorer(IE)7」でリアルタイムに実行される「難読化されたJavaScript」のうまい解読方法を説明しよう。JavaScript言語そのものの基本部分であるJavaScriptインタプリタを活用する方法だ。

 過去のブログ記事([1]および[2])において,「SpiderMonkey」のJavaScriptインタプリタで「document.write」を上書きするという難読化されたJavaScriptの解読方法を述べた。ただし今回はこの解読を,IE7のdocument.write処理用コードにフックをかけて実行してみる。

 この解読方法は,「どれだけ複雑に難読化されたていても,インタプリタが悪意あるコードを実行するには,最終的に難読化された部分をすべて解読しなければならない」という考えに基づいている。前述の悪意あるJavaScriptのサンプルでは,コードの実行中に難読化された部分を解読するルーチンがdocument.writeを呼び出している事を確認できた。そこで,(アセンブリ言語レベルで)document.writeメソッドをフックし,どのような結果が得られるか試してみる。

 逆アセンブラ「IDA Pro」を起動して「mshtml.dll」を開くと,プロンプトでシンボルについて尋ねられるので「Yes」を選択する。「Names」タブで「.text:775E524A 」(MSHTML Version 7.600 IE7)の「CDocument__write(int,SAFEARRAY *psa)」を表示する。

逆アセンブラで「CDocument__write(int,SAFEARRAY *psa)」を表示

 この関数「CDocument__write(int,SAFEARRAY *psa)」の引数「SAFEARRAY *psa」は,以下のようなものになる。

引数「SAFEARRAY *psa」

 PWSTR型のBufferは,HTMLページに書き込まれる解読済みの難読化されたコンテンツへのポインタである。この点を把握しておけば,難読化のレベルがどれだけ複雑になろうとも,Bufferをリアルタイムで監視し,裏に隠された悪意あるJavaScriptコードを検出することができる。


Copyrights (C) 2007 Websense, Inc. All rights reserved.
本記事の内容執筆時点のものであり,含まれている情報やリンクの正確性,完全性,妥当性について保証するものではありません。

◆この記事は,ウェブセンスの許可を得て,米国のセキュリティ・ラボの研究員が執筆するブログWebsense Security Labs Blogの記事を抜粋して日本語化したものです。オリジナルの記事は,Tapping into the IE 7 JavaScript Interpreterでお読みいただけます。