Contenu connexe Similaire à 文字列曖昧検索によるマルウェアバイナリ解析 Similaire à 文字列曖昧検索によるマルウェアバイナリ解析 (20) Plus de Preferred Networks Plus de Preferred Networks (20) 文字列曖昧検索によるマルウェアバイナリ解析2. 発表者⾃自⼰己紹介
l まるまる / @marugorithm l 柏原秀蔵 / @suma90h
l 研究開発エンジニア l ソフトウェアエンジニア
l アルゴリズム l 分散システムなど
l ⽂文字列列処理理が好物 l バイナリエディタ完成してない
l 職業リバースエンジニアではない
2
3. 70,000,000
60,000,000
50,000,000
背景
40,000,000
30,000,000
20,000,000
10,000,000
0
l 新しいマルウェアは相変わらず増えている(うんざりしてくる
JUL AUG SEP OCT NOV DEC JAN FEB MAR APR MAY JUN
2011 2011 2011 2011 2011 2011 2012 2012 2012 2012 2012 2012
l それらを解析の必要性がある(最近は、ウェブ・モバイルも多い)
New Malware
10,000,000
8,000,000
6,000,000
4,000,000
2,000,000
0
Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2
2009 2009 2009 2009 2010 2010 2010 2010 2011 2011 2011 2011 2012 2012
Source: McAfee Threats Report: Second Quarter 2012
3
McAfee Threats Report: Second Quarter 2012
4. 背景:Reverse Code Engineering 技術・ツールの進化
l 解析⼿手法はそれぞれ
l 動的・静的
l ブラックボックス・ホワイトボックス
l ツール
By Ma-games.de(GNU-FDL)
l 逆アセンブラ、デバッガ、アンパッカー
l サンドボックス、命令令トレーサ
l バイナリエディタ(with ⽬目grep)
l 解析技術の進化
l 動的解析・サンドボックスの研究、OSS化は2006年年頃から多い
l リバースコードエンジニアリングに利利⽤用する逆アセンブラといっ
たツールの進化、静的解析の進化は少なく⾒見見える
l Pythonスクリプトなどによる拡張性は上昇?
4
(注:アウトサイダーの視点)
5. 背景:動的解析 vs 静的解析
l 動的解析・サンドボックス(仮想化技術の進歩と共に)
l サンドボックス・⾃自動アンパックに注⼒力力した研究・ツール
l ブラックボックス・ホワイトボックスの両⽅方のアプローチが可能
l ⽋欠点
l 実⾏行行時間が⻑⾧長い・実⾏行行してない部分は解析できない
l 静的解析
l デファクトスタンダード:IDA Pro
l 逆アセンブルし、API Callなどを⽤用いて意味を推論論する研究
l 静的解析と動的解析のハイブリッド型の研究:PolyUnpack
l ⽋欠点
l パッキング・難読化への対処が困難である
l 最終的に、解明できる範囲は⼈人間の処理理能⼒力力に依存する
5
6. モチベーション
l マルウェアに対してしかけていきたい
l 攻撃者・作者へ反撃するのは困難
l リバースコードエンジニアリングの効率率率をあげたい
l 静的解析 (RCE)に⽂文字列列検索索でアプローチしたい
l サンドボックスによる解析範囲は限られている
l 逆アセンブルしたとき、⼈人間が調べる範囲を集中させたい
l 既存マルウェア、よく知られるコードをフィルタできるとよい
l 収集済みのマルウェア活⽤用は可能だろうか?
l データベース化して解析に役⽴立立てたい
l ⽂文字列列検索索、マシンパワーに頼るのは現実的だろうか?
6
7. コンセプト:⽂文字列列検索索による解析⽀支援
l 曖昧検索索技術を使って、解析対象と⼀一致するバイナリを既存ファ
イルから探す
l ⼈人が読むべき部分を注⼒力力させたい
l デバッグシンボルと同じような情報を提供したい
マル
ウェア
OSS
既存
コード ファイル1の
関数A
ファイル2の
コードX 関数B
⼊入⼒力力 検索索ツール 出⼒力力
バイナリY 7
8. 似たツール:IDAScope
l IDAscope plugin (Hex-Rays 2012 Contest Results)
l コードブロックからシンボルなし関数を⾃自動補完
l コードブロックから暗号アルゴリズムを⾃自動補完
l IDA Proユーザは、これを使うと良良さそう
l 曖昧検索索は必要ないのでは?
l 共通点:
l ⽬目指すところは同じ:マルウェア解析を容易易にすること
l ユースケースとして似たような使い⽅方を想定している
l 今回の発表主旨
l ⽂文字列列ベースの曖昧検索索技術の能⼒力力を実験し、
現実的であるか紹介すること
8
9. 検索索アルゴリズムの⽬目的
55 8b ec 56 8b 75 08 57 8b 3d
38 10 41 00 6a 1f 56 6a 07 68
l 共通モジュール抽出の問題点 00 04 00 00 ff d7 f7 d8 1b c0
l 全く同じ物を検索索してもダメ。
c6 46 03 00 f7 d8 89 45 08 74
16 68 cc 30 41 00 56 e8 e2 b3
l 例例)アドレスが異異なる。 00 00 59 85 c0 59 74 05 6a 01
58 eb 16 6a 1f 56 6a 07 68 00
l マルウェアだと開始位置が 08 00 00 ff d7 f7 d8 1b c0 f7
わからない場合がある d8 80 66 03 00 5f 5e 5d c3
l 曖昧検索索による⽅方法 55 8b ec 56 8b 75 08 57 8b 3d
38 20 41 00 6a 1f 56 6a 07 68
l 似ている部分を探す。 00 04 00 00 ff d7 f7 d8 1b c0
l 似ている尺度度は?⼿手法は?
c6 46 03 00 f7 d8 89 45 08 74
16 68 08 41 41 00 56 e8 56 b9
00 00 59 85 c0 59 74 05 6a 01
58 eb 16 6a 1f 56 6a 07 68 00
08 00 00 ff d7 f7 d8 1b c0 f7
d8 80 66 03 00 5f 5e 5d c3
10. 編集距離離計算
l 2つの⽂文字列列間の編集距離離 d (S, R)
ACGTGATC
置換
削除
d (ACGTGATC, ACTAATC) = 3
ACTA ATC
l 挿⼊入・削除・置換をコスト1とする。
l ⽂文字列列データに対する曖昧検索索の基本テク。
l 様々なアルゴリズムが存在。
11. 編集距離離計算アルゴリズム
l 動的計画法による⽂文字列列S, R間の編集距離離計算
l ⽂文字の挿⼊入・削除・置換のコストを1とする
l (|S|+1) × (|R|+1) の表 Dを⽤用意する
s u r g e r y
0 1 2 3 4 5 6 7
s 1
u 2
r 3
v 4
e 5
y 6
12. 編集距離離計算アルゴリズム
l 動的計画法による⽂文字列列間の編集距離離計算
l 以下の計算式に従って表を埋める
if S[i] = R[ j], D[i, j] ← D[i −1, j −1],
else D[i, j] ← min(D[i −1, j], D[i, j −1], D[i −1, j −1]) +1.
s u r g e r y
0 1 2 3 4 5 6 7
s 1 0 1 2 3 4 5 6
u 2 1 0 1 2 3 4 5
r 3 2 1 0 1 2 3 4
v 4 3 2 1 1 2 3 4 d(S, R)
e 5 4 3 2 2 1 2 3
y 6 5 4 3 3 2 2 2
13. アルゴリズムの概要
l 我々のやりたいこと
l 2つの⽂文字列列間の編集距離離計算ではない
l バイナリのバイト列列の中からクエリとなるモジュールに
似ている部分のみを抜き出したい
l ⼿手法
l DNAアライメント等で使われる部分的な近似照合アルゴリズム
(Smith-Watermanアルゴリズム)を改良良したものを利利⽤用した
l 結果からモジュールの開始位置を⾒見見つけられるようなヒューリ
スティック
l 重複する検出のフィルタリング
14. ⽂文字列列アルゴリズムの概要
l 動的計画法による部分⼀一致ベースの曖昧検索索
l 1⾏行行⽬目のスコアを全て0とする
バイナリのバイト列
fd 2d 4f 3d fd 2d 53 3d
0 0 0 0 0 0 0 0 0
fd 1
(
検
索 2d 2
4f 3
3d 4
ー )
15. ⽂文字列列アルゴリズムの概要
l 動的計画法による部分⼀一致ベースの曖昧検索索
l あとは表を埋めるだけ
バイナリのバイト列
fd 2d 4f 3d fd 2d 53 3d
0 0 0 0 0 0 0 0 0
fd 1 0 1 1 1 0 1 1 1
(
検
索 2d 2 1 0 1 2 1 0 1 2
4f 3 2 1 0 1 2 1 1 2
3d 4 3 2 1 0 1 2 2 1
ー )
16. ⽂文字列列アルゴリズムの概要
l 動的計画法による部分⼀一致ベースの曖昧検索索
l ⼀一番下の⾏行行の値に着⽬目
l 予め決めておいた閾値(この例例では1とする)以下のマスに着⽬目
バイナリのバイト列
fd 2d 4f 3d fd 2d 53 3d
0 0 0 0 0 0 0 0 0
fd 1 0 1 1 1 0 1 1 1
(
検
索 2d 2 1 0 1 2 1 0 1 2
4f 3 2 1 0 1 2 1 1 2
3d 4 3 2 1 0 1 2 2 1
ー )
17. ⽂文字列列アルゴリズムの概要
l 動的計画法による部分⼀一致ベースの曖昧検索索
l そこからバックトラックを⾏行行い、類似部分の開始位置を求める
バイナリのバイト列
fd 2d 4f 3d fd 2d 53 3d
0 0 0 0 0 0 0 0 0
fd 1 0 1 1 1 0 1 1 1
(
検
索 2d 2 1 0 1 2 1 0 1 2
4f 3 2 1 0 1 2 1 1 2
3d 4 3 2 1 0 1 2 2 1
ー )
18. ⽂文字列列アルゴリズムの概要
l 動的計画法による部分⼀一致ベースの曖昧検索索
l 重複するような出現は最⼩小のスコアを選ぶようにフィルタする
l この例例では “fd 2d 4f 3d”と”fd 2d 53 3d“が抽出される
バイナリのバイト列
fd 2d 4f 3d fd 2d 53 3d
0 0 0 0 0 0 0 0 0
fd 1 0 1 1 1 0 1 1 1
(
検
索 2d 2 1 0 1 2 1 0 1 2
4f 3 2 1 0 1 2 1 1 2
3d 4 3 2 1 0 1 2 2 1
ー )
19. より⾼高速な曖昧検索索アルゴリズム
l Factor Filter [2000, JDA], Suffix Filter [2007, ALENEX]
l 索索引を利利⽤用した⾼高速な曖昧検索索アルゴリズム
l クエリの⼀一部を索索引で検索索を⾏行行い、ヒットした周辺のみを曖昧検
索索でチェック。
l 楠本アルゴリズム[2012, PFI夏のインターンの成果]
l 楠本、丸⼭山、岡野原で開発.
l 2012年年PFI夏のサマーインターンの成果。
l 移動付き編集距離離に基づく曖昧検索索の近似アルゴリズム。
l ストリームに対して省省メモリ領領域で⾼高速に検索索可能。
l 1万クエリくらいを同時に検索索可能。
19
20. プログラムの仕様
l ⼊入⼒力力 l 出⼒力力 対象バイナリパス
l ファイル /home/maruyama/data/malware/dump/
1a1f6496107b1063313aba6af99fce8e.GUnPacker.dump
l 検索索クエリ(コード) hit: id = 14
バイナリID
hit: distance = 28
編集距離
query: name = sub_401000
hit: beg_pos = 4096
開始位置からの 開始位置からの
query: beg_pos = 4096
hit: length = 266
offset
offset
query: length = 266
query: threshold = 53
モジュール長
55 8b ec 81 ec 60 02 00 00 53
モジュール長
33 db 39 1d 00 30 41 00 89 5d
許容誤差
55 8b ec 81 ec 60 02 00 00 53
f4 0f 84 e9 00 00 00 56 b8 00
33 db 39 1d 00 20 41 00 89 5d
30 41 00 57 8b 3d 08 20 41 00
f4 0f 84 e9 00 00 00 56 b8 00
89 45 e8 be 04 01 00 00 ff 30
20 41 00 57 8b 3d 08 10 41 00
8d 45 a8 50 e8 7d 04 01 00 8d
89 45 e8 be 04 01 00 00 ff 30
45 a8 50 e8 9d a5 00 00 83 c4
8d 45 a8 50 e8 e5 f7 00 00 8d
0c 8d 45 f8 50 6a 03 8d 45 a8
45 a8 50 e8 0a 9c 00 00 83 c4
検出モジュール
53 50 ff 75 08 e8 a6 ef 0a 01
0c 8d 45 f8 50 6a 03 8d 45 a8
69 8d 45 fc 89 5d f0 50 8d 85
53 50 ff 75 08 ff 15 00 10 41
クエリモジュール
a4 fe ff ff 50 8d 45 e4 50 8d
00 8d 45 fc 89 5d f0 50 8d 85
45 ec 53 50 8d 85 a0 fd ff ff
a4 fe ff ff 50 8d 45 e4 50 8d
89 75 ec 50 89 75 fc 53 ff 75
45 ec 53 50 8d 85 a0 fd ff ff
f8 ff d7 85 c0 75 5f 83 7d e4
89 75 ec 50 89 75 fc 53 ff 75 01 75 30 ff 75 0c 8d 85 a4 fe
ff ff ff 75 fc 50 e8 6c 49 00
20
21. 実験
l 実験に使ったマルウェア
l 2007年年に捕獲
l 141ファイル(全てアンパック済み)
l 総ファイルサイズ:50,515,632バイト
l 検索索クエリ例例
l “PoeBot.C”のルーチン“FlashFXP password stealer”の⼀一部分を検索索
l 実験結果例例
l 実⾏行行時間(Core i5, 16GB RAM)
l 1分41秒
l 結果例例
l 14件検出
l 完全⼀一致:8件、60バイト差で⼀一致:6件
21
22. プログラム実⾏行行の流流れ
l アンパック済みファイル集合を⽤用意する
l 1個のファイルを取り出し、IDAを使い関数を取得
l 抽出した関数をクエリとして、検索索を⾏行行う
22
24. 曖昧検索索とRCEを組み合わせた特徴
l 利利点
l 似ているバイナリデータの列列挙、⼀一致位置を検索索できる
l 逆アセンブルなしで⼀一致部分を発⾒見見できる
l 検索索クエリはコードに限定しない
l どんなバイナリでも検索索できる
l 解析時の⽋欠点
l 検索索結果から意味を解釈するには、登録するバイナリファイルに
注釈を加える必要がある
l 対象が多いほど実⾏行行時間が増加:実⾏行行時間=クエリ×検索索対象
l 曖昧検索索に関すること
l 存在しないものは検索索できない
l コードの難読化などに⾮非対応
24
25. 結論論
l 現時点では実⽤用化は厳しい、が…
l 誤差を考慮した⽂文字列列検索索
l 編集距離離ベースの検索索でも⼗十分な精度度が得られる
l バイナリなら何でも対応可能
l 今後の展望
l 索索引⽅方式を採⽤用して速度度の⾼高速化に対応
l 他のツールとの連携に対応
l パッキングは対象外とした
l 専⾨門家に任せたい
l 圧縮、暗号化、難読化したコードから元コードの復復元や、動的解
析時の意味解析に関する研究は存在している
25
26. 既存の数が多過ぎるとき、対処できるか?
l 検索索時間はどうなのか?
l 検索索クエリの⻑⾧長さ、検索索対象の数に⽐比例例する
l 索索引⽅方式の曖昧検索索を利利⽤用することで⾼高速化
l 検索索⾃自体を分割・並列列化
l 検索索ヒット結果が多すぎる事例例
l 共通モジュールを前処理理で束ねておくことで対応
l 実験例例:printf, sprintf などCPU命令令の重複は多い
l ストップワード的な扱いで対応する
26
27. 曖昧検索索の応⽤用例例
l 今回はx86逆アセンブラの拡張を想定していた
l IDA Proなどの拡張を想像してもらうのがシンプル
l 実験していないが、JavaやCLIといったバイトコードへの可能性
l サンドボックス/プログラムトレーサーとの結合
l サンドボックスでの解析時、パターンマッチの検出を組み合わせ
て利利⽤用するのが想像しやすい
l コードのパターンマッチング
l マルウェアのモジュール間類似度度計算
l ソフトウェアの検査、クローン検出の応⽤用
l コードにOSSが汚染していないか?
l 古い脆弱性の含むライブラリを利利⽤用していないか?
27