マルウェア検知を遅らせる技法【平成29年度 春期 情報処理安全確保支援士試験 午後2 問1 設問3】

平成29年度 春期 情報処理安全確保支援士試験 午後2 問1 設問3

(略)

〔デバッガによる解析〕

 M君は、被疑PC内の不審なファイルのうち、マルウェアと思われる実行ファイルを所定の手続に従って取り出し、これを検体αと呼ぶことにした。続いて、CSIRTで用意している、デバッガを含むコード解析環境に検体αを投入した。

 まず、検体αから読解可能な文字列を探したが、ほとんど存在しなかった。続いて、デバッガによる逆アセンブルを試行した。その結果、得られたアセンブリコードには、通常であれば多数存在するはずのシステムコールの呼出しが少数しかなかった。M君はブレークポイント指定して検体αを実行してみたが、コードの冒頭部分が実行されただけで。何ら不正な動作をすることなく終了してしまった。

 解析に行き詰ったM君がV課長に相談したところ、検体αにはデバッガ環境下で実行していることを検知して実行を停止する機能が組み込まれているのであろうという説明を受けた。マルウェアがデバッガ環境下であることを検知する方法としては、デバッガ環境下であるかどうかを調べるシステムコールを実行する方法があるが、③その他にも幾つかの方法が知られている。

③について、どのような方法があるか?:実行中プロセスの一覧から既知のデバッガのプロセス名を探す。

PCやサーバなどOS上で実行されているプログラムは、実行中のプロセス一覧に表示されます。

利用者ではtasklistコマンド(Windows)やpsコマンド(Linux)でプロセス一覧を表示させますが、マルウェア自身もこれらのコマンドからプロセス一覧を取得することができます。

そこに既知のデバッガのプロセス名があれば、デバッガ環境下であることが分かります。

 M君は、検体αのアセンブリコードを読んで、デバッガ検知機能を発見し、これを無効化することに成功した。無効化後の検体を検体α2と呼ぶことにし、M君は、検体α2の解析を次の手法で進めた。

・検体α2をデバッガにロードした時点で、逆アセンブルを行い、システムコールの呼出し全てにブレークポイントを設定する。

・ブレークするごとにシステムコールの内容を記録し、検体αの動作を推測する。

 この結果判明したシステムコールの呼出し回数はごく僅かで、動作の推測には至らなかった。ごく僅かの回数ブレークした後は、ブレークすることなく検体α2の実行が続き、他のPCを感染させるための通信を試みた上で終了した。この通信を行うには、システムコールの呼出しが必要なはずであるが、ブレークすることはなかった。

 またもや解析に行き詰まったM君がV課長に相談したところ、パッカーが使われている可能性が高いとの説明を受けた。V課長は、パッカーの一般的な仕組みについて図7と図8を使って説明した。

f:id:aolaniengineer:20200222042236p:plain

f:id:aolaniengineer:20200222042303p:plain

図7の(5)について、検知が著しく難しい理由は?:暗号鍵を変えてパック処理すると暗号化済みコード部が変化し、ウィルス定義ファイルに登録されていないファイルとなるから

「ウィルス定義ファイルに基づくウィルススキャンでの検知」は、一般的には、既知のマルウェアの特徴をパターン化したウィルス定義ファイルと、メモリにロードされたファイルを比較し、同じパターンを持ったファイルをマルウェアとして検知します。

図8にあるように、パッカーでは、マルウェアをロードした時点ではマルウェア本体は暗号化済みコード部にあり、マルウェアが動作を開始する際に復号化され、マルウェアの実体が現れます。

したがって、ウィルススキャンを実行する際には暗号化されている状態となります。

マルウェアの暗号化版をウィルス定義ファイルに登録しようとしても、暗号鍵を変えられると暗号化済みコード部が変化するため、これによる検知は著しく難しくなります。

 M君は、パッカーによる動作を解析して、検体α2のマルウェア本体のコードを手に入れることができた。

【出典:情報処理安全確保支援士試験 平成29年度春期午後2問1(一部、加工あり)】