2004 Fall. Term Report Immune Project Project Menber D1 Kensuke Naoe <naoe@sfc.keio.ac.jp> B4 Hidekazu Tanaka <t01577ht@sfc.keio.ac.jp> B3 Hitoshi Nakai <t02645hn@sfc.keio.ac.jp> Takayouki Hotta <t02798th@sfc.keio.ac.jp> B2 Kjiro Shimoe <s03535ks@sfc.keio.ac.jp>
目次 Immune Projectの目的(堀田) アセンブラの基礎(下江) アセンブラでのウイルス解析(堀田) ウイルス検出方法の調査(中井) 論文発表(田中) 展望(田中) 謝辞(中井) 質疑応答(全員)
Immune Projectの目的 ウイルスの巧妙化 従来の検出手法 新しい手法の提案 ステルス型 ポリモフィック型 メタモフィック型 パターンマッチング ヒューリスティック手法 新しい手法の提案 アセンブラレベルでの解析 パターン学習による解析 ■感染を隠匿するウィルス かつてあった感染を隠匿するウィルスの形態としてステルス型があった。 これはチェックサムによるウィルス検出を免れるタイプです。 チェックサム方式は感染前と後ではファイルのサイズが異なる事を利用して検出するために、 それを逆手にとって感染前と後のサイズを合わせるウィルスです。 これはかなり前の時点でメーカー各社が対応しました。 ポリモフィック型 従来と異なる点 ・ウィルスのコードを暗号化 ・暗号化鍵は感染の度に変化 ・プログラムコードの一部に暗号化/復号化のエンジンを持つ ・(暗号を複合せずに検出は方法を選ばなければ(選んでも)難しい。) 特徴 感染するたびにウィルスが自分自身の実行コードを書き換える 計算手順やウィルス本体の位置をランダムに変えるなど、様々な手法で隠匿を試みる。 → パターンマッチングによる検出はまず不可能 単純にファイル中のコードを見て、 ウィルスの特徴的なコード列がプログラム中に存在するかで判断する。 文字列だけではなく、パターンの発生順序、互いの距離にも注目している。 ただし、これらは対象となるウィルスのパターン定義ファイルの所持が前提。 また、ファイル全体にマッチングをかける為に非常に時間がかかる。 先に挙げた特徴から、ポリモフィック・メタモフィックウィルスの検出は難しい。 そこで、私たちは検出率を上げる手法を確立しようと研究しています。 その中でアセンブラレベルでの解析・パターン学習による解析問い手法を提案したいと重い、実装に向けて励んでいます。
アセンブラの基礎 アセンブラ言語とは? アセンブリ言語の表し方 マシン語命令群その1 その2 その3
アセンブラとは? アセンブリ言語はプログラミング言語の一種 アセンブリ言語が他の言語と違う点 キーワード コンピューターが唯一理解できるのはマシン語だが、そのマシン語を人間に理解できるようにしたものがプログラミング言語。 アセンブリ言語が他の言語と違う点 javaやc言語など他の言語はマシン語と一対一に対応していないが、アセンブリ言語はマシン語と一対一に対応している。 キーワード ニーモニック オペコード オペランド
アセンブリ言語の表し方 ニーモニック オペコード(主命令) オペランド(対象となる相手、条件、パラメータ) マシン語には一つ一つ記号が割り振られていて、その記号のことをニーモニックと呼ぶ。ex) mov al 02h ニーモニックはオペコードとオペランドと呼ばれる二つの部分に分けることができる。 オペコード(主命令) データ転送やジャンプなどの命令を下す部分。 上記の例ではmov がそれにあたる。 オペランド(対象となる相手、条件、パラメータ) レジスタやアドレスなど命令の対象となる部分。上記の例ではal 02hがそれにあたり、このオペランドによって対応するマシン語が変わる。
マシン語命令その1 データ転送命令 算術演算命令 レジスタとメモリとの間でデータをやりとりのための命令 例 mov EAX 7E9675A1h (EAXレジスタに7E9675A1hをロード) レジスタ→メモリのやりとりを「ストア」、メモリ→レジスタのやりとりを「ロード」という。 算術演算命令 四則演算や比較などをするための命令。結果がレジスタやメモリに転送される。さらに結果の状態(0や正負など)がフラグレジスタにセットされる。 例) add ax 0020h axの内容に0020hを加える inc ax axの値をインクリメントする cmp eax 0030h eaxの内容と0030hを比較して 結果をフラグレジスタにセット
マシン語命令その2 ジャンプ命令 無条件ジャンプ 条件付きジャンプ プログラムの流れを変えるための命令。 ジャンプ無条件と条件付きジャンプの2種類ある。 無条件ジャンプ jmp アドレス指定 の形で表される。 実行されるとオフセットアドレスが特定のレジスタにロードされ、ジャンプされる。 条件付きジャンプ フラグレジスタの値を判定し、その結果によってジャンプの有無を決める。 je アドレス指定 : ゼロフラグの値が1ならば指定した アドレスにジャンプ cmp AX 005ah ja アドレス指定: 結果が大きければ指定したアドレスに ジャンプ
その他のマシン語命令 サブルーチンのコール・リターン スタックのプッシュ・ポップ 論理演算命令 シフト・ローテート命令 call サブルーチン名 スタックのプッシュ・ポップ push eax() 論理演算命令 or al 20h(alレジスタの内容とデータ20hのorをとる) シフト・ローテート命令 shl bl 1(blの内容を左に1つシフトする)
アセンブラでのウイルス解析 Weflow.asm 1993年のVirus TRIDENT OVERWRITING VIRUSがBaseになっている OverWriting 1992年のVirus ウイルスと感染するファイルが実行されるたびに、このウイルスはホストファイルの最初64バイトをOver Writeすることによってワーキング・ディレクトリの.comファイルすべてを感染させる その流れの中で、私たちは今期実際のウイルスをアセンブラ言語で読んでみて、それがどのような動作をしているのかを解析してみました。 ここでは、そのうちのひとつをピックアップして紹介します。また、他に行ったものはレポートに添付資料として添付します。 解析したウイルスはweflowというウイルス
Weflow.asm (code) MAIN: MOV AH,4EH NOTSOCOOL: LEA DX,FF INT 21H JNC COOL RET COOL: MOV AX,3D02H MOV DX,9EH XCHG AX,BX MOV CL,VLEN MOV AH,40H MOV AH,3EH MOV AH,4FH JMP NOTSOCOOL FF DB '*.*',0 DB 'WEFLOW93' VLEN EQU $-MAIN
Weflow.asm (解説:MAIN) MOV AH,4EH ahレジスタに4ehの指す内容を転送 具体的にはahレジスタに対して初回ファイル検索を行う ちなみに、この結果はCF(Cflag)の返り値を与える CF = 0:成功 CF = 1:エラー
Weflow.asm (解説:NOTSOCOOL) LEA DX,FF INT 21H dxレジスタに下で定義したFFのアドレスを転送 このときAHの値は4Eもしくは4Fであれば、“初回ファイル検索”or“次回ファイル検索”で4Eの時のみ、DX=ファイル名を含む文字列ポインタを参照、4Fでは参照しない。 検索結果はディスク転送アドレスに格納される 成功CF=0 失敗CF=1 JNC COOL RET Cflagが降りているときに分岐する(降りているときはCOOLに また、“RET”で実行していたものから戻ってくる(COOLから戻ってくる。 さらに、ここでCF=1ならばプログラムは終了する 同じフォルダの中のファイルを探し出してOPENするルーチン。 すなわちこの状況で必ずひとつはそのフォルダ中にファイルが存在する。
Weflow.asm (解説:COOL.1) MOV AX,3D02H MOV DX,9EH INT 21H XCHG AX,BX AXレジスタを書き出し・読み込み双方対応できるようオープンする。 DXレジスタに9eが指す内容を転送 XCHG AX,BX MOV CL,VLEN MOV AH,40H AXレジスタとBXレジスタの内容を入れ替える CLにVLENの値を入れる(VLENは下で定義している) ahレジスタに書き込む 画面及びファイルに細工を加えた後、次のファイルを検索するために NOTSOCOOLに戻るルーチン HOTSOCOOLからRETされた場合は終了する ここでMOV 3Dについて述べておこう MOV 3Dではファイルをオープンするという意味合いがある その後ろについている02hというのは、"AL = 2"という意味合い 参考として、ALは0で読み込み、1で書き込み、2で読み書きという意味を表している また、その後にあるDXというのはどのファイルを検索するのかを記録しておく 文字列ポインタを格納するレジスタであるので、レジスタの9eにある文字列のファイルを AXレジスタから検索してオープンするということである ここでもしファイルが無かったら、ここでもまたCFに1を返すのである ここでわかるように、CFは成功か失敗かを示すレジスタといえる MOV 40Hはいわゆる、書き込みを行う命令である 書き込む対象はFikeかDeviceである この詳しい指定をするには BX : これはHandleであり、これで何に書き込むのかを規定する これが特に規定されていない場合はDOS 2.Xでは1となり 標準的には画面に出力される しかし、ここでは、BXをAXという風に規定しているので AXに書き込むと考えるのが正しい見方だろう CX : これはbyte Countつまり、何バイト書き込むかを規定する DX : bufferにある情報を文字列として書き込むのが普通なのだが DXレジスタ、つまりバッファに値を入れなおすことも可能である なお、先ほどとDXの定義が違っているのだが、これは各命令が DX(DS)をどのように見ているかが違うからである
Weflow.asm (解説:COOL.2) MOV AH,3EH INT 21H MOV AH,4FH JMP NOTSOCOOL 次回ファイル検索を行う JMP NOTSOCOOL 無条件でNOTSOCOOL(最初に規定した文字列ポインタ)の先に飛ぶ
Weflow.asm (解説:FF・VLEN) DB '*.*',0 DB 'WEFLOW93‘ 文字列をセットする EQU $-MAIN VLENにMAINの大きさを入れるもの なお、EQUを用いVLENを規定したため、この後VLENを開放することなしに、VLENを変更することはかなわない
Weflow.asm (code) MAIN: MOV AH,4EH NOTSOCOOL: LEA DX,FF INT 21H JNC COOL RET COOL: MOV AX,3D02H MOV DX,9EH XCHG AX,BX MOV CL,VLEN MOV AH,40H MOV AH,3EH MOV AH,4FH JMP NOTSOCOOL FF DB '*.*',0 DB 'WEFLOW93' VLEN EQU $-MAIN
ウイルスの巧妙化 ウイルスの巧妙化 ステルス型 ポリモフィック型 メタモフィック型 プログラムコードを暗号化 暗号化鍵は感染の都度に変化 暗号化/複合化エンジン メタモフィック型 感染するたびに自分自身のコードを書き換える 様々な手法での隠匿の試み ■感染を隠匿するウィルス かつてあった感染を隠匿するウィルスの形態としてステルス型があった。 これはチェックサムによるウィルス検出を免れるタイプです。 チェックサム方式は感染前と後ではファイルのサイズが異なる事を利用して検出するために、 それを逆手にとって感染前と後のサイズを合わせるウィルスです。 これはかなり前の時点でメーカー各社が対応しました。 ポリモフィック型 従来と異なる点 ・ウィルスのコードを暗号化 ・暗号化鍵は感染の度に変化 ・プログラムコードの一部に暗号化/復号化のエンジンを持つ ・(暗号を複合せずに検出は方法を選ばなければ(選んでも)難しい。) 特徴 感染するたびにウィルスが自分自身の実行コードを書き換える 計算手順やウィルス本体の位置をランダムに変えるなど、様々な手法で隠匿を試みる。 → パターンマッチングによる検出はまず不可能
従来のウィルスの検出 従来のウイルスの検出 パターンマッチング ヒューリスティック手法 文字列 パターンの発生順序 特定のパターン同士の距離 ⇒対象となるウイルスのパターン定義ファイルの所持が前提 また、時間がかかる。 ヒューリスティック手法 問題をすばやく解決するための手法 大まかな予想からあたりをつけて検索する手法 動的ヒューリスティックと静的ヒューリスティックがある 単純にファイル中のコードを見て、 ウィルスの特徴的なコード列がプログラム中に存在するかで判断する。 文字列だけではなく、パターンの発生順序、互いの距離にも注目している。 ただし、これらは対象となるウィルスのパターン定義ファイルの所持が前提。 また、ファイル全体にマッチングをかける為に非常に時間がかかる。 先に挙げた特徴から、ポリモフィック・メタモフィックウィルスの検出は難しい。
ヒューリスティック手法 静的ヒューリスティック 動的ヒューリスティック パターンのデータベース ウィルスの複合化のルーチンを認識 仮想空間上でプログラムを動かす 静的ヒューリスティックは、、、 ウィルスを実行する前にファイルの状態で検知しようとする。 動的ヒューリスティックは、、、 仮想的な空間上でそれがウィルスかどうかを検知しようとする。 ⇒ポリモフィック、メタモフィックにも効果が得られる。
ヒューリスティック手法 さて、静的・動的いずれにおいても、 この様にファイルの中に、、、 ウィルスがありそうな場所を大まかな見当をつけます。 実行ファイル全体の構造、ロジック、命令セットファイル内のデータといった全ての属性を調べ、、、そのファイルがウィルスに感染している可能性を査定する。
ヒューリスティック手法の問題点 問題をすばやく解決するための手法 ⇒完璧ではない ⇒検索部位とウイルスの存在する部位が違えば ウイルスが発見できない ⇒完璧ではない (問題をすばやく解決するための手法) ⇒最も適した解でなくとも、大まかな予測から効率的な解決を得る手法 なお、ヒューリスティック手法には静的手法と動的手法があります。
アセンブラレベルでの解析 ウィルスのコードを静的に逆アセンブル →従来のヒューリスティックパターンに、さらに細かいパターンを定義することができる 例えばメタモーフィックコードに良くみられるようなジャンプ命令群、 ジャンクコードの羅列などが発見された場合、メタモフィックウィルスだと 判断される。自分自身を書き換えるルーチンは必ず存在するため、 このルーチンを発見することでウィルスの判断材料とする。 さらにビヘイビア法を用いることで高い確率で検出
動的ヒューリスティック 静的ヒューリスティック Unknown Virus ヒューリスティックスキャンのためのルール群データベース mov dword_3,6E72654Bh mov dword_4,32336C65h mov dword_5,0h push offset dword_3 call ds:[GetModuleHandleA] 静的ヒューリスティック 動的ヒューリスティック アセンブラ命令パターン アルゴリズムのパターン 挙動のパターン ヒューリスティックスキャンのためのルール群データベース 様々な角度から挙動や命令群、アルゴリズムなどを比較 Unknown Virus
パターン学習による検出 ニューラルネットワークを用いたパターン検出 学習結果に基づく分類判定 →さらに高い確率で未知ウィルスであると特定することができる アセンブリ言語による解析の後、初めて学習を行う 既知ウィルスから、その挙動パターンやアルゴリズムパターンなど様々なファクターから パターンを学習する必要性が要求される
動的ヒューリスティック 静的ヒューリスティック mov dword_3,6E72654Bh mov dword_4,32336C65h mov dword_5,0h push offset dword_3 call ds:[GetModuleHandleA] 静的ヒューリスティック 動的ヒューリスティック アセンブラ命令パターン アルゴリズムのパターン 挙動のパターン ヒューリスティックスキャンのためのルール群データベース 新しい挙動パターンやアルゴリズム、命令の順序などがあればデータベースにパターンを学習させる Unknown Virus
まとめ アセンブリ言語に逆アセンブルしたコードからパターン抽出し、学習 →検出率の向上と誤検出・誤警報の減少
今後の展望 情報処理学会全国大会発表に向けて実装