Garbage Script on Goo BLOG

某SIerの"元"研究者 兼 情報Security技術者"F.Koryu"の日常の雑記置き場

(matcha445)まっちゃ445勉強会#18

2011-10-22 12:48:52 | セキュリティ(技術者向け)
第18回まっちゃ445勉強会 - まっちゃ445
今回は横浜にある情報セキュリティ大学院大学が会場です。
-----
Session1:「マルウェア解析王に、俺はなる!」(ラックホールディングス株式会社/サイバーセキュリティ研究所/新井悠さん)
そんなものはない(ヲ
タイトル→標的型マルウェアを高速に解析するために必要なたった一つの事

文書型マルウェアの解析法
1.OfficeやAdobe Readerを準備
2.動的解析ツールを準備
3.文書ファイルを開封
4.動的解析結果をレビュー

課題1:OSやアプリのバージョンに強く依存する
まともに動かない場合もあるし、どの環境に対して脅威なのかを特定するのには非常に時間かかる
バージョン、パッチの適用状況、言語によって動く、動かないは大きく変わる
なので様々な環境をセットしたVMを沢山用意する必要がある(コストに影響)

課題2:そもそも解析に時間がかかる
詳細に解析するばするほど時間がかかるし、中には対解析機能を有している場合は、それを回避する必要がある
でいざ解析を始めても、静的解析にかかる時間(アセンブリコードを読む時間)はとにかく時間がかかる

解析で得られる情報量、時間などのコストはこの逆です
表層解析<動的解析<静的解析

表層解析は「あたり」を付ける作業、なのでコードはこの時点では読まない
動的解析は、実際に動かして様子を探る作業、この時点もコードは読まない
解析時間は短くて済むが、発病要件を満たさなければ空振りに終わる可能性も……
静的解析は、いわゆるリバースエンジニアリング作業、ツールを用いて逆アセンブルしてコードを読む作業になる

効率性は……
表層解析>動的解析>>>(超えられない壁)>>>静的解析

標的型マルウェアを解析する目的
対策は何か?、痕跡はどこにあるか?、通信で感染端末を特定する方法はあるか?
これらを短時間で効率的に実現できればベスト

一般的に、文書型のマルウェアは「スクリプト」「マルウェア本体」「代替文書」の3つのコンポーネントによって構成されている。
まずはトリガであるスクリプトを解析する事で、速やかに解析できるようになる(解析にはツールを用いる)

REMnux→マルウェア解析用Ubuntuイメージ、イメージさえ使えばすぐに使える便利なツール、最近ver2.0にアップデートしました

jsunpack→フリーの難読化JavaScript解析ツール、入力してPDFも受け付ける便利なものです。コマンドライン版で脆弱性の特定ができ、前述のREMnumxにも収録されています

OfficeMalscanner→MS-Office文書専用のツールで、シェルコードの有無をチェックして検体として取り出してくれるツールです

最近は検知回避するために、前述の3つのコンポーネントに対して、検知回避用のXOR、ROL/RORによる符号化がされている場合があります(いわゆる難読化)
xorsearch→これらの難読化に対するブルートフォースを行うツールです(これもREMnuxに収録)、引数として与えられた特定の文字列と一致する複合結果が得られるのであれば、結果を出力します

「Zero Wire Tryouts」という動的解析ツール(VMイメージで提供されている)がある(exeのみ対応)ので、それを活用するのもアリ

(まとめ)
・標的型攻撃には、文書型マルウェアがよく使われる
・マルウェア解析には時間がかかるが、対策・復旧目的の情報をすばやく解析する方法はある
・これらを行うためのツールがフリーで用意されているのでそれを使うと良い

-----
Session2:「モテる男子のためのアンパック」(NTT情報流通プラットフォーム研究所/岩村誠さん)

(その1)コンパイラ出力コードモデルの尤度に基づくアンパック手法
アンパッキングの自動化→書込み後に実行されたメモリ領域を検出することで、オリジナルエントリポイント(アンパッキングの完了ポイント)を検出する

動的に生成されたコードは、実はまだオリジナルのコードではない場合もある→コンパイラが出力したバイナリっぽさを検出する
よく使う命令(mov edi,edi)が出てきて、逆にコンパイラではあまり使わない命令や分岐処理がないコードが、コンパイラが出力したバイナリでは?、と仮定して、それを検出する
(どうやって検出するかは「隠れマルコフモデル」を用いる……詳しい数式などは省略)

CCCで得た検体(230検体)を基に、実証実験を実施→結果、アンパッキング中のコードとアンパック後のコードを完全に識別できた


(その2)マルウェアのエントリポイント検出後のおけるコード領域識別手法
オリジナルのエントリポイントを検出した→じゃあ、どこからどこまでがコード or データなのか?
マルウェアの場合、抽出を難しくしているケースもある→全部調べるだと、当然検出精度が低下する

通常の命令分岐の場合は、相対アドレス指定の分岐命令が使われる、これがコード領域をまたぐことは通常ない→ならばそれを上手く活用できれば特定できるのでは

特定するために、やはりここでも隠れマルコフモデルを活用して、プログラムコードの切れ目を特定する


(その3)IATエントリ格納場所の特定方法
マルウェアがどんなAPIを呼び出しているのかを調べる

パックされていない場合は、PEヘッダのImport Tableを見れば一発だけど、アンパックしたばかりのプログラムの場合は、PEヘッダが消えてしまっている場合がある→プログラムコードからIATの場所を特定する必要がある

オリジナルコードから0xFF、0x15/0x25を探し、オペランド部をIAT格納場所として認識→データ部分にあると誤検知してしまう(単純計算で32KBに1つ程度)
→ランタイムパッカーが意図的にこれらコードを混入させる事は可能か?
→可能、PEヘッダのリロケーションテーブルを参照すれば、逆アセンブルせずともベースアドレス変更が可能、これを活用して錯乱させる事も可能

とは言えパッカー、パックした結果元のコードが動かないのでは本末転倒→パックするのに自身のある箇所とそうでない箇所(あまりいじらない場所)が発生し、その特徴を上手く利用するで、通常の逆アセンブルツールよりも高い精度でIATエントリ格納場所を特定する事が可能


-----
Session3:「モバイルマルウェアやばい。まず広い。」(ラックホールディングス株式会社/サイバーセキュリティ研究所/山城重成さん )

(その1)Androidマルウェアの実例
大きく4分類に分けられます。
・端末情報取得系
・ボット系
・金銭目的系
・Root奪取

Androidマルウェアの特徴は次の3点。
・通常のアプリの裏で悪さをする
・正規のパッケージを改ざんしたものが殆ど
・感染してもアプリケーションの削除で駆除可能(なものもある...Root奪取は除く)

リパッケージによるアプリ改ざん
元のアプリパッケージは、実はZIP書庫、解凍したデータをデコンパイルし、不正コードを埋め込み、リコンパイル~リパッケージしてマーケットプレイスで公開という流れで生成、公開されている

パーミッション
アブリ毎に使える機能を制限するのだが、通常はインストール時に確認画面が表示されます(こんな機能を使うよ、というメッセージが出ます)
……が、普通の人が見ても分かりませんよね


(その2)ボットアプリによる遠隔操作デモ
メール(GMail)経由で不正コードが埋め込まれたパッケージが置かれたサイト(今回はAndroidマーケットではなく、専用に用意されたサーバ)にアクセス、アプリをインストールすると、ボットとして振舞う、というシナリオでデモが実施されました。


(その3)マルウェア解析手法
APKファイルの構造はこんな感じ。
・asset
・AndroidManifesto.xml
・classes.dex
・その他データ

・apktool→APKに内包したファイルをデコード、但し出力されるデータは見にくいかも
・dex2jar(dex→jar変換ツール) + jad(classをソースコードに変換)→結構綺麗なコードが出力されるが、変換精度があまり高くないのが難点(例外処理とかが該当)

とは言え、実際にやると面倒なので、実際に解析ツールを作ってみました(まだ非公開です)

(まとめ)
・Androidアプリの構造はシンプル
・呼び出されるインテント情報を集めれば、挙動解析は容易
・ただし一部のマルウェアについては、部分的に暗号化しているものもある
・NDKでコンパイルされてる部分はIDAで解析
・静的+動的解析の組み合わせ
-----


最新の画像もっと見る