impfuzzyとネットワーク分析を用いたマルウエアのクラスタリング ~impfuzzy for Neo4j~(2017-03-10)
impfuzzyとネットワーク分析を用いたマルウエアのクラスタリング ~impfuzzy for Neo4j~
今回は、マルウエアを分類するためにJPCERT/CCで作成したツール「impfuzzy for Neo4j」について紹介します。
impfuzzy for Neo4jの概要
impfuzzy for Neo4jは、マルウエアをクラスタリングした結果を可視化するツールです。可視化はグラフデータベースの Neo4j を使って行います。グラフデータベースとは、レコード(ノード)とレコード間の関係(リレーション)から構成されるデータ構造を扱うためのデータベースのことで、Neo4j は登録されたノードとリレーションをグラフとして可視化する機能を提供します。
本ツールは、以下の流れで動作します。
- impfuzzyを用いて各マルウエアの類似度を計算
- impfuzzyの類似度計算の結果からグラフ(ネットワーク)を作成
- 作成したグラフをネットワーク分析(クラスタリング)
- クラスタリングした結果をNeo4jデータベースに登録・可視化
まず初めに、impfuzzyというImport APIから作成したハッシュ値をもとにWindows実行ファイルの類似性を比較する手法を使って、各マルウエアの類似度を計算します。impfuzzyについては、2016年5月9日の分析センターだより「Import APIとFuzzy Hashingでマルウエアを分類する ~impfuzzy~」で紹介していますので、詳しくはそちらをご覧ください。
次に、impfuzzyの結果から類似していると判断したマルウエア間を線でつないだグラフを作成します。そして、作成したグラフをLouvain法[1]を用いて、ネットワーク分析を行います。Louvain法は、ネットワークグラフをクラスタリングする手法の1つで、他のアルゴリズムに比べて比較的高速に処理ができるという特徴があります。この分析によって各マルウエアがどのマルウエアグループに属しているのか自動的にグループ分けすることができます。
最後に、分析したマルウエアの情報と、各マルウエアがどのグループに属するのかの情報をNeo4jデータベースに登録します。
図1は、Emdiviと呼ばれるマルウエアをimpfuzzy for Neo4jを利用してクラスタリングした結果です。
このグラフでは、ツールによって類似していると判断されたマルウエア(ピンク色のノード)同士が線で結ばれています。上記のEmdiviの場合は、可視化によって類似性の高い複数の亜種グループが存在していることが分かります。
さらに、impfuzzy for Neo4jではネットワーク分析を行うことで関連する検体を自動的にクラスタリングしているため、特定のグループに属する検体のみを抽出することが可能です。図1の結果から特定の検体が属しているグループに限定して可視化した結果は、図2のようになります。マルウエア同士を結ぶ線(灰色のエッジ)に書かれている数字は、マルウエア同士の類似の度合いを、0から100(類似性が高いほど数字が大きい)で示した値です。
impfuzzy for Neo4jの入手と使用するための準備
ツールはソフトウエア開発プロジェクトのための共有ウェブサービスGitHubで公開していますので、次のWebページからダウンロードしてご利用ください。
JPCERTCC/aa-tools GitHub - impfuzzy for Neo4j
https://github.com/JPCERTCC/impfuzzy/tree/master/impfuzzy_for_Neo4j
以下では、impfuzzy for Neo4jを使用するための手順を記載します。
- Neo4j community editionの入手とインストール
以下のサイトからNeo4j community editionをダウンロードし、インストールします。
https://neo4j.com/download/ - impfuzzy_for_neo4j.pyをダウンロード
以下からダウンロードします。
https://github.com/JPCERTCC/impfuzzy/tree/master/impfuzzy_for_Neo4j - impfuzzy_for_neo4j.pyの実行に必要なソフトウエアのインストール
・Pythonモジュールpyimpfuzzyをインストール
$ pip install pyimpfuzzy
インストール方法について詳しくは、以下をご覧ください。
https://github.com/JPCERTCC/impfuzzy/tree/master/pyimpfuzzy
・Pythonモジュールpy2neo v3をインストール
$ pip install py2neo
インストール方法について詳しくは、以下をご覧ください。
http://py2neo.org/v3/#installation
・Pythonスクリプトpylouvain.pyを以下からダウンロードしてimpfuzzy_for_neo4j.pyと同一のフォルダに保存
https://github.com/patapizza/pylouvain
- Neo4jの起動
GUIまたは、コマンドラインでNeo4jを起動します。 - impfuzzy_for_neo4j.pyにNeo4jのパスワードを設定
Neo4jに設定したログインパスワードをimpfuzzy_for_neo4j.pyに設定します。(以下の{password}を変更する)
NEO4J_PASSWORD = "{password}"
impfuzzy for Neo4jの使用方法
impfuzzy for Neo4jを使用する際は、以下のオプションを使ってクラスタリングするマルウエアを指定します。
- -f - マルウエア(1ファイル)を指定する
- -d - マルウエアが保存されたフォルダを指定する
- -l - マルウエアをリスト化したCSVファイルを指定する※
※ CSVファイルの形式は、以下の通り
ファイル名, impfuzzyハッシュ値, MD5ハッシュ値, SHA1ハッシュ値, SHA256ハッシュ値
以下は、マルウエアが保存されたフォルダを指定して実行した例です。
クラスタリングした結果はNeo4jデータベースに登録されます。結果の可視化は、Neo4jのWebインターフェース上から行うことができます。Neo4jのWebインターフェースにはブラウザから以下のURLにアクセスすることで接続することができます。(以下は、ローカル環境にNeo4jをインストールした場合の例です。)
http://localhost:7474/
クラスタリング結果のグラフを表示する際は、WebインターフェースからCypherクエリー(Neo4jのデータベースを操作する命令)を実行する必要があります。図4はWebインターフェースからCypherクエリーを実行している例です。
どのようなクラスタリング結果を表示したいかによって、実行するCypherクエリーは異なります。以降では、クラスタリング結果を表示するCypherクエリーの例をいくつか示します。
[例1]全てのクラスタリング結果を表示する。(図1は以下のCypherクエリーの結果)
$ MATCH (m:Malware) RETURN m
[例2]特定のMD5ハッシュ値の検体が属するグループを表示する。(図2は以下のCypherクエリーの結果)
MATCH (m1:Malware) WHERE m1.md5 = "[MD5ハッシュ値]"
MATCH (m2:Malware) WHERE m2.cluster = m1.cluster
RETURN m2
[例3]impfuzzyの類似度が90以上の全てのクラスタリング結果を表示する。
$ MATCH (m:Malware)-[s:same]-() WHERE s.value > 90 RETURN m,s
おわりに
大量のマルウエアをすばやく分類し、分析するべき新種のマルウエアを抽出することは、マルウエア分析において必須の作業となっています。今回紹介したツールは、その作業をサポートする1つの方法になると思います。
次回は、本ツールを利用して実際にマルウエアを分類し、分析した結果について紹介します。
分析センター 朝長 秀誠
参考情報
[1] The Louvain method for community detection in large networks
http://perso.uclouvain.be/vincent.blondel/research/louvain.html