【文献】
松木 隆宏,セキュリティ無効化攻撃を利用したマルウェアの検知と活動抑止手法の提案,情報処理学会論文誌 論文誌ジャーナル[CD−ROM],日本,社団法人情報処理学会,2009年 9月15日,Vol.50,No.9,2127〜2136頁
【文献】
ウイルス ブレティン 日本語版 Vol.2,NETWORK WORLD,日本,株式会社IDGジャパン,2003年10月 1日,第8巻,第10号,155頁
(58)【調査した分野】(Int.Cl.,DB名)
【発明を実施するための形態】
【0018】
[情報処理装置]
本発明が適用される一般的な情報処理装置及びその動作について
図1乃至
図3を用いて説明する。
【0019】
図1は一般的な情報処理装置を示すブロック図である。
【0020】
標準的なスタンドアロン環境における情報処理装置10は、コンピューター(PC)20と、外部周辺装置30とから構成されている。
【0021】
コンピューター(PC)20は、命令を実行するCPU21と、データおよびプログラムを格納するハードディスク22と、データやプログラムをCPU21が読み込むためのメモリー23と、ユーザーの操作を受け付けるマウスやキーボードのような入出力装置24と、操作内容や処理結果等を表示するディスプレイ25等から構成されている。
【0022】
外部周辺装置30は、処理結果等を印刷するためのプリンター31や、USBメモリー等の外部記憶装置32等から構成されている。
【0023】
次に、
図2及び
図3を用いて、コンピュータープログラム、すなわち、コンピューターに行わせる処理の手順を決められた形式(プログラム言語)に従って書き表したものを実行させる場合の一連の動作について、コンピューター20におけるCPU21、ハードディスク22、メモリー23等のハードウェアとの関連で説明する。
【0024】
コンピューター20が起動する前は、オペレーションソフトウェア(OS)のプログラムやデータを含むOSデータと、コンピューター20で実行させるプログラムと、文書、図面等のユーザーデータ等がファイルとしてハードディスク22に格納されている(
図2(a))。メモリー23にはプログラムやデータ等は展開されていない。
【0025】
コンピューター20が起動して、CPU21が、ハードディスク22に格納されたOSデータをメモリー23にロードする命令を実行すると、OSデータがメモリー23上にプロセスとして展開される(
図2(b))。
【0026】
次に、CPU21がメモリー23上のOSデータのプロセスを実行して、ハードディスク22に格納されたプログラムにアクセスして、そのプログラムを読み込む(
図2(c))。ハードディスク22に格納されたプログラムはメモリー23にロードされ、メモリー23上にプロセスとして展開される(
図3(a))。
【0027】
次に、CPU21がメモリー23上のプログラムのプロセスを実行して、ハードディスク22に格納されたユーザーデータにアクセスして、ハードディスク22へのデータの読み書きを行う(
図3(b))。
【0028】
このように、オペレーションソフトウエアやプログラムにより、CPU21、ハードディスク22、メモリー23との間での動作が行われる。
【0029】
[発明の原理]
本発明の原理について説明する。
【0030】
近年、マルウェアを利用する攻撃者の目的は大多数が金銭や機密情報の搾取であり、これらの攻撃では組織的に開発されたマルウェア作成ツールが利用されている場合が多い。
【0031】
本願発明者等は、こういったツールで作成されたマルウェアの多くは、マルウェアの多重起動による処理の競合や予期せぬ動作停止等を予防するため、多重起動状態を認識して自身の動作を停止する機能や、自身が解析環境上で動作していることを検知した場合、動作を停止しマルウェア解析側に対して素性を隠すような動作を持つという機能を有していることに気がついた。
【0032】
プログラムが多重起動状態を認識するために、マイクロソフトのオペレーティングシステムであるマイクロソフトウィンドウズ(Microsoft Windows:登録商標)にはミューテックス(Mutex)と呼ばれる機能が用意されている。OSのシステムには起動したプログラムの名前であるミューテックス値が登録される。
【0033】
ミューテックスの原理について
図4の概念図を用いて説明する。
【0034】
図4(a)の場合には、オペレーティングシステムに、Mutex001、Mutex002、Mutex003というミューテックス値が既に登録されている。
【0035】
この状態で、ミューテックス機能を使用するマルウェアAが起動すると、
図4(a)に示すように、Mutex004というミューテックス値を作成してオペレーティングシステムに登録しようとする。オペレーティングシステムにはMutex004というミューテックス値は登録されていないので、
図4(b)に示すように、Mutex004を登録に成功し、マルウェアAの動作が継続される。
【0036】
この状態で、ミューテックス機能を使用するマルウェアAが二重起動すると、
図4(c)に示すように、Mutex004というミューテックス値を作成してオペレーティングシステムに登録しようとする。オペレーティングシステムにはMutex004というミューテックス値は既に登録されているので、
図4(c)に示すように、Mutex004の登録に失敗し、マルウェアAの二重起動が阻止される。
【0037】
本発明ではこの機能を利用してマルウェアの動作を阻止する。本発明の原理について
図5の概念図を用いて説明する。
【0038】
図5(a)の場合には、オペレーティングシステムに、Mutex001、Mutex002、Mutex003というミューテックス値が既に登録されている。
【0039】
この状態で、本発明のプログラムを起動させ、
図5(a)に示すように、Mutex004というミューテックス値を作成してオペレーティングシステムに登録しようとする。オペレーティングシステムにはMutex004というミューテックス値は登録されていないので、
図5(b)に示すように、Mutex004を登録に成功し、本発明のプログラムはそのまま待機状態となる。
【0040】
この状態で、ミューテックス機能を使用するマルウェアAが起動しようとして、
図5(c)に示すように、Mutex004というミューテックス値を作成してオペレーティングシステムに登録しようとする。オペレーティングシステムにはMutex004というミューテックス値は既に登録されているので、
図5(c)に示すように、Mutex004の登録に失敗し、マルウェアAの起動が阻止される。
【0041】
なお、ミューテックスとは一般的にプロセスやスレッドが同時に一つしかリソースへアクセスできないようにするコンピューターにおける排他的制御の仕組みの一つであり、マルウェアではない通常のプログラムにおいても同様に多重起動を防止する用途等で利用されることがある。ただし、それら通常のウィンドウズのプログラムにおいては自身の複数起動を許可しているものも少なくなく、多重起動することで目的の不正動作を遂行しづらくなるマルウェアの方がよりこのミューテックスによる排他制御を多用する傾向にある。
【0042】
また、本願発明者等は、マルウェアには、オペレーティングシステムが解析環境上で動作しているかを検知し、解析環境上で動作している場合には、マルウェア自身の動作を停止させる機能を有するものがあることに気がついた。
【0043】
オペレーティングシステムが解析環境上で動作している状況の検知には、広く知られる解析ツールのプロセス名のリストをあらかじめマルウェアが保持しており、動作時にこのリストの内容と、システムで動作しているプロセス名を比較し、合致するものがあるかどうかを確認する。合致した場合にはマルウェアは動作を停止する。
【0044】
解析環境検知の原理について
図6を用いて説明する。
【0045】
オペレーティングシステムには動作中のプロセス名が登録されている。
図6では、notepad.exe、calc.exe、analyzer.exe、…が登録されている。このオペレーティングシステムでは、解析プログラムのプロセス名であるanalyzer.exeが登録されており、解析環境上にあることがわかる。
【0046】
この状態で、マルウェアBが起動すると、自身の動作環境が解析環境上にあるかを予め検知する。マルウェアBは、よく使われる調査ツールのプロセス名のリストを有している。
図6では、debugger.exe、analyzer.exe、monitor.exe、…等のプロセス名のリストを有している。マルウェアBは、自分が有しているリストと、現在オペレーティングシステムで動作中のプロセス名と順次照合し、合致する場合には解析環境上にあると判断し、自分の動作を停止させる。
図6では、リスト中のanalyzer.exeのプロセス名がシステムに登録されたプロセス名と合致したので、その段階で自分の動作を停止させている。
【0047】
本発明ではこの機能を利用してマルウェアの動作を阻止する。本発明の原理について
図7の概念図を用いて説明する。
【0048】
本発明のプログラムを起動し、予めよく使われる調査ツールのプロセス名をオペレーティングシステムに登録しておく。
図7では、debugger.exe、monitor.exe、analyzer.exe、…等のプロセス名のリストを登録する。
【0049】
この状態で、マルウェアBが起動すると、自身の動作環境が解析環境上にあるかを予め検知する。マルウェアBは、よく使われる調査ツールのプロセス名のリストを有している。
図7では、debugger.exe、analyzer.exe、monitor.exe、…等のプロセス名のリストを有している。マルウェアBは、自分が有しているリストと、現在オペレーティングシステムで動作中のプロセス名と順次照合し、合致する場合には解析環境上にあると判断し、自分の動作を停止させる。
図7では、リスト中のdebugger.exeのプロセス名がシステムに登録されたプロセス名と合致したので、その段階で自分の動作を停止させる。このようにしてマルウェアBの動作を停止させることができる。
【0050】
[第1実施形態]
本発明の第1実施形態によるプログラム、情報処理装置及び情報処理方法について
図8及び
図9を用いて説明する。
【0051】
本実施形態は、マルウェアに使用される既知のミューテックス値を使用するプログラムを常駐させておき、マルウェアの実行を阻止しようとするものである。
【0052】
本実施形態によるプログラム(本発明プログラム)は、マルウェアに使用される既知のミューテックス値をメモリー23内のミューテックス値リストに登録する命令CreateMutexを含んでいる。
【0053】
本発明プログラムは、
図2及び
図3におけるプログラムと同様に、ハードディスク22に格納されており、CPU21からの命令によりメモリー23に展開され、CPU21からの命令により実行される。
【0054】
本発明プログラムは、マルウェアが導入される危険性のある状態となる前であればいつ実行させてもよいが、スタートアッププログラムとして、コンピューター20の起動時に起動させておくことが望ましい。それによりコンピューター20を、起動直後から常にマルウェアから保護することができる。
【0055】
本発明プログラムにより登録するミューテックス値について説明する。
【0056】
既知のマルウェアに使用されるミューテックス値の多くは、インターネット上で公開されているマルウェアの解析情報の一部として掲載されている。例えば、オンラインバンキングマルウェアで使用されるZBOTと呼ばれるマルウェアは第一世代が「_AVIRA_2108」「_AVIRA_2109」「__SYSTEM__64AD0625__」のいずれかのミューテックス値を固定値で使用している。また、新種のマルウェアであってもマルウェア解析が実施された場合は、ほとんどのケースでミューテックス情報も各マルウェア対策ベンダー等から解析情報と併せて公開される。
【0057】
本発明プログラムでは、例えば、次に示すミューテックス値の全て又は任意のいずれかを登録する。
【0058】
25cbfc4f-Mutex、470a1245-Mutex、894133bf-Mutex、aMD6qt7lWb1N3TNBSe4N、b845ef76-Mutex、bcd8f464-Mutex、beta100-Mutex、bfbd401b-Mutex、DC_MUTEX-B2FTUQZ、e26f5077-Mutex、e621ca05-Mutex、e621ca05Mutex、e621ca05_0、f4448e25-Mutex、f5399233-Mutex、faebec4a-Mutex、fuckareyoulookin、IrcPeru-Mutex、KyUffThOkYwRRtg、lyhrsugiwwnvnn、Microsoft-Windows-LDAP32-Client、Prowin32Mutex、Rapid Antivirus_AppManager_server_mutex、s5rBKCUVfOF8JLVi、SPYNET、System1230123、t2f-Mutex、Windows Update System Verifier、wuqntwklyxwhac、xXxXxXXxXxxxxx02。
【0059】
セキュリティ対策として一般的に用いられるパターンファイルやハッシュ値に依存したマルウェア防御方法ではマルウェアのバイナリが少しでも変化すると対応できなくなる場合が多いが、ミューテックス値の場合は、複数の亜種(同一種類のマルウェア群)ではミューテックス値が同一である場合が多く、ひとつミューテックス値に対する処置で複数の未知のマルウェアに対する防御を行うことが可能となる。
【0060】
一般的なマルウェアを生成する際、最初から開発するケースはまれであり、流出したマルウェアのソースコードの改変や、マルウェアを自動生成するツールであるビルダー等を利用して作成されることが多い。そうした流出したソースコードや自動生成するツールではミューテックスが意図的に変更されるケースはあまり多くない。結果として、固定のミューテックス値を持つ複数のマルウェア、すなわち亜種のマルウェアが作り出されることになる。
【0061】
なお、ハッシュ値や一般的なパターンファイルがとらえるバイナリの特徴点は、バイナリが生成されるタイミングで必然的に変化してしまうため、一つの情報で複数を捉える事は困難となってしまう背景がある。
【0062】
これらの情報をあらかじめ収集して、既知のマルウェアのミューテックス値リストのデータベースを作成しておく。本発明プログラムでは、データベース化された既知のマルウェアのミューテックス値を生成して登録する。
【0063】
マルウェアのミューテックス値リストのデータベースは常に更新しておき本発明プログラムを起動したときに、データベースに登録された全てのミューテックス値を生成して登録することが望ましい。
【0064】
次に、本発明プログラムが実行された状態でマルウェアの実行が阻止される仕組みについて説明する。
【0065】
図8に示すように、メモリー23のオペレーティングシステムのデータ内の所定位置にミューテックス値リストの領域が設けられている。
図8では、ミューテックス値リストの領域に、AAAAA、BBBBB、CCCCC、…というミューテックス値が登録されている。登録されたミューテックス値は、データベース化された既知のマルウェアのミューテックス値である。
【0066】
この状態でマルウェアを実行しようとする場合の処理の一連の流れについて
図9を用いて説明する。
【0067】
まず、マルウェアの実行ファイルを起動すると、メモリー23上に実行ファイルのイメージデータが配置される(
図9(a))。
【0068】
次に、マルウェアが"EEEEEEEE"というミューテックス値をシステムに登録しようとした場合、メモリー23上にあるオペレーティングシステムのCreateMutex関数が"EEEEEEEE"という引数でCPU21を介してマルウェアから呼び出される(
図9(b))。
【0069】
次に、オペレーティングシステムは、CreateMutex関数が呼び出されると、メモリー23上に存在するミューテックスリストにアクセスし、引数として渡された"EEEEEEEE"というミューテックス値がミューテックスリスト中に存在するか否か確認する(
図9(c))。
【0070】
ミューテックスリスト中に"EEEEEEEE"というミューテックス値が存在する場合、オペレーティングシステムはCreateMutex関数の戻り値として、null値をマルウェアへ返答する(
図9(d))。
【0071】
マルウェアは、関数の戻り値がnull値であることを確認することで、CreateMutex関数によるミューテックス登録が失敗したこと、すなわち、自分と同じマルウェアのプロセスや、自分の複製のプロセスがオペレーティングシステム上で起動していることを認識する。そのことを認識すると、マルウェアはその後の処理を自ら停止する。それにより、マルウェアの不正な動作を阻止することができる。
【0072】
ミューテックスリスト中に"EEEEEEEE"というミューテックス値が存在しない場合には、オペレーティングシステムは渡された"EEEEEEEE"という値をミューテックスリストに追加したのち、CreateMutex関数の戻り値としてnull値以外の値をマルウェアへ返答する(
図9(e))。
【0073】
マルウェアは、関数の戻り値がnull値ではないことを確認することで、CreateMutex関数によるミューテックス登録が成功したこと、すなわち、自分と同じマルウェアのプロセスや、自分の複製のプロセスがオペレーティングシステム上で起動してないことを認識する。そのことが認識できると、その後のマルウェアの処理を継続する。この場合にはマルウェアの実行を阻止できない。
【0074】
[第2実施形態]
本発明の第2実施形態によるプログラム、情報処理装置及び情報処理方法について
図10乃至
図21を用いて説明する。
【0075】
本実施形態は、マルウェアが使用するミューテックス値が不明であっても、マルウェアがミューテックス値を作成しようする関数の実行をフックして横取りして、事前にミューテックス値リストに登録しておくことで、マルウェアの実行を阻止しようとするものである。
【0076】
本発明プログラムは、マルウェアが導入される危険性のある状態となる前であればいつ実行させてもよいが、スタートアッププログラムとして、コンピューター20の起動時に起動させておくことが望ましい。それにより、起動直後から常に、コンピューター20をマルウェアから保護することができる。
【0077】
図10に、コンピューター20が起動した直後のメモリー23の状態を示す。メモリー23には、オペレーティングシステムと共に本発明プログラムや他のスタートアッププログラムが展開され配置されている。
【0078】
本発明プログラムは、まず、自身が起動した後に起動する全てのプロセスの情報を確認し、不審なプログラムのプロセスでないかを判断する。なお、以降の説明では、そのような不審なプログラムのことを便宜上「マルウェア」又は「不審プログラム」と称して説明する。
【0079】
マルウェアが起動すると、
図11に示すように、メモリー23上に、オペレーティングシステム、本発明プログラム、他のスタートアッププログラムと共に、マルウェアが展開されてマルウェアのプロセス動作が開始される。
【0080】
次に、本発明プログラムは、
図12に示すように、メモリー23上に展開されたマルウェアのプロセスの情報を取得し、ハードディスク22に格納されたマルウェアの実行ファイルを確認し、不審なプログラムであるか否かを判断する。
【0081】
そのような判断基準の具体例として例えば次のようなものがある。
(a)正常なデジタル署名が付与されているか否かを判断する。
(b)開発元などのプロパティ情報が存在するか否かを判断する。
(c)ユーザーにより設定された除外リストに適合しているか否かを判断する。
(d)プロセスの実行ファイルがアイコン偽装を行っているか否かを判断する。
(e)拡張子が偽装されているか否かを判断する。
(f)既知の不正な情報をファイル内部に保有しているか否かを判断する。
(g)ユーザーの一時領域から実行されているか否かを判断する。
(h)OSの自動起動エントリーに登録されているか否かを判断する。
(i)既知の不正および不正ではないハッシュ値に属しているか否かを判断する。
【0082】
このような判断基準で不審であると認定されると、そのプログラムがミューテックス値を作成しようする関数の実行をフックして横取りして、事前にミューテックス値リストに登録しておくことで、そのプログラムの実行を阻止する。
【0083】
ウインドウズプログラムは起動するとそれぞれのプロセス空間(メモリ空間)と呼ばれる仮想メモリー上に配置される。それぞれのプロセス空間にはIAT(ImportAddressTable)という項目があり、IATにはプログラムが使用する関数の一覧とそれに応じたメモリアドレスが記録されている。これは、プログラムが動作する際にどういった関数がどのアドレスに読み込まれているかをオペレーティングシステムが把握するための情報である。
【0084】
図13は、メモリー23上に展開されたマルウェアのプロセス空間のメモリー番地45000000にCreateMutexという関数が配置されている状態を示している。
【0085】
この状態においてフック制御を行う方法の詳細について説明する。
【0086】
まず、マルウェアのプロセス空間に偽のCreateMutex関数、例えば、FakeCreateMutex関数を埋め込む。
【0087】
自分以外の他のプロセス空間にコードを注入するためには、そのプロセスのメモリー空間において、VirtualAllocEx関数というWindowsAPIを利用し、まだ使用されていない領域に一定サイズのメモリー領域を確保する(
図14参照)。
【0088】
次に、確保したメモリー領域にWriteProcessMemoryというWindowsAPIを利用し、実行させたいコード、すなわち、FakeCreateMutex関数本体と、そのFakeCreateMutex関数をマルウェアのIATへ組み込むための関数Aとを書き込む(
図15参照)。なお、確保したメモリー領域の具体的なアドレスはVirtualAllocExの戻り値を確認することで取得することができる。
【0089】
次に、書き込んだコード(関数A)を実行させるためにCreateRemoteThreadというWindowsAPIを呼び出すことにより、その任意のコードをマルウェアのプロセス空間上で実行させる(
図16参照)。ここで、不審プログラムのプロセス空間のみに注目すると、
図17のようになる。
【0090】
次に、CreateRemoteThreadにより、関数Aが実行されると、不審プログラムのプロセス空間のIATにおける、正規のCreateMutex関数のアドレス、例えば45000000番地を、偽のFakeCreateMutex関数のアドレス、例えば、48500000番地へと書き換える(
図18(a)、(b)参照)。これでフックの事前処理が行えたこととなる。
【0091】
なお、どの関数がどのアドレスに展開されているか、すなわち、IATにあるその関数に対応するアドレスを知るには、GetProcAddressというWindowsAPIの引数に関数名を渡すことで、指定した関数がプロセス空間のどのアドレスに対応づけられているのか知ることができる。
【0092】
次に、不審プログラムが、例えば"MAL123"というミューテックス名をシステムに登録しようとしたとする。その場合、CreateMutex関数が呼び出されると、システムはマルウェアのIATを参照した結果、正規のCreateMutex関数ではなく、予め用意しておいた偽のFakeCreateMutex関数に"MAL123"というパラメータを渡すことになる(
図19参照)。
【0093】
次に、FakeCreateMutex関数の内部では、本発明プログラムへ、「不審プログラムが"MAL123"という名前のミューテックスを作成しようとしている」という情報を渡す処理を行う。その情報を受け取った本発明プログラムは、不審プログラムよりも先にミューテックスを登録することが可能となる(
図20参照)。
【0094】
この時点で、まだ、不審プログラムは常駐してはいないが、不審プログラムが常駐する際に登録されるミューテックスはシステムに登録されている、という状態になる。
【0095】
また、不審プログラムのCreateMutex関数の呼び出し元に対しては、呼び出した結果、関数が失敗した、つまり、すでに"MAL123"というミューテックスがシステムに登録されていたという結果を返すことで、不審プログラムに偽りの情報を渡すことが可能となり、結果として、その後の動作継続を妨げることが可能となる(
図20参照)。
【0096】
なお、
図20に示す処理は、結果的に、次の
図21に示す処理と同等となり、本発明プログラムは常に失敗という値を返すこととなる。
【0097】
このようにして、本実施形態は、マルウェアが使用するミューテックス値が不明であっても、マルウェアがミューテックス値を作成しようする関数の実行をフックして横取りして、事前にミューテックス値リストに登録しておくことで、マルウェアの実行を阻止することができる。
【0098】
[第3実施形態]
本発明の第2実施形態によるプログラム、情報処理装置及び情報処理方法について
図22乃至
図29を用いて説明する。
【0099】
本実施形態は、よく使われる調査ツールのプロセス名をオペレーティングシステムに予め登録しておき、マルウェアが解析環境上にあると判断すると自分の動作を停止させるという機能を利用して、マルウェアの実行を阻止しようとするものである。
【0100】
解析環境上で動作している状況の実現のためには、広く知られる解析ツールのプロセス名を持つプロセスをあらかじめコンピューター20上で動作させておくことで解決する。このプロセスは実際の解析ツールのプロセスである必要はなく、プロセス名が解析ツールと同一であれば実態はなんでもよく、コンピューター20への負荷の少ないプロセスであることが望ましい。
【0101】
マルウェアが解析環境であることを検知するために存在確認を行う解析ツールのプロセス名としては、例えば、ネットワーク調査ツールであるWireShark(プロセス名:Wireshark.exe)、動的解析ツールであるOllyDbg(プロセス名:ollydbg.exe)、プロセス監視ツールであるProcess Monitor(プロセス名:procmon.exe)、静的解析ツールであるIDA Pro(プロセス名:idaq.exe)、プロセス管理ツールであるProcess Explorer(プロセス名:procexp.exe)等がある。
【0102】
本実施形態では、例えば、次に示すプロセス名の全て又は任意のいずれかを動作させておく。
【0103】
360Tray.exe、ashWebSv.exe、avcenter.exe、avguard.exe、avp.exe、ccSvcHst.exe、ekrn.exe、idag.exe、idaq.exe、idaq64.exe、ImmunityDebugger.exe、InstallRite.exe、kissvc.exe、Mcshield.exe、NTRTSCAN.exe、ollydbg.exe、outpost.exe、ProccessHacker.exe、Regshot.exe、SbieCtrl.exe、Smc.exe、tcpdump.exe、tcpview.exe、tmproxy.exe、VBoxService.exe、VBoxTray.exe、vmtoolsd.exe、VPTray.exe、windbg.exe、wireshark.exe。
【0104】
なお、本発明プログラムの実行により正常なプログラムへの影響はほとんどないと想定される。例外的に、一部PCゲーム等解析を検知すると動作しないものも考えられるが、その場合は、予め、除外リストへ検知から除外したいファイルやフォルダを設定しておくことで、そうした正常なPC操作上の不都合を回避することが可能である。
【0105】
マルウェアの中には、リストと合致した場合、自身の動作を停止するのではなく、合致した解析ツールのプロセスを停止させるものがある。このようなマルウェアに対しては、あらかじめマルウェアのコードが配置されたメモリー23内の、プロセスを停止させる関数、TerminateProcess等をフックしておき、解析ツールを終了しようとする場合には自身の動作を停止させるように変更する。すなわち、マルウェアが呼び出したTerminateProcessの引数が開発ツールのプロセスを示していた場合、その引数をマルウェア自身のプロセス情報に変更する。
【0106】
プロセスを停止させる関数をフックする処理については、第2実施形態におけるCreateMutex関数のフックと同様に行えばよい。
【0107】
本実施形態では、次のようにして、任意のプロセス名を持つプロセスを起動する。
【0108】
例えば、"OllyDbg.exe"という名前のプロセスを起動したい場合、本発明プログラム"MyProgram.exe"は一時領域に自身の実行ファイルのコピーを"OllyDbg.exe"というファイル名で作成し、その実行ファイルを起動させる。
【0109】
これにより、オペレーティングシステム上には、本発明プログラムのプロセス"MyProgram.exe"という親プロセスと"OllyDbg.exe"("MyProgram.exe"のコピー)という子プロセスが2つ起動していることになる。起動しているプロセスの親子関係をあまり意識しないタスクマネージャーなどの他のプロセスから見ると、システムのプロセスリストにはそれぞれのプロセスが独立して起動しているように見える(
図22参照)。
【0110】
この動作、すなわち、自身のコピーを任意のファイル名に変更して起動させる動作を繰り返すことにより、複数の任意のプロセスを一斉に起動することとなる(
図23参照)。そのときのウインドウズシステムの状態は
図24に示すようになる。
【0111】
繰り返しコピーを作成しそれを利用して複数のプロセスを起動する上記の操作を行った際、一時領域フォルダ内に各プロセス名と同一の実行ファイル、すなわち、実行ファイル"MyProgram.exe"のコピー、が起動したプロセスの数だけ複数存在している状態となる。この状態でプロセス"MyProgram.exe"のみが終了してしまうと、残りのプロセスが孤立して起動することなり、作成した複数の実行ファイル、すなわち、実行ファイル"MyProgram.exe"のコピーがハードディスク22上に残留してしまうことになり、ウインドウズシステムへの負荷を残すこととなる。
【0112】
本発明プログラムでは、そうした事態を避けるため、プロセス"MyProgram.exe"が終了した場合、作成した複数の実行ファイル、すなわち、実行ファイル"MyProgram.exe"のコピーおよびそのプロセスは不必要となるため、次のようにして全ての関連子プロセスも併せて終了し、実行ファイルも削除されるようにしている。その動作の詳細について説明する。
【0113】
作成された子プロセス、すなわち"OllyDbg.exs"、"Wireshark.exe"等は常時自身の親プロセスが起動しているかどうかを監視する(
図25参照)。
【0114】
子プロセスが親プロセスを監視する具体的な方法として次のようなものがある。
【0115】
まず、親プロセスが自身のコピーである子プロセスを起動させる際、自身(親)のプロセスIDを実行引数として渡した状態で子プロセスを呼び出す。次に、呼び出された側のプロセスは自身がプロセスIDを実行引数に付与された状態で起動したと判断すると、自身が「子」であり、引数のプロセスIDを持つプロセスが「親」であるというプロセスの親子関係を把握することができる。
【0116】
プロセスIDがわかれば、WindowsAPIであるCreateToolhelp32SnapShot 関数、Process32First関数、Process32Next関数を組み合わせることで、指定したプロセスIDを持つプロセスが現在起動しているかどうかを判断することができる。
【0117】
親プロセスが終了していると判断した場合、子プロセスは自身を終了して削除する動作を行う。
【0118】
プロセスが起動している最中は、そのプロセスの実体となる実行ファイルを削除することはオペレーティングシステムにおいて基本的に不可能である。つまり、実体である実行ファイルを削除するにはそのプロセスを終了させなければならない。このため、自分自身の実行ファイルを削除してプロセスを終了する動作、またはその逆の動作は、プログラム単体で実現することは不可能である。
【0119】
そのため、次のようにして、実質的に、自分自身のプロセス終了およびその実体である実行ファイルの削除を行う。
【0120】
例えば、実行ファイル名およびそのプロセスが"AAAAA.exe"であると仮定すると、プロセスAAAAA.exeは、一時的に削除用のバッチファイル(Batch File)を作成する。そのバッチファイルには、AAAAA.exeというプロセスがいなくなるまでスリープを繰り返し、AAAAA.exeというプロセスがいなくなったら、実行ファイルAAAAA.exeを削除する、という命令コードを記載する。
【0121】
バッチファイルを呼び出したプロセスAAAAA.exeは、その後自身のプロセスを終了させる。すると、AAAAA.exeのプロセスが存在しなくなった状態を確認したバッチファイルが、プロセスAAAAA.exeの実体である実行ファイルAAAAA.exeを削除する(
図26参照)。
【0122】
次に、バッチファイルは、自分自身であるバッチファイルを削除するために、DELコマンドで自身を削除するコマンドをコマンドプロンプトに渡して実行させバッチファイル自身を終了させる。その後、コマンドプロンプトはバッチファイルをDELコマンドで削除した後、終了する(
図27参照)。コマンドプロンプトは渡された処理が全て終了すると自身(コマンドプロンプト自身のプロセス)を終了する動作があるため、それを利用する。
【0123】
以上が、プログラムが自分自身を終了&削除する方法となるが、この方法を起動した全ての子プロセスが同時に行う。
【0124】
このようにして"MyProgram.exe"が終了すると、そのコピーである各プロセスおよびその実体であるファイルが削除され、"MyProgram.exe"が起動する前の環境状態にすることができる。
【0125】
また、本発明プログラムでは、マルウェアの攻撃検知機能も機能のひとつとして搭載している。
【0126】
一般的にマルウェアは、解析ツールやマルウェア対策製品のプロセスが起動していると判断した場合、その多くが自身を終了する動作を行う。その一方で、自身を終了するのではなく、相手側を終了させようと試みるタイプのマルウェアも存在する。何か解析ツールのプロセスが起動していた場合は、その解析ツールを終了させることでユーザーの操作を妨害し、自分が解析されることを妨害するものがある。
【0127】
本発明プログラムでは、自身の子プロセスが終了されていないかどうかを親プロセスが監視することで、その攻撃を検知する(
図28参照)。
【0128】
マルウェアが、例えば、"WireShark.exe"を強制終了した場合、本発明プログラムは自身の子プロセスがひとつ存在しなくなったため、マルウェアによって強制終了されたと判断する(
図29(a)〜(c)参照)。
【0129】
プログラムがプロセスの強制終了を行う場合は、通常TerminateProcessというWindowsAPIを呼び出すことで実現している。ウィンドウズに標準搭載されているタスクマネージャーというプログラムでプロセスを強制終了させた場合も"TerminateProcess"が呼び出される。
【0130】
ユーザーが誤ってタスクマネージャーからユーザー操作で子プロセスを終了した場合、マルウェアの攻撃により子プロセスを終了されたと誤検知する可能性がある。そのため、本発明プログラムはその誤検知が起こらないようにしている。
【0131】
一般的なプロセスが、TerminateProcess関数により他のプロセスの強制終了を行う場合には、以下の手順となる。
【0132】
OpenProcessというWindowsAPIの関数に対し、強制終了させたいプロセスのプロセスIDを第三引数に、第一引数に「PROCESS_TERMINATE」というアクセス権を割り当てた状態で開く。この引数を渡した状態でOpenProcess関数の呼び出しに成功すると、それは与えられたアクセス権、ここではPROCESS_TERMINATE、つまり強制終了の権限でプロセスを扱う権利を得たという意味になる。
【0133】
次に、上記のOpenProcessが成功すると、戻り値でプロセスハンドル(プロセスを取り扱うオブジェクト)が応答されるため、そのプロセスハンドルをTerminateProcessの引数として渡すことで、該当のプロセスを強制終了させることが可能となる。
【0134】
つまり、OpenProcess関数により「PROCESS_TERMINATE」というアクセス権で自身のプロセスが開かれる事を失敗させることができれば、他のプログラムからの強制終了(TerminateProcessの呼び出し)を結果的に失敗させることが可能となる。
【0135】
指定したアクセス権によるOpenProcessを失敗させるには、TerminateProcessからの強制終了から守りたいプロセスを作成する際、具体的にはCreateProcessを用いてプロセスを作成する際に、そのプロセスに付与するセキュリティ情報、すなわち、CreateProcessを呼出す際の第三引数のセキュリティ記述子から「PROCESS_TERMINATE」というアクセス権、すなわち、他のプロセスからの強制終了を許可するというアクセス権を取り除くことで、他の一般的なプロセスから強制終了を許可しないアクセス権を持ったプロセスを作成することができる。
【0136】
本発明プログラムでは、この手法により、親プロセスおよび子プロセスが一般的な強制終了、つまり、タスクマネージャーなどからのユーザー操作による強制終了をブロックすることが可能となり、誤検知を防ぐことができる。
【0137】
また、併せて、ユーザー操作レベルで強制終了させようとする種類のマルウェアの挙動をブロックすることが可能となり、結果的にそうしたマルウェアの動作継続を妨害することもできる。
【0138】
一方で、マルウェアの中には、TerminateProcessの呼び出しが上記の手法でブロックされていても、対象を強制終了させることができるタイプのものが存在する。具体的にはSeDebugPrivilege関数を利用して自身をデバッガと同じ特権状態に上げることで、相手が設定したアクセス権を無視して強制的に操作し、さらに強力に強制終了させることが可能となる。
【0139】
本発明プログラムの強制終了検知は、こうしたタイプのマルウェアが強制的に子プロセスを終了させたことを検知することができ、そうしたマルウェアがそのコンピューター内に存在すると検出することができることとなる。
【0140】
[変形実施形態]
本発明は上記実施形態に限らず種々の変形が可能である。
【0141】
例えば、上記実施形態では、マイクロソフトのオペレーティングシステムであるマイクロソフトウィンドウズ(Microsoft Windows)に本発明を適用したが、Android、BSD、iOS、Linux、OS X、Windows Phone、IBM z/OS(全て登録商標)等の他のオペレーティングシステムに本発明を適用してもよい。各オペレーティングシステムに対するマルウェアによる攻撃を確実かつ有効に阻止することができる。
【解決手段】マルウェアが使用するミューテックス値をオペレーティングシステムに登録し、ミューテックス値を利用するプロセスを常駐させる。オペレーティングシステムの解析ツールと同じプロセス名のプロセスを起動し、そのプロセス名のプロセスを常駐させる。