エミュレーションに基づくシェルコード検知手法の改善
Oct. 20, 2010横浜国立大学大学院 環境情報学府
藤井 孝好

吉岡 克成

四方 順司

松本 勉

マルウェア対策研究人材育成ワークショップ 2010 (MWS 2010)

はじめに（1/2）
 マルウェアによる被害の深刻化
 ネットワークを介して感染を行う方法の一つに，シェルコードによる攻撃が挙げられる

 シェルコード リモートエクスプロイト攻撃として，ターゲットのコンピュータのプロセスにおける脆弱性を突いた後に実行される機械語コード➔攻撃を防ぐため，侵入検知システム(IDS)として，通信内容を監視して検知する研究が進められてきた 一方，IDSの検知を逃れるために自己書き換えを行う
ポリモーフィックコードが出現
2

はじめに（2/2）
 近年，ポリモーフィックコードに対して，通信データを機械語とみなしてエミュレータ上で実行し，その動作の特徴により検知を行う動的検知手法が提案されている
 既存の動的検知手法はポリモーフィックコードのみを対象としており，非ポリモーフィックコードは検知できな
い．また，非ポリモーフィックコードを対象とする既存の検知手法は，コードの難読化への対応が十分でない．

ポリモーフィックコード，および（難読化された）非ポリモーフィックコードの両方を，動的検知を用いて検知する手法を提案
3

発表の流れ はじめに シェルコードの種類と実行
 難読化のない通常のシェルコード
 ポリモーフィックシェルコード
 その他の難読化によるシェルコード

 検知手法 既存の検知手法
 提案手法 評価実験
 まとめと今後の課題

4難読化されていない通常のシェルコード
 脆弱性を突いた後，制御をコード本体に移す
 ただし，直接コード先頭に制御を移すのは難しいため，まず，特定の命令列（NOPスレッド）上に制御を移す
 NOPスレッドは，その中の任意の位置に制御が移っても，コード先頭に制御を渡すことができるような命令列である
 コード本体では，レジスタやメモリの値を設定した後，割り込み命令・ライブラリ呼び出し（システムコール）を実行する
システムコール
NOPスレッド

シェルコード制御の流れ

5

ポリモーフィックコード
 制御を奪取した後，実行されているコードの位置をGetPCコードにより取得し，復号位置を求める
 次に，暗号化されたコード本体を自己復号（書き換え）する
 その後，復号されたコードを実行する

自己書き換えGetPCコードNOPスレッド

復号ルーチン

暗号化されたシェルコード本体

制御の流れ
復号された
シェルコード本体

6

その他の難読化手法
 メタモーフィズム

xor eax， eax

 命令の種類や実行順を変更する
 コードの外見を多様化できる

mov eax,
 間接ジャンプ

0x0

EAXレジスタを0に初期化

 ジャンプ先のアドレスを直接指定せずに，レジスタやメモリの値を用いる
 ジャンプ先のアドレスが直接見えないようになる
EAXレジスタjmp 0x100
直接ジャンプ

jmp eax

0x100

間接ジャンプ

7既存のシェルコード検知手法
 シグネチャ検知
 通信内容が，特定のバイトパターンに一致するかを調べる➔ ポリモーフィックコードなど，コードの外見を多様化できる手法に対応が困難

 静的検知（逆アセンブル・制御フロー解析）
 通信内容を機械語とみなして逆アセンブル・制御フローグラフを生成して解析する➔ ポリモーフィックコードなどの自己書き換えや逆アセンブルを妨害する手法への対応が不十分

 動的検知（エミュレーション）
 通信内容を機械語とみなしてCPUエミュレータで模擬実行を行い解析する 既存研究では，ポリモーフィックコードに対して，自己書き換え処理の挙動に着目して検知を行う方法が提案

8

問題点と提案手法での対策
 問題点
 難読化された非ポリモーフィックコードの対応が不十分 シグネチャ・静的検知では，様々な難読化に対応しきれない➔ エミュレーションに基づく検知（動的検知）を考える

シェルコード難読化されたシェルコード
メタモーフィズム

間接ジャンプポリモーフィックコード

提案手法で検知9

提案：ポリモーフィック・非ポリモーフィックコードを検出可能な動的検知手法（1/5）
 着目点
 ポリモーフィック・非ポリモーフィックコードそれぞれに，難読化の施されない命令（平文命令）が存在する➔ 検査対象のデータを静的に走査することで平文命令を検出できる
 さらにその周辺を動的に検査するシステムコール
NOPスレッド

NOPスレッド

シェルコード復号ルーチン

暗号化されたシェルコード本体

GetPCコード10

提案：ポリモーフィック・非ポリモーフィックコードを検出可能な動的検知手法（2/5）
 検知の流れ 各TCPストリーム・UDPパケットを検査対象として，以下の処理を行う①• 静的検査（平文命令の検出）②• エミュレーション開始位置の決定③• 動的検査（シェルコードにおける挙動の検出)②①
NOPスレッド③

シェルコード

静的検査

動的検査

11

提案：ポリモーフィック・非ポリモーフィックコードを検出可能な動的検知手法（3/5）①• 検査対象を1バイトずつ順に検査し，平文命令の有無をチェック• 平文命令が検出されたら，②エミュレーション開始位置の決定へ• 検出する平文命令の種類• GetPCコード（ポリモーフィックコード）• call,fnstenv等• システムコール（非ポリモーフィックコード）• int,call等

12提案：ポリモーフィック・非ポリモーフィックコードを検出可能な動的検知手法（4/5）• 平文命令の検出位置から，オフセットを用いて開始位置を決定②• 特に，開始位置がNOPスレッド内にあるようにする• 開始位置を決定したら，③動的検査へ• 実験で用いたオフセットは，-512~512 byteの24種類の定数値13

提案：ポリモーフィック・非ポリモーフィックコードを検出可能な動的検知手法（5/5）• エミュレーションを行い，共通規則，およびポリモーフィック③

コード検知規則または非ポリモーフィックコード検知規則を満たしたらシェルコードとして検知する
ポリモーフィックコード検知規則

共通規則

自己書き換えの実行が行われたこと

エミュレーションが検出された平文命令まで続くこと

非ポリモーフィックコード検知規則
システムコールの実行時に，割り込み番号や呼び出しアドレスが適切であること

14

評価実験の流れ（1/2）
1.脆弱性検証ツールを用いた検知実験
 実際にシェルコードを検知できるか
 脆弱性検証ツール[1]を用いて，309個のシェルコードを生成 非ポリモーフィック9個+ポリモーフィック300個
 攻撃の種類，暗号化の種類を変えて生成

2.擬似乱数ストリームに対する検知実験
 シェルコードが含まれないデータに対して，どの程度フォールスポジティブ（誤検知）があるか 1ストリームのサイズを8KBとし，計2.3GBの擬似ストリーム（計294400個）を生成[1] “The Metasploit Project,” http://www.metasploit.com/.

15

評価実験の流れ（2/2）
3. 実際のトラフィックに対する検知実験
 実際の通信データではどのように検知されるか

以下の通信データを使用
 大学で稼働中のWebサーバの通信データ
 CCC DATAset2010[2]（ハニーポットによる攻撃通信データ）
Webサーバへの通信データ
ストリーム・パケットサイズ合計
TCP(HTTP)ストリーム数
CCC DATAset2010の攻撃通信データ
pcapファイルサイズ合計
ストリーム・パケットサイズ合計
TCPストリーム数

UDPパケット数

69[MB]
2288[個]
約3.4[GB]
162[MB]
15910[個]272814[個][2] 畑田充弘, 中津留勇, 秋山満昭, 三輪信, “マルウェア対策のための研究用データセット～MWS2010Datasets～,” MWS2010, 2010.

16実験結果（1/4）
1. 脆弱性検証ツールを用いた検知実験
 すべてのシェルコード309個を検知

2. 擬似乱数ストリームに対する検知実験
 シェルコードとして誤検知された回数は合計9回（294400個のストリーム中）ポリモーフィックコード
非ポリモーフィックコード

1個8個

 偶然 機械語列として解釈されたために発生

17実験結果（2/4）
3. 実際のトラフィックに対する検知実験

Webサーバのデータからは検知なし
攻撃通信データでは，計608個が検知された
 いずれも手動により，実際のシェルコードであることを確認 ポリモーフィックかどうかの内訳
ポリモーフィックコード

589 個

非ポリモーフィックコード

19 個

18

実験結果（3/4）
 観察された非ポリモーフィックコードには，スタック内のデータを参照した間接ジャンプが使用➔ 本提案手法で検知が有効に働く
スタック
0495
0493
0500
0501
0522
0523
0528
049a049bcall 0xfffffffe①
jmp 0x6d
pop esi②
push byte 0x30:
push edi
push dword 0xe88a49ea
call esi③push ebx
push ebp:①
値をプッシュ

ESIレジスタ0x49a②0x49a③

ポップ(間接)ジャンプ

19

実験結果（4/4）
 宛先ポート別に対するシェルコード数
 UDPパケットからは検知されず
 135, 445番ポートに攻撃が集中

 ポリモーフィック・非ポリモーフィックによって，宛先ポートの種類に違いが生じている

20

まとめと今後の課題
 まとめ ポリモーフィック・非ポリモーフィックのどちらのシェルコードも検知可能な提案手法を示した
 実験によって，以下のことを示した
 脆弱性検知ツールにより生成したシェルコードを検知 フォールスポジティブ（誤検知）は9回/294400ストリーム
 攻撃通信データから，実際のシェルコードを検知 今後の課題 検体を増やしたうえで，フォールスネガティブ（攻撃の見逃し率）の評価
 ほかの検知手法に対して，検知精度および動作速度の比較および改善

21

ご清聴ありがとうございました