- 2015-07-21 17:30〜19:00
- http://iijlab-seminars.connpass.com/event/17374/
- http://www.iij-ii.co.jp/lab/seminars/
- 発表: IIJ-II 泉田大宗さん
- 3月までは産総研
- バイナリのマルウェアを研究対象にしていた
- セキュリティではない
- サンドボックスで実行してトレースをとるのが一般的。
- でも特定の条件じゃないと動かないものはパスをすべて調べられない。
- 最低限、CPU/OS/エントリポイントがわかっている状況で調べる。
- CFG: 制御フローグラフ。ノードは中はジャンプ命令なしのグラフ。
- CFGがわかる→抽象実行・モデル検査できる。機械学習もできる。
- でもCFGをつくるのがむつかしい。
- 難しさ1
- 間接ジャンプ(RET命令も含む)には値解析が必要だが、値解析にはCFGが必要。ジレンマ。
- 一般的には静的決定不能。
- 難しさ2
- CALL/RETが信用できない。
- CALLはRETで戻ってくるとはかぎらない。スタックをいじられてしまうと。
- 部分構造に切り出して問題を小さくして解くのが基本だが、それができない(どこが関数なのかわからない)。
- →スタックといった抽象化をしないで単なるメモリアクセスとして解釈する。
- 展開形制御フロー解析
- 静的解析(直接ジャンプと宛先のわかる間接ジャンプのみを追う)と動的解析(CFGを実行する。CFG静的解析できてないところかコード書き換えがあるまで)を交互に実施。
- 静的解析必要ないのでは?→動的解析で通らなかったコードについてもある程度わかるので必要。
- まず静的解析で広い範囲を調べてわからないところを動的解析する戦略。
- 動的解析にはBochsとXen(Ether)の両方をつかっている。
- Win32/Rustok.Bの解析例:
- ドロッパー: マルウェアをインストールするプログラム。
- ノード: 253、エッジ: 284を20分で解析
- 静的解析
- 直接ジャンプをたどってCFGをつくる
- 各命令を代入文に変換
- SSAに変換
- 要求駆動型定数伝搬
- Φ関数をつかう(複数のところからJMPでとびこんでくるときレジスタの値が一意に決まらないのを解決するのに)
- 定数になるまでCFGをさかのぼって展開してゆく
- 引き算が肝らしい
- Win32 APIの中身は解析しないでAPIブロックを作成。(マルウェアの解析が目的なので)
- 文字列解析
- GetProcAddress(module,procname)みたいなやつを静的解析できる
- ループは静的解析できない。
- 動的実行
- Bochs-python + Ether(Xen)
- シングルステップ実行
- ブレークポイント
- 書き込み検知
- ステルス性(マルウェアに検出されないように)
- Bochs-python
- bochsデバッガインタフェースをフックしてpythonからコントロール
- Ether
- Xen3.1ベースにイントロスペクションツール
- SYSENTERでシステムコールをトレースし
- ページフォールトでブレークポイント
- シングルステップ実行にはTFを使用
- Drakvuf/Libvmi
- Etherは古いので
- エージェントがなくてもよい
[2015-07-21 18:29]
Q: 動的解析・静的解析が無限に続いて終らない可能性は?
A: 動的解析にはタイムアウトが必要。
Q: C++のような間接ジャンプのあらしだとおもうが?
A: いちおうできている。
Q: マルウェア以外の用途は?
A: コンパイラの素性がわかっていればヒューリステックがつかえる。組込系でハンドアセンブルしたものとかBIOSとかのバッファオーバーフローの解析とか。
Q: 例外ハンドラで書き換えとか
A: 今は動的解析で対応している
Q: コードインジェクションは?
A: スレッドインジェクション(IE)は実験している。
Q: 開発言語は?
A: Pythonで。インタフェースはCで。メモリは喰うが測ってはない。マルウェアはペイロードが小さい前提がある。同じ計算を何度もしないようにキャッシュしているのでメモリが増えてゆく。
Q: 静的解析でいくつか候補を上げておいて動的解析で絞る方法にしないのは?
A: できるだけ抽象度を上げないで発散しないようにしている。
[2015-07-21 18:40]