セキュリティ・キャンプ全国大会2014 発表資料 #seccamp #spcamp
チュータープレゼン:マルウェア解析におけるセマンティックギャップ2014/08/13セキュリティ・キャンプ全国大会2014@ntddk
View Slide
whoami● @ntddk– #include ● 慶應義塾大学 SFC 村井研/武田研 B2– マルウェアの研究● ゲヒルンという会社で働き始めました– スマートフォンアプリの脆弱性診断とか
whoami● #spcamp '11ソフトウェアセキュリティクラス 参加● #seccamp '13セキュアなシステムをつくろうクラスシステムソフトウェアゼミ チューター● #seccamp '14ソフトウェアセキュリティクラス チューター
whoami● EpsilonDelta– メンバーを募集しているっぽいです– 明後日のCTFでみなさんの力を見せてください
話すこと● セマンティックギャップについて紹介します– アセンブリ言語とプログラミング言語とのギャップ– 仮想マシンモニタとゲストOSとのギャップ– コンピュータと人間の認知とのギャップ
セマンティックギャップとは● Semantic Gap(語義の隔たり)● ソースコードとアセンブラと機械語● この違いがあるため、逆コンパイルは難しい
アセンブリ言語とプログラミング言語とのギャップ
難読化されたマルウェア● マルウェア開発者は解析に時間をかけさせたい– コンパイラによる最適化と反対のことをする00874389 /EB 05 JMP SHORT sample.008743900087438B |43 INC EBX0087438C |41 INC ECX0087438D |42 INC EDX0087438E |EB 07 JMP SHORT sample.0087439700874390 \B8 07000000 MOV EAX,700874395 ^ EB F4 JMP SHORT sample.0087438B00874397 C3 RET003B0000 B8 07000000 MOV EAX,7003B0005 43 INC EBX003B0006 41 INC ECX003B0007 42 INC EDX003B0008 C3 RET
LLVM● 最適化を頑張ってくれるコンパイラ基盤● ソースコードを読み込んで独自の中間コードに変換(フロントエンド)● 最適化した上で(ミドルエンド)● コンパイルやJIT、任意の言語のソースコードに変換(バックエンド)
LLVM● 最適化を頑張ってくれるコンパイラ基盤● 逆アセンブルコードを読み込んで独自の中間コードに変換● 最適化することで難読化を除去できないか?● アセンブリ言語とLLVMの中間コードとのギャップが問題となってくる
LLVM● 逆アセンブルコードを中間コードに変換し、さらにC++などのソースコードに変換することによって、逆コンパイルを実現できないか?– C++をC++11に変換するC++11 MigratorやC++をJavaScriptに変換するEmscriptenなど参考例がある– ただし標準関数のみサポート● プログラミング言語とLLVMの中間コードとのギャップが問題となってくる
LLVMの中間コード● 変換してもこんなんばっか● SSA形式なので無限にレジスタが増えるllvm_cbe_bb12_2e_i:llvm_cbe_tmp__64 = ((unsigned int )(((unsigned int )llvm_cbe_j_2e_018_2e_i) +((unsigned int )1u)));if ((llvm_cbe_tmp__64 == 64u)) {goto llvm_cbe_test_all_2e_exit;} else {llvm_cbe_j_2e_018_2e_i__PHI_TEMPORARY = llvm_cbe_tmp__64; /* forPHI node */goto llvm_cbe_bb7_2e_i;}
● みたいな試みがあります● ぶっちゃけHex-Rays Decompilerのほうがよっぽどマシ
仮想マシンモニタとゲストOSとのギャップ
VMI● VM Introspectionという分野– 仮想マシンモニタからゲストOSのメモリやデバイスを監視する手法– マルウェアを自動で解析するのにも使えそう– 最近はクラウドコンピューティングサービスにおいてマルウェアを検出するという方向性ばかり● VMIにもセマンティックギャップの問題がある
VMIのセマンティックギャップ● VMの内側と外側で取得できる情報が異なる– 解析したいプロセスを特定できない– カーネル内のシンボル情報を読み取れない● これを解決する研究がなされてきた
マルウェアの高度化● ルートキット– カーネルのデータ構造を改竄し、悪意のシステムコールへ実行をリダイレクトしたり、ファイルやメモリを隠蔽したりする● コードインジェクション– 他プロセスのメモリに自身をロードして実行状態を移す
既存研究TTAnalyze: A Tool for Analyzing Malware[EICAR06]– ゲストOSに挿入したmoduleから解析対象を識別することでセマンティックギャップを解決ゲストOSのユーザーモードゲストOSのカーネルモード仮想マシンモニタホストOSVM Introspectionがゲストに影響を与える仮想マシンモニタが検出されてしまう
既存研究Ether: Malware Analysis via Hardware VirtualizationExtensions[ACM08]– 事前にOSを解析することでセマンティックギャップを解決したが、ルートキットなどに対処できないゲストOSのユーザーモードゲストOSのカーネルモード仮想マシンモニタホストOSVM Introspectionがゲストに影響を与えない仮想マシンモニタが検出されない
解析対象の識別方法● VMの外部からはプロセスの情報をそのまま取得できないので、– コンテキストスイッチによって変化するCR3レジスタの値を監視– 予めOSを解析してPIDやTIDが保存されている箇所を特定 – 予めOSが用いるデータ構造体のシグネチャを作成– etc...
既存手法の問題点● そもそもPaaSでのマルウェア検出のみを目的としたVMIが多い● ゲストOSを書き換えてしまうと、仮想マシンモニタがマルウェアに検出されてしまう● セマンティックギャップを解消した上、さらにセマンティックス情報を追跡しなければ、コードインジェクションやルートキットに対処できない
提案手法● オフレコ
● みたいな研究をしています
コンピュータと人間の認知とのギャップ
マルウェアを理解するには● いくら自動でマルウェアを解析したところで、その動作を理解できなければ意味がない● どうすればマルウェアを直感的に理解することができるか?● 人間が理解できる内容とコンピュータが理解できる内容のギャップ
マルウェアの可視化● 直感的にマルウェアの構造を把握する手段● 命令ポインタのログをgraphvizに投げてみた– さっきのはWindowsのメモ帳
マルウェアの可視化● 何をもとに可視化するか– 命令ポインタ– API– ファイル– ネットワークアクセス
マルウェアの可視化● IDA ProのGraph Viewだって可視化– コードブロックと条件分岐
マルウェアの可視化● VERAhttp://1.bp.blogspot.com/-OHhtZ567BBs/Tzt9paOnhkI/AAAAAAAAK6Y/wA5CBLGUUnQ/s1600/NotePADUnpacked.png
マルウェアの可視化● どのようなコードがどのように可視化されるか覚えなければならない– 新しいセマンティックギャップが生まれてしまう● 結局のところ解析者の負担は変わらない?● 可視化によって得られるメリットは何か?
マルウェアの可視化● どのようなコードがどのように可視化されるか覚えなければならない– 新しいセマンティックギャップが生まれてしまう● 結局のところ解析者の負担は変わらない?– 人間が理解しやすい可視化の方式とは● 可視化によって得られるメリットは何か?– マルウェア亜種の分類など
情報セキュリティにおける可視化● マルウェアに限った話ではない● ネットワークの可視化– NICTER– DAEDALUS– NIRVANA改http://www.nict.go.jp/info/topics/2014/02/img/seccon2013-1.png
● みたいな試みがあります
おわりに● セマンティックギャップという視点から、マルウェア解析における3つのトピックについて紹介しました● マルウェア解析を主に扱っているのはソフトウェアセキュリティクラスだが、クラスに縛られることはない