Computer Security Symposium 201119-21 October 2011

抽象構文解析木による不正な JavaScript の特徴点抽出手法の提案
神薗 雅紀†

西田 雅太†

小島 恵美†

星澤 裕二††株式会社セキュアブレイン 先端技術研究所〒102-0083 東京都千代田区麹町 2-6-7 麹町 RK ビル 4F
E-mail: †{masaki_kamizono, masata_nishida, emi_kojima, yuji_hoshizawa}@securebrain.co.jp
あらまし 近年の不正サイトは、マルウェアなどにより自動生成されたポリモーフィックな JavaScript が利用され、他の URL に誘導する手法が多くみられる。著者らはこのような JavaScript の動的解析システムを開発したが、条件分岐やタイマー処理による遅延処理、さらにはイベント処理などにより JavaScript の全ての挙動を網羅して得ることができないという動的解析技術の課題も存在した。そこで本稿では動的解析技術を用いず、JavaScript を分析するための新たな特徴点として、抽象構文解析木を用いる手法を提案する。そして、この手法の検証として、抽象構
文解析木を用いて自動生成されたポリモーフィックな JavaScript の検知および分類を行う。

Categorizing Hostile JavaScript using Abstract Syntax Tree Analysis
Masaki KAMIZONO†

Masata NISHIDA†

Emi KOJIMA† andYuji HOSHIZAWA††Advanced Research Laboratory, Securebrain CorporationKojimachi RK Bldg,6-7 Kojimachi 2-chome,Chiyodaku, Tokyo, 102-0083 Japan
E-mail: †{masaki_kamizono, masata_nishida, emi_kojima, yuji_hoshizawa}@securebrain.co.jp
Abstract In the recent years, many hostile websites have been using polymorphic JavaScript in order to conceal its code.
The author of this article had previously proposed and developed a system based on dynamic analysis to process and detectsuch types of JavaScript. However, a challenge often encountered with that approach is the mandatory preparation of very
detail-oriented environments that may also require specific user-driven events for the hostile JavaScript to execute properly as
it was designed to. As an alternative solution, this paper will propose the use of an abstract syntax tree based on structural
analysis of polymorphic JavaScript to detect and categorize hostile JavaScript. This paper will also elaborate on test results
based on the proposed algorithm.

1. はじめに希求されている。

近年のマルウェアを配布する不正サイトは、機械的に生成され難読化が施されたポリモーフィックな JavaScript の特徴を分析

難読化が施されたポリモーフィックな JavaScript を利用し、他の U

すると、アルゴリズムにより機械的にコードが生成されているたRL に誘導する手法が多くみられる。特に、Gumblar などに代表さめ文字列の変化による難読化のパターンは異なるが、その構造自れる Web サイトにインジェクトされた JavaScript は、同じアルゴ体は変化していない。例を挙げると、unescape 関数や replace 関数

リズムで難読化され、構造は似ているが使われる文字列が異なるの引数に異なる値を設定することで、変数名をランダムにするこため、検知が難しく爆発的に被害が拡大した。とや bracket 書式を利用することなどで、難読化パターンを変更しこれらのインシデントを詳細に把握し検知するために、著者らている[3]。また、JavaScript の構造の一部だけを変更したものも存

は難読化が施された JavaScript をエミュレーションし、難読化を在する。つまり、引数の設定値や変数名を変更することで難読化解除する動的解析システム[1,2]を開発した。開発システムは擬似のパターンを変更しているが、JavaScript そのものの構造は同じで的な DOM 環境と関数フック処理を JavaScript Interpreter 上に準備ある。従って、JavaScript の特徴を抽出することができれば、機械し、JavaScript をエミュレートすることで動的解析を実現した。そ的に生成され難読化が施されたポリモーフィックな JavaScript をして、動的解析により抽出された難読化を解除した最終的な悪意効果的に検知および分析できると考えられる。のある JavaScript コードを取得し、どのような脆弱性を利用してそこで本稿では、抽象構文解析木を JavaScript の特徴点としているかを判別した。しかし、同システムは条件分岐やタイマー処扱う手法を提案する。そして、JavaScript から導出した抽象構文解理による遅延処理、イベント処理などにより JavaScript のすべて

析木がどのような特徴を表現するものであるかを検証するために、の挙動を網羅して得ることができないという動的解析技術の課題

実際に自動生成され難読化が施されたポリモーフィックな JavaScも存在した。これより、動的解析技術の向上と共に、動的解析技ript を利用して、その評価を行う。

術を利用しない不正な JavaScript の検知および分析技術の向上が- 474 -2. 機械的に機械的に生成され生成されたされたポリモーフィックな JavaScript可視化する。構文解析木の可視化には Graphviz[5]を利用した。図機械的に生成され難読化が施されたポリモーフィックな JavaSc

3に機械的に生成され難読化が施されたポリモーフィックな Java

ript の一例を図 1、図 2に示す。図 1、図 2からわかる通り、Jav

Script を、図 4に導出された構文解析木を示す。一部の Node の値

aScript の構造は同じであるが、関数オブジェクト名や関数の引数は、文字数の関係から先頭部分のみを表示している。図 4からもなどが異なっており、これらが難読化の多様なパターンとなってわかる通り、当該構文解析木には関数名や引数の値などの情報がいることがわかる。また、一部構造が異なるだけの JavaScript も含まれているため、難読化のパターンが異なれば値も異なるが、複数存在した。実際に Gumblar が猛威を振った際は、このような構造は変化しない。これゆえ、難読化のパターンに依存すること同じ構造や良く似た構造の JavaScript が多数の正規サイトにインなく検知を実現するためには、次節で述べる抽象化を行う必要がジェクトされ、難読化のパターンが異なるため検知が困難になり、ある。

被害が拡大した。

図 3 解析対象 JavaScript

図 1機械的
機械的に（pattern I））
機械的に生成されたポリモーフィック
生成されたポリモーフィックなされたポリモーフィックな JavaScript（

図 4 JavaScript の構文解析木例
構文解析木例

3.2. 抽象構文解析木の抽象構文解析木の導出
JavaScript の構造を特徴点とするために、3.1節で作成した構文解析木の抽象化を行う。抽象化処理は各 Node の値を除外することで実現する。値を除外する Node の一例を表 1に示す。Node の分類は RKelly が定義した NodeName に従う。
図 2機械的機械的に（pattern II））
機械的に生成され生成されたポリモーフィック
されたポリモーフィックなたポリモーフィックな JavaScript（

表 1 値を除外する
除外する NodeName 一覧
概要
オブジェクトが関数を利用する際の「.」
DotAccessorNode
表記の値を表す Node であり、値には関数名が入る。
「;」のみの処理が記載されていない
EmptyStatementNode
Node であり、値は「;」が入る。
関数宣言を表す Node であり、値には関FunctionDeclNode数名が入る。
数値オブジェクトを表す Node であり、NumberNode
値には数値が入る。
関数の引数を表す Node であり、オブジParameterNodeェクト名が入る。
演算子などの情報を表す Node であり、PostfixNode「++」などが入る。
正規表現を表す Node であり、値には正RegexpNode規表現のルールが入る。
ResolveNode関数を呼ぶ変数の名前を表す Node であNode Name

3. 抽象構文解析木による抽象構文解析木による JavaScript の特徴抽出手法
特徴抽出手法続いて、抽象構文解析木による JavaScript の特徴抽出手法を述べる。最初に、提案手法では JavaScript の構造を導出するため JavaScript Parser を用いて構文解析を行い、対象となる JavaScript の構文解析木を作成する。
続いて、構文解析木の抽象化処理を行い、JavaScript の特徴点となる抽象構文解析木を導出する。

3.1. JavaScript の構文解析
JavaScript の構文解析木を導出するため、提案手法では JavaScript parser である RKelly[4]を利用する。RKelly は JavaScript を parse するライブラリであり、対象の JavaScript をインプットすると、Node の属性と Node の値からなる構文解析木をオブジェクトとして作成する。
次に、RKelly を利用して導出した構文解析木のオブジェクトを- 475 -り、値には変数名が入る。
String オブジェクトを表す Node であり、StringNode
値には実際の文字列が入る。
this を表す Node であり、値には「this」ThisNodeが入る。
try/catch を表す Node であり、error オブ
TryNodeジェクト名が入る。
変数宣言を表す Node であり、値には変VarDeclNode数名が入る。
function により関数（メソッド）定義をFunctionExprNode
表す Node であり、値には「function」が入る。
特に、ParameterNode 、RegexpNode、StringNode および ResolveN
ode の値が頻繁に変更され、これらの内容が異なることで異なる難読化パターンが生成されている。
図 4の構文解析木に対して、上記の抽象化処理を施した、構文解析木を図 5に示す。

図 6 抽象構文解析木の抽象構文解析木の比較方法

5. 分析事例分析事例
本章では提案手法により導出した抽象構文析木を利用して、自動生成され難読化が施されたポリモーフィックな JavaScript を検知することができるか、その有効性を検証する。今回利用するポリモーフィックな JavaScript は、独自のクライアント型ハニーポット[6]を利用して収集したもの、および“D3M_2011 データセット” [7]を利用する。

5.1. 分析事例 1
Gumblar 系のポリモーフィックコードを提案手法により分析する。図 7、図 8に Gumblar 系ポリモーフィックコードの比較対象とする JavaScript を示す。図からもわかる通り、難読化のパターンはそれぞれ異なっていることがわかる。

図 5 抽象化した抽象化した構文解析木
した構文解析木例
構文解析木例
以上の処理により、構文解析木の各 Node の値を除外することで抽象化した構文解析木を、「抽象構文解析木」と定義する。

図 7 Gumblar 系 JavaScript（（パターンⅠパターンⅠ）

4. 抽象構文解析木を抽象構文解析木を利用した利用した JavaScript 比較処理
比較処理
機械的に生成され、難読化が施されたポリモーフィックなJavaScript を検知および分類する際は、検査対象の JavaScript の抽象構文解析木を導出し、既に不正であると判断された抽象構文解析木と比較することで実現する。これにより、難読化のパターンに依存しない JavaScript の特徴による比較を実現する。
また、比較処理は抽象構文解析木を順に探索し、Node 情報と値を比較していくのではなく、今回は簡易的な比較として抽象構文解析木の不要な情報を削除し、さらに TEXT 化した抽象構文解析木オブジェクト情報を作成する。そして、抽象構文解析木オブジェクト情報のハッシュ値（MD5）を利用して比較する。提案手法

図 8 Gumblar 系 JavaScript（（パターンⅡパターンⅡ）による比較処理の概要を図 6に示す。本手法により、高速な比較を実現する。

次に、上記 JavaScript から導出した抽象構文解析木を示す。2 つの JavaScript から導出した抽象構文解析木は一致した。図 9に一- 476 -

致した抽象構文解析木を示す。これより、アルゴリズムにより機次に、提案手法により各ポリモーフィックコードの抽象構文解

械的に生成されたポリモーフィックな難読化 JavaScript の構造を析木を導出する。2 つの JavaScript から導出した抽象構文解析木はシグネチャ化することができたと言える。このシグネチャを利用一致した。抽象構文解析木を図 12に示す。これより、5.1節と同することで、同アルゴリズムで生成された未知の JavaScript に対様、導出した抽象構文解析木をシグネチャとすれば、同じ構造のしても検知、分類が可能となる。

8080 injection ポリモーフィックコードを検知することが可能となる。

図 12 8080 injection 系 JavaScript 抽象構文解析木
抽象構文解析木
図 9 Gumblar 系 JavaScript 抽象構文解析木
抽象構文解析木

5.2. 分析事例
分析事例 25.3. 分析事例
分析事例 3

次に、8080 injection のポリモーフィックコードを提案手法によ5.2節と同様、8080 injection ポリモーフィックコードを提案手法

り分析する。図 10、図 11に 8080 injection ポリモーフィックコーにより分析する。図 13、図 14に 8080 injection ポリモーフィックドの比較対象とする JavaScript を示す。先程と同様、難読化のパコードの比較対象とする JavaScript を示す。難読化のパターンはターンはそれぞれ異なっていることがわかる。

それぞれ異なっていることがわかる。

図 10 8080 injection 系 JavaScript（（パターンⅠパターンⅠ）

図 13 8080 injection 系 JavaScript（（パターンⅠパターンⅠ）

図 11 8080 injection 系 JavaScript（（パターンⅡパターンⅡ）- 477 -

図 14 8080 injection 系 JavaScript（（パターンⅡパターンⅡ）
次に、提案手法により各ポリモーフィックコードの抽象構文解析木を導出する。2 つの JavaScript から導出した抽象構文解析木は一致した。抽象構文解析木を図 19に示す。これより、5.1節5.2節と同様、導出した抽象構文解析木をシグネチャとすれば、同じ構造の 8080 injection ポリモーフィックコードを検知することができる。

5.4. 分析事例 4
図 15図 16に示す JavaScript は、構造が異なる Gumblar 系ポリ

図 17 Gumblar 系 JavaScript I 抽象構文解析木
抽象構文解析木

モーフィックコードである。各 JavaScript の抽象構文解析木を図17、図 18に示す。抽象構文解析木で表現することで、構造が一部のみ変更されており、その他の箇所は構造が同じであることが容易に判断できる。

この部分のみ構造が異なる

図 15 Gumblar 系 JavaScript I

図 18 Gumblar 系 JavaScript II 抽象構文解析木
抽象構文解析木
以上より、JavaScript だけでは判断が困難であるが抽象構文解析木にて構造を表現することで、構造が似ている JavaScript を分類
図 16 Gumblar 系 JavaScript IIすることができた。従って、導出した抽象構文解析木をシグネチ- 478 -ャとすれば、アルゴリズムを変更され構造の一部が変更された多く存在した。そこで、先程の発展の後者である抽象構文解析木

JavaScript に対しても、検知や分類ができると言える。ただし、自のさらなる抽象化となる。例えば、本稿で提案したように構造解動的に検知や分類するという観点では、4章で述べた手法ではなく析の値のみ除外するのではなく、特定の構造も除外することで、木探索アルゴリズム等を利用して構造を比較する必要がある。

抽象構文解析木をさらに抽象化できると想定される。そして、抽6. 考察および考察および今後および今後の今後の発展るものを判定し、より汎用的に不正な JavaScript の分類や検知を象構文解析木の構造そのものも抽象化することで、構造が似てい5章の分析事例より、提案手法を用いて JavaScript の特徴点を抽実現でると考えられる。

出し、同じ構造の JavaScript を検知できることを証明した。さらまた、本稿では Node の値を除外しているが、一部の情報を残に、抽象構文解析木を利用することで、構造が似ている JavaScripすことで、検知や分類の精度向上、誤検知対策を行えると考えら

t の判定も容易に実現した。また、今回の分析調査では、各々異れる。
これらの発展課題を今度の研究課題として進めていきたい。

なる 108 パターンのポリモーフィックな JavaScript に対して、提7. おわりに案手法により抽象構文解析木を導出すると 65 パターンまで集約することができた。構造が似たものを含めるとさらに集約するこ

本稿では、JavaScript から特徴点を抽出する手法を提案し、実際とが可能である。これより、本提案は機械的に生成され難読化がに自動生成されたポリモーフィックな JavaScript に対し、分類お施されたポリモーフィックな JavaScript に対し、検知および分類よび検知という観点において提案手法が特徴点となることの有効としての特徴点を表す有効的な手法であると言える。

性を証明した。また、本稿は JavaScript から特徴点を抽出する手本提案技術の今後の発展としては、抽象構文解析木の部分マッ法の提案を主眼としているため、6章で述べた今後の発展に重きを置き、研究を進めて行くことを今後の課題とする。

チにより汎用的に JavaScript の分類や検知を実現すること、および、抽象構文解析木のさらなる抽象化である。まず前者は、不正参考文献

な JavaScript に共通する構造などがある場合は、その共通部分のみを判定することで、より汎用的に分類や検知を実現できると想[1]

神薗雅紀，西田雅太，星澤裕二，“動的解析を利用した難読化 JavaScr
ipt コード解析システムの実装と評価”，MWS2010[2]神薗雅紀，西田雅太，星澤裕二，“動的解析を利用した PDF マルウェ
ア解析システムの実装と評価”，ICSS2011[3]神薗雅紀，星澤裕二, “ウェブ改ざんはこうして起こる その攻撃手法の解説”, AVAR2009 IN KYOTO,2009[4]

Parsing Javascript Parser - RKelly
http://tenderlovemaking.com/2007/12/24/parsing-javascript-parser/
Home Graphviz - Graph Visualization Software
http://www.graphviz.org/

定される。また、本稿で分析したようなインジェクションされたJavaScript の判定だけでなく、細かいコードスニペットを抽象構文解析木として扱い、その組み合わせにより不正判定や機能分類を実現できると考えられる。例えば、インジェクトされた JavaScrip
t のヒープスプレイ攻撃部の抽象構文解析木を導出する。この導出した抽象構文解析木と解析対象とする JavaScript の抽象構文解
析木とを部分比較し、同様の構造が検出されれば、対象としている JavaScript はヒープスプレイ攻撃を行うものであると判断できる。つまり、様々な JavaScript の特徴を導出し、部分比較を行うことで、どのような処理を行う JavaScript であるか、分類や検知を実現できると想定される。ただし、ヒープスプレイ処理のみで

[5]
[6]

星澤裕二，川守田和男，太刀川剛，神薗雅紀，“自律型クライアント
ハニーポットの提案”，ICSS2009[7]畑田充弘，中津留勇，秋山満昭，“マルウェア対策のための研究用データセット ～MWS 2011Datasets～”，MWS2011

も構造が完全に一致するケースは少なく、似た構造を持つ場合が

図 19 8080 injection 系 JavaScript 抽象構文解析木
抽象構文解析木- 479 -