(57)【要約】【課題】自身が解析されていると認識することで自プロセスを終了させる機能を有する特定プログラムの活動を抑制する。【解決手段】コンピュータ１０において、カーネルセグメント１１に存在する(カーネルモードで動作する)プロセス生成監視部１２が、新たなプロセスの生成を監視し、例えば、プロセス１４ａ〜１４ｄが新たに生成されたことを、ユーザモードで動作する監視モジュール生成部１３に通知する。すると、監視モジュール生成部１３は、プロセス１４ａ〜１４ｄに対して、それぞれ、例えば、特定のＡＰＩの呼び出しを監視して呼び出しがあれば自プロセスを終了させるような処理を行う監視モジュール１５ａ〜１５ｄを注入する。【選択図】図２
2008176352.tif 000002
【特許請求の範囲】
【請求項１】
自身が実行されることで生成されたプロセスを自身が解析されていると認識することで終了させる機能を有する特定プログラムの動作を制御するためのコンピュータプログラムであって、
コンピュータに、
プログラムが実行されることにより新たなプロセスが生成されたことを、ＯＳ(Operating System)の実行モードで検出する機能と、
生成された前記プロセスに対し、前記プログラムが解析されていると誤認させるための処理を施すことにより、当該プログラムが前記特定プログラムであれば当該プロセスを終了させる機能と
を実現させるためのコンピュータプログラム。
【請求項２】
前記終了させる機能では、生成された前記プロセスに対し、前記プログラムを解析しているデバッガが無いにも関わらず、当該プログラムを解析しているデバッガが有ると誤認させるための処理を施すことを特徴とする請求項１記載のコンピュータプログラム。
【請求項３】
前記終了させる機能では、前記プログラムを解析しているデバッガが有るかどうかを示す情報を返すＡＰＩ(Application Program Interface)をフックし、当該プログラムを解析しているデバッガが有る旨の情報を返す処理を、前記誤認させるための処理として行うことを特徴とする請求項２記載のコンピュータプログラム。
【請求項４】
前記終了させる機能では、前記プロセスに割り当てられたメモリに展開された前記プログラムの実行コードにブレークポイント例外を発生させる命令を含める処理を、前記誤認させるための処理として行うことを特徴とする請求項２記載のコンピュータプログラム。
【請求項５】
前記終了させる機能では、指定されたファイルが有るかどうかを示す情報を返すＡＰＩをフックし、前記プログラムが特定のデバッガにより解析されている場合に存在する特定のファイルが当該ＡＰＩを呼び出す際に指定されていれば、当該特定のファイルが有る旨の情報を返す処理を、前記誤認させるための処理として行うことを特徴とする請求項２記載のコンピュータプログラム。
【請求項６】
前記終了させる機能では、時間に関する値を返すＡＰＩをフックし、前回返した時間に関する値との差が所定値以上になるような時間に関する値を返す処理を、前記誤認させるための処理として行うことを特徴とする請求項２記載のコンピュータプログラム。
【請求項７】
前記終了させる機能では、生成された前記プロセスに対し、前記プログラムを解析するための仮想マシン環境が無いにも関わらず、当該プログラムを解析するための仮想マシン環境が有ると誤認させるための処理を施すことを特徴とする請求項１記載のコンピュータプログラム。
【請求項８】
前記終了させる機能では、前記コンピュータのＭＡＣアドレスを書き換える処理と、前記仮想マシン環境を提供するソフトウェアのインストールによって追加される設定データを生成する処理とを、前記誤認させるための処理として行うことを特徴とする請求項７記載のコンピュータプログラム。
【請求項９】
自身が実行されることで生成されたプロセスを自身が解析されていると認識することで終了させる機能を有する特定プログラムの動作を制御するコンピュータ装置であって、
プログラムが実行されることにより新たなプロセスが生成されたことを、ＯＳの実行モードで検出する検出手段と、
生成された前記プロセスに対し、前記プログラムが解析されていると誤認させるための処理を施すことにより、当該プログラムが前記特定プログラムであれば当該プロセスを終了させる処理手段と
を備えたことを特徴とするコンピュータ装置。
【請求項１０】
自身が実行されることで生成されたプロセスを自身が解析されていると認識することで終了させる機能を有する特定プログラムの動作を制御する動作制御方法であって、
プログラムが実行されることにより新たなプロセスが生成されたことを、ＯＳの実行モードで検出するステップと、
生成された前記プロセスに対し、前記プログラムが解析されていると誤認させるための処理を施すことにより、当該プログラムが前記特定プログラムであれば当該プロセスを終了させるステップと
を含むことを特徴とする動作制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、自身が解析されていると認識することで自プロセスを終了させる機能を有する特定プログラムの動作を制御するためのコンピュータプログラム等に関する。
【背景技術】
【０００２】
インターネットの普及に伴い、ネットワークを介した悪性プログラムによる被害が急増している。ここで、悪性プログラムは、「マルウェア」とも呼ばれ、ユーザにとって好ましくない動作を行う悪意を持つプログラムのことである。例えば、コンピュータに侵入して破壊活動を行ったり、他のコンピュータへの感染活動を行ったり、情報を外部に漏洩させたりするプログラムがこれに該当し、所謂コンピュータウイルスはその一例である。
コンピュータウイルスのチェックについては、従来から種々の提案がなされている(例えば、特許文献１参照)。この特許文献１では、配信を行う電子メールに対してウイルスパターンデータベースに記録されているウイルスパターンデータに基づいてウイルスの有無を検出している。
【０００３】
【特許文献１】特開２００２−３６８８２０号公報
【発明の開示】
【発明が解決しようとする課題】
【０００４】
ところで近年、ボットと呼ばれるコンピュータウイルスの一種による被害が急増している。ボットは、ワームと同様にネットワークを介して自己増殖を行う悪性プログラムであるが、外部から制御可能である点が従来のワームと大きく異なる。従来のワームは、プログラムされた通り動作するオートマンである。これに対して、ボットは脆弱なコンピュータに感染した後、Ｃ＆Ｃ(コマンド＆コントロール)サーバと呼ばれる制御用サーバに接続し、ボットの管理者(bot-herder)からの指示を待ち受ける。この結果、ボットの自己増殖に伴い、Ｃ＆Ｃサーバを中心とするボット感染コンピュータのネットワーク、即ちボットネットが形成されることとなり、ボット管理者はＣ＆Ｃサーバに対して命令を送信することでボットネットに接続された数千から数万のボットを同時に制御することが可能となっている。
【０００５】
また、このようなボット流布の背景には、ボット自身がオープンソースの手法により開発されていることが挙げられる。ボットのソースコードはインターネットで広く流通している。従って、誰でもソースコードを入手し改造することで独自のボットを開発することが可能である。このため、一種類のボットに対して数百から数千の亜種が存在することとなる。
【０００６】
例えば、このボットのように短期間に莫大な数の亜種が出現する悪性プログラムについて、特許文献１にあるようなウイルスパターンデータとの照合だけでは、その活動を抑制できないという問題点があった。
【０００７】
本発明は、以上のような技術的課題を解決するためになされたものであって、その目的は、自身が解析されていると認識することで自プロセスを終了させる機能を有する特定プログラムの活動を抑制することにある。
【課題を解決するための手段】
【０００８】
かかる目的のもと、本発明は、自身が実行されることで生成されたプロセスを自身が解析されていると認識することで終了させる機能を有する特定プログラムについて、この機能を逆用することでその活動を抑制するようにした。即ち、本発明のコンピュータプログラムは、コンピュータに、プログラムが実行されることにより新たなプロセスが生成されたことを、ＯＳ(Operating System)の実行モードで検出する機能と、生成されたプロセスに対し、プログラムが解析されていると誤認させるための処理を施すことにより、そのプログラムが特定プログラムであればそのプロセスを終了させる機能とを実現させる。
【０００９】
ここで、終了させる機能では、第一に、生成されたプロセスに対し、プログラムを解析しているデバッガが無いにも関わらず、そのプログラムを解析しているデバッガが有ると誤認させるための処理を施すようにすることが考えられる。
その場合、プログラムを解析しているデバッガが有るかどうかを示す情報を返すＡＰＩ(Application Program Interface)をフックし、そのプログラムを解析しているデバッガが有る旨の情報を返す処理を、誤認させるための処理として行うようにしてもよい。
また、プロセスに割り当てられたメモリに展開されたプログラムの実行コードにブレークポイント例外を発生させる命令を含める処理を、誤認させるための処理として行うようにしてもよい。
更に、指定されたファイルが有るかどうかを示す情報を返すＡＰＩをフックし、プログラムが特定のデバッガにより解析されている場合に存在する特定のファイルがそのＡＰＩを呼び出す際に指定されていれば、その特定のファイルが有る旨の情報を返す処理を、誤認させるための処理として行うようにしてもよい。
更にまた、時間に関する値を返すＡＰＩをフックし、前回返した時間に関する値との差が所定値以上になるような時間に関する値を返す処理を、誤認させるための処理として行うようにしてもよい。
【００１０】
また、終了させる機能では、第二に、生成されたプロセスに対し、プログラムを解析するための仮想マシン環境が無いにも関わらず、そのプログラムを解析するための仮想マシン環境が有ると誤認させるための処理を施すことも考えられる。
その場合、コンピュータのＭＡＣアドレスを書き換える処理と、仮想マシン環境を提供するソフトウェアのインストールによって追加される設定データを生成する処理とを、誤認させるための処理として行えばよい。
【００１１】
更に、本発明は、自身が実行されることで生成されたプロセスを自身が解析されていると認識することで終了させる機能を有する特定プログラムについて、この機能を逆用することでその活動を抑制するコンピュータ装置として捉えることもできる。その場合、本発明のコンピュータ装置は、プログラムが実行されることにより新たなプロセスが生成されたことを、ＯＳの実行モードで検出する検出手段と、生成されたプロセスに対し、プログラムが解析されていると誤認させるための処理を施すことにより、そのプログラムが特定プログラムであればそのプロセスを終了させる処理手段とを備えている。
【００１２】
一方、本発明は、自身が実行されることで生成されたプロセスを自身が解析されていると認識することで終了させる機能を有する特定プログラムについて、この機能を逆用することでその活動を抑制する方法として捉えることもできる。その場合、本発明の動作制御方法は、プログラムが実行されることにより新たなプロセスが生成されたことを、ＯＳの実行モードで検出するステップと、生成されたプロセスに対し、プログラムが解析されていると誤認させるための処理を施すことにより、そのプログラムが特定プログラムであればそのプロセスを終了させるステップとを含んでいる。
【発明の効果】
【００１３】
本発明によれば、自身が解析されていると認識することで自プロセスを終了させる機能を有する特定プログラムの活動を抑制することができるようになる。
【発明を実施するための最良の形態】
【００１４】
以下、添付図面を参照して、本発明を実施するための最良の形態(以下、「実施の形態」という)について詳細に説明する。
本発明者らは、これまでにボットネット実態調査の一環として、入手したソースコードの一次分析を実施し、ボットには自身に対するデバッガ等による解析動作を妨害する機能(以下、「耐解析機能」という)が備わっていることを確認した。こうした耐解析機能は、ボット自身に対するデバッガのアタッチ等、解析の兆候を検知すると、自プロセスを終了させる仕組みになっており、アンチウイルスベンダ等によるプログラム解析を遅延、困難にさせることが目的と考えられる。
本明細書では、この仕組みを逆用してボット等の耐解析機能を備えた悪性プログラムに解析の兆候を誤認させることで、その動作を停止させる手法を提案する。また、実装したプロトタイプの評価を通じて、提案手法の有効性を示す。
【００１５】
本発明者らは、代表的なボットであるＡｇｏｂｏｔのソースコードを詳細に分析した。その結果、Ａｇｏｂｏｔには大きく下記のＡ、Ｂの耐解析機能が実装されており、初期化処理時に耐解析機能を利用して自身に対する解析の兆候を確認すること、及び、いずれかの解析の兆候が見られた場合、初期化処理を中断し、自プロセスを終了させることが分かった。また、Ａ、Ｂの耐解析機能は、それぞれ、Ａ−１〜４、Ｂ−１〜２の手法を用いて実現されることも分かった。
Ａ．デバッガの検知
Ａ−１．IsDebuggerPresent APIの利用
Ａ−２．ブレークポイントの検出
Ａ−３．ＳｏｆｔＩＣＥ(登録商標)の検出
Ａ−４．実行時間の計測
Ｂ．仮想環境の検知
Ｂ−１．ＶＭｗａｒｅ(登録商標)の検知
Ｂ−２．Ｖｉｒｔｕａｌ ＰＣの検知
【００１６】
まず、Ａｇｏｂｏｔのソースコード分析を通して確認することができた耐解析機能の詳細について述べる。
Ａ．デバッガの検知
Ａ−１．IsDebuggerPresent APIの利用
Ｗｉｎｄｏｗｓ(登録商標)では、プロセスが生成されるとＯＳによって自動的にプロセス環境ブロック(ＰＥＢ：Process Environment Block)が生成される。ＰＥＢ中には、プロセスに関する様々なパラメータが格納されており、その１つにBeingDebuggedフラグが存在する。BeingDebuggedフラグは、プロセス生成時に偽の値に初期化されるが、DebugActiveProcess API等によりデバッガがアタッチされると真の値に設定される。Ｗｉｎｄｏｗｓの標準ＡＰＩであるIsDebuggerPresent APIは、このBeingDebuggedフラグの値を読み出すことができ、ＡｇｏｂｏｔではこのＡＰＩを利用してデバッガの有無を検出している。
【００１７】
Ａ−２．ブレークポイントの検出
デバッガは、プログラムにブレークポイントを設定することで、任意の箇所でプログラムの実行を停止することができる。これは、停止させたいプログラムの実行コード箇所にブレークポイント例外を発生させる機械語命令(ＩＮＴ３命令)を挿入することで実現されている。プログラムがＩＮＴ３命令を実行すると、ブレークポイント例外が発生し、この例外をＣＰＵがハンドリングする。ＣＰＵは、デバッガの有無を確認し、例外が発生したプロセスにデバッガがアタッチされていた場合、処理をデバッガに委ねる。Ａｇｏｂｏｔは、メモリ上に展開された自身の実行コードを定期的にスキャンし、ＩＮＴ３命令の挿入の有無を確認することで、デバッガを検知する。
【００１８】
Ａ−３．ＳｏｆｔＩＣＥの検出
ＳｏｆｔＩＣＥは、デバイスドライバ等のデバッガで利用される高性能のカーネルモードデバッガである。ＳｏｆｔＩＣＥを、システム上にインストールするとデバッガがカーネルモードにアクセスするための特別な名前空間がＮＴファイルシステム上に生成される。Ａｇｏｂｏｔは、この名前空間の存在を確認することでシステム上のＳｏｆｔＩＣＥの存在と共に、デバッガの検出を行っている。
【００１９】
Ａ−４．実行時間の計測
一般的なデバッガは、前述のように任意の箇所にブレークポイントを設定することでプログラムの処理を自由に中断することができる。また、シングルステップ実行機能を備えたデバッガを利用することで、ＣＰＵにおける１命令毎にプログラムの実行を中断することもできる。このようなデバッガを用いた解析が行われていた場合、本来であれば数秒程度で終了する処理の実行に極端に長い時間がかかることとなる。Ａｇｏｂｏｔは、耐解析機能の処理の始めと終わりに現在時刻を取得し、２つの値の差分が設定した閾値(５秒)を超えていた場合、デバッガにより解析が行われていると判断している。
【００２０】
Ｂ．仮想環境の検知
仮想環境の検知は、仮想マシン環境を提供するソフトウェアであるＶＭｗａｒｅならびに、Ｖｉｒｔｕａｌ ＰＣの存在検知を目的としている。ここでは、ＶＭｗａｒｅの検知を中心に述べる。
ＶＭｗａｒｅにおいて、仮想マシン環境を提供するＯＳをＨｏｓｔＯＳ、仮想マシン上で稼動するＯＳをＧｕｅｓｔＯＳと呼ぶ。ＨｏｓｔＯＳとＧｕｅｓｔＯＳは、論理的に分離された環境となるため、ＧｕｅｓｔＯＳ上で悪性プログラムを実行することで、安全に悪性プログラムの解析を行うことができる。
ところが、このように論理的に分離された環境であるＨｏｓｔＯＳとＧｕｅｓｔＯＳの間に、VMware Backdoor I/Oと呼ぶ、一部の制御情報を交換するための非公開の機能が存在している。VMware Backdoor I/Oは、特定のＩ/Ｏポートに対するｉｎ命令を利用することで実現され、その際にＣＰＵのレジスタに任意のコマンド番号を設定することで様々な制御情報を交換することが可能となっている。このVMware Backdoor I/Oにおけるコマンド番号と機能の対応の例を以下に示す。
【００２１】
【表１】
2008176352.tif 000003
【００２２】
Ａｇｏｂｏｔは、VMware Backdoor I/OによりＶＭｗａｒｅのバージョン情報を取得し、現在自プロセスが実行されている環境がＧｕｅｓｔＯＳ内であるかどうかを判定する。
【００２３】
次に、上記Ａ−１のIsDebuggerPresent APIを利用したデバッガ検知を誤認させる手法の実装と、その有効性について述べる。尚、IsDebuggerPresent APIの手法を選択した理由は、Ａｇｏｂｏｔのソースコード詳細分析により、デバッガ検知手法として他の悪性プログラムにも利用されていると推測できたこと、また逆用のための実装が他のデバッガ検知手法と比べて、比較的容易であろうという判断からである。
IsDebuggerPresent APIは、このＡＰＩを呼び出したプロセスが、その時点においてデバッグされているかどうかを真偽値で返す関数である。本実施の形態では、悪性プログラムがこのＡＰＩを呼び出したときの返り値が、常に真となるような仕組みを実装した。
【００２４】
まず、本実施の形態を適用するのに好適なコンピュータ１０のハードウェア構成について説明する。
図１は、このようなコンピュータ１０のハードウェア構成の一例を示した図である。
図示するように、コンピュータ１０は、演算手段であるＣＰＵ(Central Processing Unit)１０ａと、Ｍ/Ｂ(マザーボード)チップセット１０ｂを介してＣＰＵ１０ａに接続されたメインメモリ１０ｃと、同じくＭ/Ｂチップセット１０ｂを介してＣＰＵ１０ａに接続された表示機構１０ｄとを備える。また、Ｍ/Ｂチップセット１０ｂには、ブリッジ回路１０ｅを介して、ネットワークインターフェイス１０ｆと、磁気ディスク装置(ＨＤＤ)１０ｇと、音声機構１０ｈと、キーボード/マウス１０ｉと、フレキシブルディスクドライブ１０ｊとが接続されている。
【００２５】
尚、図１において、各構成要素は、バスを介して接続される。例えば、ＣＰＵ１０ａとＭ/Ｂチップセット１０ｂの間や、Ｍ/Ｂチップセット１０ｂとメインメモリ１０ｃの間は、ＣＰＵバスを介して接続される。また、Ｍ/Ｂチップセット１０ｂと表示機構１０ｄとの間は、ＡＧＰ(Accelerated Graphics Port)を介して接続されてもよいが、表示機構１０ｄがＰＣＩ Ｅｘｐｒｅｓｓ対応のビデオカードを含む場合、Ｍ/Ｂチップセット１０ｂとこのビデオカードの間は、ＰＣＩ Ｅｘｐｒｅｓｓ(ＰＣＩｅ)バスを介して接続される。また、ブリッジ回路１０ｅと接続する場合、ネットワークインターフェイス１０ｆについては、例えば、ＰＣＩ Ｅｘｐｒｅｓｓを用いることができる。また、磁気ディスク装置１０ｇについては、例えば、シリアルＡＴＡ(AT Attachment)、パラレル転送のＡＴＡ、ＰＣＩ(Peripheral Components Interconnect)を用いることができる。更に、キーボード/マウス１０ｉ、及び、フレキシブルディスクドライブ１０ｊについては、ＵＳＢ(Universal Serial Bus)を用いることができる。
【００２６】
次に、本実施の形態におけるデバッガ検知を誤認させる手法の実装について説明する。
本実施の形態では、まず、カーネルモードで動作するデバイスドライバによってプロセス生成を監視し、生成されたプロセスの情報を、ユーザモードで動作するサービスアプリケーションに通知する。次に、生成されたプロセスの情報を受け取ったサービスアプリケーションが偽のIsDebuggerPresent APIの処理を実装したＤＬＬ(ダイナミックリンクライブラリ)を悪性プログラムに注入する。尚、ここでは、便宜上「偽の」と表現しているが、実際は、後述するように、IsDebuggerPresent APIが呼ばれた際に、予め用意した別の処理へ向けて実行パスを変更する実装としている。
【００２７】
図２は、IsDebuggerPresent APIを利用したデバッガ検知を誤認させる際におけるコンピュータ１０のソフトウェア構成を模式的に示した図である。
図示するように、カーネルセグメント１１には、プロセス生成監視部１２として機能するデバイスドライバのコードが格納されている。即ち、プロセス生成監視部１２は、カーネルモード(ＯＳの実行モード)で動作するプログラム(システムに常駐するプログラム)である。このプロセス生成監視部１２は、新たなプロセスの生成を監視し、プロセスが生成されるとこれを検出する。そして、ユーザモードで動作する監視モジュール生成部１３に対し、(１)に示すように、生成されたプロセスの情報を通知する。即ち、本実施の形態では、新たなプロセスが生成されたことをＯＳの実行モードで検出する検出手段の一例として、プロセス生成監視部１２を設けている。
【００２８】
一方で、ユーザモードでは、通常、複数のプロセスが実行されている。図には、４つのプロセスを、プロセス１４ａ〜１４ｄとして示している。つまり、これらのプロセスについては、その生成時に、プロセス生成監視部１２がプロセスの生成を検出し、既に監視モジュール生成部１３に対してプロセスの情報を通知済みである。
このようにプロセスの情報が通知されると、監視モジュール生成部１３は、通知されたプロセスに監視モジュールを注入する。即ち、そのプロセスに割り当てられたテキストセグメントに対し、(２)に示すように、監視モジュール１５ａ〜１５ｄを強制的にロードする。ここで、監視モジュールとは、例えば、ＤＬＬである。但し、上述したように、IsDebuggerPresent APIが呼び出された際に、予め用意した別の処理が実行されるような仕組みを有するＤＬＬである。即ち、本実施の形態では、プログラムが解析されていると誤認させるための処理を、そのプログラムが実行されることで生成されたプロセスに対して施す処理手段の一例として、監視モジュール生成部１３を設けている。
強制ロードの結果、監視モジュール１５ａ〜１５ｄは、(３)に示すように、自プロセスの動作を監視する。そして、IsDebuggerPresent APIが呼び出されると、代替処理が実行され、自プロセスは終了する。
【００２９】
次いで、本実施の形態の動作について説明する。
図３は、本実施の形態におけるプロセス生成監視部１２と監視モジュール生成部１３の動作例を示したシーケンス図である。
まず、プロセス生成監視部１２は、システムのシャットダウン等の理由で終了指示があったかどうかを判定し(ステップ１０１)、終了指示があれば、処理を終了させ、終了指示がなければ、新規プロセスが生成されたかどうかを判定する(ステップ１０２)。
その結果、新規プロセスが生成されていないと判定されれば、ステップ１０１に戻るが、新規プロセスが生成されたと判定されれば、監視モジュール生成部１３に対し、新規プロセスの生成通知を送信する(ステップ１０３)。
これにより、監視モジュール生成部１３は、新規プロセスの生成通知を受信する(ステップ１０４)。そして、監視モジュールの注入処理を行う(ステップ１０５)。
【００３０】
この監視モジュールの注入処理において、本実施の形態では、メモリ上にロードされたフック対象ＡＰＩの実行コードの先頭を、任意のアドレスへジャンプするコードに書き換え、ジャンプ先にある代替処理を実行させる方式(Detours hook)を利用する。
次に、このときの動作について説明する。
図４は、監視モジュール生成部１３による監視モジュール注入処理の動作例を示したフローチャートである。
まず、監視モジュール生成部１３は、ＤＬＬをメモリにロードする(ステップ２０１)。次に、代替処理のアドレスを取得する(ステップ２０２)。ここで、代替処理とは、IsDebuggerPresent APIのようにBeingDebuggedフラグを参照してデバッグされているかどうかを真偽値で返すのではなく、常に真(デバッグされている)を返す処理である。そして、監視モジュール生成部１３は、フック対象ＡＰＩの実行コードの先頭を、ステップ２０２で取得したアドレスへジャンプするコードに書き換える(ステップ２０３)。
【００３１】
尚、本実施の形態で採用したドライバとサービスアプリケーションを用いる構成は、一般的なウイルス対策ソフトウェアと同様である。しかしながら、悪性プログラム自身の耐解析機能を逆用して、その活動を抑制するという手法は、悪性プログラムの動作パターンを解析し、検出した後に動作停止させるという従来ウイルス対策ソフトウェアとは異なる。現在主流のウイルス検知手法であるシグネチャ方式では対応しきれない多数の亜種が存在する悪性プログラムに対しても、活動抑制の可能性が期待できる。
【００３２】
ところで、本実施の形態では、上記のようなＡＰＩフックの手法を採用したが、通常のＷｉｎｄｏｗｓ３２ネイティブプログラムに対してＡＰＩの呼び出しをフックし、その処理を変更する手法としては、この他にも幾つかの手法がある。
一般的によく使われる手法に、次のようなものがある。即ち、ＤＬＬにフック対象ＡＰＩの処理を置き換えるコードとSetWindowsHookEx APIを用いたメッセージフックを行うコードとを実装する。そして、フックを制御(開始・終了)する別の実行プログラムを作成し、そのプログラムからＡＰＩフックを行いたい対象プロセスのスレッドＩＤを指定して、ＤＬＬのメッセージフックを行う関数の呼び出しを行う。これにより、対象プロセスに置き換えたいコードを実装したＤＬＬがロードされる。ＤＬＬの初期化ルーチンでは、対象プロセスのプロセスメモリ上にあるインポートセクションのＩＡＴ(Import Address Table)に格納される正規のＡＰＩの実行アドレスをロードさせたライブラリにある関数のアドレスに書き換える手法(IAT API Hooking)で行われることが多い。しかし、この方法では、悪性プログラムに対してＡＰＩフックを行う場合に２つの問題点が考えられる。
【００３３】
(１) ＤＬＬをロードさせる段階での問題
SetWindowsHookEx APIを用いるメッセージフックでは、対象プログラムによって最初にウィンドウメッセージが処理されるタイミングでフックが開始される。従って、プログラムの開始直後にあるデバッガ検知やＧＵＩを持たないコンソールプログラム(通常起動しただけではウィンドウメッセージが発生しない)では、ＡＰＩ呼び出しをフックすることができない。一般的に悪性プログラムはＧＵＩを持つことはあまり無く、またデバッガ検知もプログラム開始直後に行われることが多いため、この手法では効果が得られないと考えられる。更に、悪性プログラムが実行されるタイミングは予測不能であるので、実用的なシステムとして機能させるには、システムに常駐しプロセス生成を監視するプログラムが必要になる。
【００３４】
(２) ＩＡＴの書き換えによるＡＰＩフックの実行の問題
パッカー等のツールにより難読化、圧縮が施された悪性プログラムは、通常のプログラムと異なりインポートセクションにＩＡＴが無く、ＡＰＩのアドレスを動的に取得するものが存在することを分析により確認している。このような悪性プログラムには、ＩＡＴの書き換えによるＡＰＩフックを行うことができない。
【００３５】
そこで、本実施の形態では、上記(１)の問題点を解決する方法として、カーネルモードで動作するデバイスドライバとしてのプロセス生成監視部１２を設け、これによってプロセス生成を監視する構成を採用した。
また、上記(２)の問題点を解決する方法として、ＩＡＴの書き換えによるＡＰＩフックではなく、メモリ上にロードされたフック対象ＡＰＩの実行コードの先頭を任意のアドレスへジャンプするコードに書き換え、ジャンプ先にある代替処理を実行する構成を採用した。
【００３６】
以上述べた実装の評価を、Telecom-ISAC Japanが中心となって運用しているハニーポットSuper-Honeyによって2005年4月から2006年5月までに収集された悪性プログラムの検体を用いて実施したので、以下、この評価の内容について説明する。
まず、評価方法であるが、ドライバ、サービスアプリケーション、ＤＬＬから構成されたデバッガ検知逆用システムをＶＭｗａｒｅ上のＧｕｅｓｔＯＳとなるＷｉｎｄｏｗｓ ＸＰ ＳＰ１上にインストールし、その環境内で悪性プログラムの検体を実行することで有効性を評価した。評価に用いた悪性プログラムの検体は、ハニーポットSuper-Honeyで収集されたハッシュ値の異なる17,257種類である。
有効性の判断は、検体プログラムを実行した結果、指定時間以内にプロセスが終了するかどうか、及び、その終了理由から行った。今回の評価では、１０秒間の待機時間を設定した。具体的には、下記の機能(１),(２)を用いて、実行後１０秒以内に検体プロセスが終了するかどうかと、１０秒以内に終了したプロセスのログファイルを分析し、IsDebuggerPresent APIの後にExitProcess APIを呼び出し終了している検体に対して、本実施の形態の方法が有効であると判断した。
・機能(１)：ＤＬＬにログ出力処理を実装し、ＤＬＬのロード、デバッガ検知のためのIsDebuggerPresent APIのフックの記録を残す。
・機能(２)：通常のプログラムが終了時に呼び出すExitProcess APIをフックしてプロセスの終了に関する情報を記録する。
図５に、本実施の形態の手法が有効であると判断したログ出力例を示す。
【００３７】
尚、この評価を行ったときの動作環境は、次の通りである。
・ネットワーク接続は行わない状態とする(ＶＭｗａｒｅでネットワークインターフェイスを未接続とする)。
・実行されたプログラムがＶＭｗａｒｅ環境内で実行されたことを検知不可にするパッチは適用しない。
・悪性プログラムを１つ実行する毎に、ＶＭｗａｒｅのスナップショット機能を用いてクリーンな環境に戻す。
【００３８】
また、評価結果は、次の通りである。
(１) 捕捉数上位の検体を対象とした場合
インターネット上の脆弱なホストに感染している可能性の高い悪性プログラムへの有効性を評価するため、ハニーポットでの捕捉数が多い上位８９番目までの検体を対象とした評価結果は次の通りである。
・３７％にあたる３３種が１０秒以内に終了した。
・IsDebuggerPresent APIを呼び出して終了した検体は無かった。
(２) 全ての捕捉検体を対象とした場合
ハニーポットで捕捉された全ての検体17,257種類に対する評価結果は、次の通りである。
まず、検体実行結果を以下の表に示す。
【００３９】
【表２】
2008176352.tif 000004
【００４０】
また、１０秒以内に終了した検体の終了理由の内訳を以下の表に示す。
【００４１】
【表３】
2008176352.tif 000005
【００４２】
・約３７％にあたる6,378種類が単体で実行可能なファイルであり、残りの10,879種類(全体の約６３％)はdllやsysファイルといったexe形式でない実行ファイルであった。
・単体で実行できた6,378種類のうち１０秒以内に終了した検体は1,320種類存在したが、3,341種類の検体は１０秒経過してもプロセスが終了しなかった。
・１０秒以内に終了した検体のうち、IsDebuggerPresent APIの呼び出しの後にExitProcess APIを呼び出して終了した検体は１０１種類存在した。
【００４３】
発明者らは、以上述べたような評価結果を踏まえ、次のような考察を行った。
まず、捕捉数上位８９番目までの検体を対象とした評価実験から、感染率の高い悪性プログラムは、複数の耐解析機能が実装されている可能性が極めて高いことが類推できる。
また、全ての捕捉検体を対象とした評価実験において、dllやsysファイルといったexe形式でない実行ファイル10,879種類(全体の約６３％)の存在は、ハニーポットSuper-Honeyが実行形式のファイルだけではなく、悪性プログラムが自身の部品として利用しているファイルも収集する機能を保有していることに起因する。従って、評価にあたっては、単体で実行できた6,378種類(捕捉総数の約３７％)を母数として考察を行なう。
3,341種類(実行可能検体総数の約５２％)の検体は１０秒経過してもプロセスが終了せず、明らかに効果が無かったといえるが、１０秒以内に終了した検体のうち、IsDebuggerPresent APIの呼び出しの後にExitProcess APIを呼び出して終了した検体は１０１種類(実行可能検体総数の約１．６％)存在し、本実施の形態の手法が有効であると判断できる。更に、この１０１種類の検体について、ウイルス対策ソフトウェアによる検知名を調査したところ、図６に示す結果が得られたことから、この手法が機能したのは実行可能検体総数の約１．６％で数値そのものは低いが、亜種の非常に多いＲＢＯＴ、ＳＰＹＢＯＴ、ＳＤＢＯＴ系に対して本手法が有効であった意義は大きいと考える。次に、実行可能であった検体のうち約２０％にあたる1,320種類がプロセス開始から１０秒以内に終了しているという結果から、ＶＭｗａｒｅ等の仮想環境の検知やネットワーク接続状態を検知し、動作を終了していることが考えられ、今回利用したIsDebuggerPresent API以外の耐解析機能を逆用することで、実行可能な悪性プログラムの１０〜２０％に対して活動抑制の効果を期待できるのではないかと思われる。
【００４４】
そこで、次に、IsDebuggerPresent API以外の耐解析機能を逆用する方法について述べる。
Ａ−２．ブレークポイントの検出
この場合、テキストセグメント上のアドレスのうち、悪性プログラムが有するブレークポイント検出ルーチンが読み取ると思われるアドレスに対し、そのアドレスのデータをメモリパッチングでＩＮＴ３命令(0xCC)に書き換える。これにより、ブレークポイントが設定された状態となるので、テキストセグメント上の自身の実行コードをスキャンする悪性プログラムに対して、デバッグされているとみせかけることができる。
【００４５】
Ａ−３．ＳｏｆｔＩＣＥの検出
この場合、CreateFile APIをフックし、その第一引数が“\\.\NTICE”であった場合、戻り値を0xFFFFFFFF(INVALID_HANDLE_VALUE)以外に設定することで、ＳｏｆｔＩＣＥでデバッグされているとみせかける。具体的には、CreateFile APIの第一引数が“\\.\NTICE”であれば0xFFFFFFFF以外の値を返す代替処理を予め用意しておき、CreateFile APIの実行コードの先頭を、この代替処理のアドレスへジャンプするコードに書き換える。
ここで、CreateFile APIは、指定されたファイルが有るかどうかを示す情報を返すＡＰＩの一例と考えることができる。
【００４６】
Ａ−４．実行時間の計測
GetTickCount APIをフックし以下のこと行う。
GetTickCount APIが呼ばれた際、得られた値を記憶する。そして、次に GetTickCountが呼び出された際、得られた値と記憶値(前回の結果)を比較し、差分が５０００以上となる値を戻り値として設定することでデバッガによるステップ実行にみせかける。尚、５０００という値はＡｇｏｂｏｔのソース分析によって得られた基準値である。具体的には、GetTickCount APIが前回返した値を参照し、これとの差分が５０００以上となる値を返す代替処理を予め用意しておき、GetTickCount APIの実行コードの先頭を、この代替処理のアドレスへジャンプするコードに書き換える。
ここで、GetTickCount APIは、時間に関する値を返すＡＰＩの一例と考えることができる。
尚、上記では、デバッガの検知に関する耐解析機能として、Ａ−１〜４のみを示したが、これ以外の耐解析機能を逆用し、解析されているとみせかける処理を施してもよい。
【００４７】
更に、仮想環境の検知を誤認させる場合について述べる。ここでは、ＭＡＣアドレスとレジストリの偽造を行うことによって誤認させる。
Ｂ−１．ＶＭｗａｒｅの場合
ＭＡＣアドレスの上位３バイトを00-0c-29に変更する。そして、ＶＭｗａｒｅ のインストールによって追加される設定データ(例えば、レジストリキー)を追加する。
Ｂ−２．Ｖｉｒｔｕａｌ ＰＣの場合
ＭＡＣアドレスの上位３バイトを00-03-FFに変更する。そして、Ｖｉｒｔｕａｌ ＰＣ のインストールによって追加される設定データ(例えば、レジストリキー)を追加する。
【００４８】
尚、本実施の形態では、悪性プログラムを対象として、自身が解析されていると誤認させることで活動を抑制することについて述べた。しかしながら、「悪性」かどうかに関わらず、自身が解析されていることを認識すると自プロセスを終了する機能を有する如何なるプログラムに対しても、本手法は適用可能である。
【００４９】
以上述べたように、本実施の形態では、自身が解析されていると認識することで自プロセスを終了させる機能を有する特定プログラムに対し、その機能を逆用し、解析されていると誤認させるようにした。これにより、その活動を抑制することが可能となった。
【図面の簡単な説明】
【００５０】
【図１】本実施の形態が適用されるコンピュータのハードウェア構成図である。
【図２】本実施の形態におけるコンピュータのソフトウェア構成を示した図である。
【図３】本実施の形態におけるプロセス生成監視部及び監視モジュール生成部の動作例を示したシーケンス図である。
【図４】本実施の形態における監視モジュール生成部による監視モジュール注入処理の動作を示したフローチャートである。
【図５】本実施の形態の評価において、手法が有効であると判断したログ出力例である。
【図６】本実施の形態の評価において、手法が有効であると判断した検体をウイルス対策ソフトウェアで調査した結果である。
【符号の説明】
【００５１】
１０…コンピュータ、１１…カーネルセグメント、１２…プロセス生成監視部、１３…監視モジュール生成部、１４ａ〜１４ｄ…プロセス、１５ａ〜１５ｄ…監視モジュール
【図１】
2008176352.tif 000006
【図２】
2008176352.tif 000007
【図３】
2008176352.tif 000008
【図４】
2008176352.tif 000009
【図５】
2008176352.tif 000010
【図６】
2008176352.tif 000011