【文献】
澤村 隆志 TAKASHI SAWAMURA,PC内のファイル改ざんを行うマルウェアの検知手法 A Proposal of Detection Method of Malware that Modifies Files inside PC.,情報処理学会研究報告コンピュータセキュリティ,日本,一般社団法人情報処理学会,2012年 2月29日,2012-CSEC-56巻, 11号,pp.1-7
【文献】
金岡 晃 Akira KANAOKA,ランサムウェアの脅威分析と対策検討 Ransomware: Threat Analysis and Countermeasures,電子情報通信学会技術研究報告 IEICE Technical Report,日本,一般社団法人電子情報通信学会 The Institute of Electronics,Information and Communication Engineers,2014年 6月 6日,Vol.114 No.71,pp.33-38
(58)【調査した分野】(Int.Cl.,DB名)
所定のプロセスから呼び出されるファイル書込関数がデータを書き込むファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル読出関数が既に呼び出されているという第1の条件と、前記ファイル書込関数が、前記ファイルパスのファイルのヘッダを書き換えるという第2の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部
を有することを特徴とする情報処理装置。
所定のプロセスから呼び出されるファイル削除関数が削除するファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル読出関数が既に呼び出されているという第1の条件と、前記所定のプロセスから呼び出される前記ファイル削除関数が削除する前記ファイルパスと同一のファイルパスを移動先とする第1のファイル移動関数が既に呼び出されているという第2の条件と、前記所定のプロセスから呼び出される第2のファイル移動関数の移動元のファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル書込関数が既に呼び出されているという第3の条件と、前記第1のファイル移動関数の移動元のファイルパスのファイルのヘッダと、前記ファイル削除関数が削除する前記ファイルパスのファイルのヘッダとが相違しているという第4の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部
を有することを特徴とする情報処理装置。
所定のプロセスから呼び出されるファイル移動関数の移動先のファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル読出関数が既に呼び出されているという第1の条件と、前記ファイル移動関数の移動元のファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル書込関数が既に呼び出されているという第2の条件と、前記ファイル移動関数の移動元のファイルパスのファイルのヘッダと、前記ファイル移動関数の移動先のファイルパスのファイルのヘッダとが相違しているという第3の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する判断部
を有することを特徴とする情報処理装置。
所定のプロセスから呼び出されるファイル書込関数がデータを書き込むファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル読出関数が既に呼び出されているという第1の条件と、前記ファイル書込関数が、前記ファイルパスのファイルのヘッダを書き換えるという第2の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する
ことを特徴とする情報処理方法。
所定のプロセスから呼び出されるファイル削除関数が削除するファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル読出関数が既に呼び出されているという第1の条件と、前記所定のプロセスから呼び出される前記ファイル削除関数が削除する前記ファイルパスと同一のファイルパスを移動先とする第1のファイル移動関数が既に呼び出されているという第2の条件と、前記所定のプロセスから呼び出される第2のファイル移動関数の移動元のファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル書込関数が既に呼び出されているという第3の条件と、前記第1のファイル移動関数の移動元のファイルパスのファイルのヘッダと、前記ファイル削除関数が削除する前記ファイルパスのファイルのヘッダとが相違しているという第4の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する
ことを特徴とする情報処理方法。
所定のプロセスから呼び出されるファイル移動関数の移動先のファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル読出関数が既に呼び出されているという第1の条件と、前記ファイル移動関数の移動元のファイルパスと同一のファイルパスに対して、前記所定のプロセスからファイル書込関数が既に呼び出されているという第2の条件と、前記ファイル移動関数の移動元のファイルパスのファイルのヘッダと、前記ファイル移動関数の移動先のファイルパスのファイルのヘッダとが相違しているという第3の条件とを満足する場合に、前記所定のプロセスをランサムウェアと判断する
ことを特徴とする情報処理方法。
【発明を実施するための形態】
【0027】
[情報処理装置]
本発明が適用される一般的な情報処理装置及びその動作について
図1乃至
図3を用いて説明する。
【0028】
図1は一般的な情報処理装置を示すブロック図である。
【0029】
標準的なスタンドアロン環境における情報処理装置10は、コンピューター(PC)20と、外部周辺装置30とから構成されている。
【0030】
コンピューター(PC)20は、命令を実行するCPU21と、データおよびプログラムを格納するハードディスク22と、データやプログラムをCPU21が読み込むためのメモリ23と、ユーザーの操作を受け付けるマウスやキーボードのような入出力装置24と、操作内容や処理結果等を表示するディスプレイ25等から構成されている。
【0031】
外部周辺装置30は、処理結果等を印刷するためのプリンター31や、USBメモリ等の外部記憶装置32等から構成されている。
【0032】
次に、
図2及び
図3を用いて、コンピュータープログラム、すなわち、コンピューターに行わせる処理の手順を決められた形式(プログラム言語)に従って書き表したものを実行させる場合の一連の動作について、コンピューター20におけるCPU21、ハードディスク22、メモリ23等のハードウェアとの関連で説明する。
【0033】
コンピューター20が起動する前は、オペレーションソフトウェア(OS)のプログラムやデータを含むOSデータと、コンピューター20で実行させるプログラムと、文書、図面等のユーザーデータ等がファイルとしてハードディスク22に格納されている(
図2(a))。メモリ23にはプログラムやデータ等は展開されていない。
【0034】
コンピューター20が起動して、CPU21が、ハードディスク22に格納されたOSデータをメモリ23にロードする命令を実行すると、OSデータがメモリ23上にプロセスとして展開される(
図2(b))。
【0035】
次に、CPU21がメモリ23上のOSデータのプロセスを実行して、ハードディスク22に格納されたプログラムにアクセスして、そのプログラムを読み込む(
図2(c))。ハードディスク22に格納されたプログラムはメモリ23にロードされ、メモリ23上にプロセスとして展開される(
図3(a))。
【0036】
次に、CPU21がメモリ23上のプログラムのプロセスを実行して、ハードディスク22に格納されたユーザーデータにアクセスして、ハードディスク22へのデータの読み書きを行う(
図3(b))。
【0037】
このように、オペレーションソフトウエアやプログラムにより、CPU21、ハードディスク22、メモリ23との間での動作が行われる。
【0038】
なお、本明細書において「プロセス」とは「メモリ23上に展開されたプログラム」のことであり、「プログラム」とは「ハードディスク等に格納されたプログラム(ファイル)」のことである。理解しやすさのため「プロセス」である「メモリ23上に展開されたプログラム」のことを単に「プログラム」と記載することもある。
【0039】
また、本明細書において、Windows API関数の文字列末尾に付与されている"W"や"Ex"は、付与されていないものと同じ意味合いとする。例えば、"FindFirstFileW"は"FindFirstFile"と同義であり、"MoveFileEx"は"MoveFile"と同義である。
【0040】
[発明の原理]
本発明の原理について
図4乃至
図16を用いて説明する。
【0041】
(ランサムウェアの分析)
本願発明者等は、まず、国内外で被害が報告されている主なランサムウェア複数種について、ファイルの暗号化を行う際のファイル操作に関わる挙動について解析した。具体的には、4種類のランサムウェア、CryptoLocker、CryptWall、CERBER、TeslaCryptのファイル操作の挙動について解析した。
(a)ランサムウェアCryptoLockerの分析
APIモニター(API Monitor)という解析ツールを用いてランサムウェアCryptoLockerの動作を分析した。APIモニターは、アプリケーションから呼ばれるWindows API(Application Programming Interface)コールの引数、戻り値を、アプリケーションを変更することなくモニターすることができるプログラムである。Windowsは登録商標である。
【0042】
図4にランサムウェアCryptoLockerのファイル暗号化時に呼び出されたAPIのログ(log)を示す。ランサムウェアCryptoLockerにより、フォルダ"C:\Python27\Lib\compiler"内のファイルが順次暗号化される場合のログである。
【0043】
1行目のFindNextFileは、次のファイルを検索するというWindows API関数である。
【0044】
2行目のCreateFileWは、引数"C:\Python27\Lib\compiler\consts.py"のファイルを開くというWindows API関数である。
【0045】
3−4行目のReadFileは、CreateFileWで開いたファイル"C:\Python27\Lib\compiler\consts.py"を読み出すというWindows API関数である。
【0046】
5−7行目のWriteFileは、CreateFileWで開いたファイル"C:\Python27\Lib\compiler\consts.py"にデータを書き込むというWindows API関数である。
【0047】
1−7行目のログは次のことを示している。
【0048】
1行目のFindNextFileにより次のファイルを検索し、2行目のCreateFileWにより引数"C:\Python27\Lib\compiler\consts.py"のファイルを開き、3−4行目のReadFileと5−7行目のWriteFileにより、ファイル"C:\Python27\Lib\compiler\consts.py"の暗号化が実行される。
【0049】
8行目のFindNextFileは、次のファイルを検索するというWindows API関数である。
【0050】
9行目のCreateFileWは、引数"C:\Python27\Lib\compiler\future.py"のファイルを開くというWindows API関数である。
【0051】
10−11行目のReadFileは、CreateFileWで開いたファイル"C:\Python27\Lib\compiler\future.py"を読み出すというWindows API関数である。
【0052】
12−15行目のWriteFileは、CreateFileWで開いたファイル"C:\Python27\Lib\compiler\future.py"にデータを書き込むというWindows API関数である。
【0053】
8−15行目のログは次のことを示している。
【0054】
8行目のFindNextFileにより次のファイルを検索し、9行目のCreateFileWにより引数"C:\Python27\Lib\compiler\future.py"のファイルを開き、10−11行目のReadFileと12−15行目のWriteFileにより、ファイル"C:\Python27\Lib\compiler\future.py"の暗号化が実行される。
【0055】
16行目のFindNextFileは、次のファイルを検索するというWindows API関数である。
【0056】
17行目のCreateFileWは、引数"C:\Python27\Lib\compiler\misc.py"のファイルを開くというWindows API関数である。
【0057】
18−19行目のReadFileは、CreateFileWで開いたファイル"C:\Python27\Lib\compiler\misic.py"を読み出すというWindows API関数である。
【0058】
20−22行目のWriteFileは、CreateFileWで開いたファイル"C:\Python27\Lib\compiler\misic.py"にデータを書き込むというWindows API関数である。
【0059】
16−22行目のログは次のことを示している。
【0060】
16行目のFindNextFileにより次のファイルを検索し、17行目のCreateFileWにより引数"C:\Python27\Lib\compiler\misic.py"のファイルを開き、18−19行目のReadFileと20−22行目のWriteFileにより、ファイル"C:\Python27\Lib\compiler\misic.py"の暗号化が実行される。
【0061】
以下同様にして、フォルダ"C:\Python27\Lib\compiler\"内のファイルが順次暗号化される。
【0062】
このログから、ランサムウェアCryptoLockerは、次のようにしてファイルを暗号化していることがわかる。
(1)FindFirstFile、FindNextFileによりファイルを検索する。FindFirstFile、 FindNextFileは、セットで使用される検索用のWindows API関数である。
(2)CreateFileにより暗号化対象のファイルを開く。
(3)開いたファイルに対し、ReadFile、WriteFileでファイルを書き換えて暗号化する。すなわち、ReadFileにより、暗号化対象ファイルのファイル内容を読み込み、読み込んだ暗号化対象ファイル内容をマルウェアが暗号化し、暗号化された後のデータをWriteFileにより元の暗号化対象ファイルに書き込む。
【0063】
図5にランサムウェアCryptoLockerのファイル暗号化時に呼び出されたAPIのログを示す。ランサムウェアCryptoLockerにより、フォルダ"C:\User\Public\Videos"下にあるファイル"Wildlife.wmv"が検索され暗号化される場合のログである。
【0064】
3行目のFindFirstFileは、引数"C:\Users\Public\Videos\*.*"の最初のファイルを検索するというWindows API関数である。
【0065】
4−9行目のFindNextFileは、次のファイルを検索するというWindows API関数である。
【0066】
10行目のFindFirstFileは、引数"C:\Users\Public\Videos\Sample Videos\*.*"の最初のファイルを検索するというWindows API関数である。
【0067】
11−13行目のFindNextFileは、次のファイルを検索するというWindows API関数である。
【0068】
14行目のCreateFileWは、引数"C:\Users\Public\Videos\Sample Videos\Wildlife.wmv"のファイルを開くというWindows API関数である。
【0069】
15−16行目のReadFileは、CreateFileWで開いたファイル"C:\Users\Public\Videos\Sample Videos\Wildlife.wmv"を読み出すというWindows API関数である。
【0070】
17−19行目のWriteFileは、CreateFileWで開いたファイル"C:\Users\Public\Videos\Sample Videos\Wildlife.wmv"にデータを書き込むというWindows API関数である。
【0071】
20行目のFindNextFileは、次のファイルを検索するというWindows API関数である。
【0072】
3−9行目のログは次のことを示している。
【0073】
3行目のFindFirstFileと4−9行目のFindNextFileにより、フォルダ"C:\Users\Public\Videos\*.*"内のファイルを検索したが、ファイルが見つからない。
【0074】
10−14行目のログは次のことを示している。
【0075】
10行目のFindFirstFileにより、フォルダ"C:\Users\Public\Videos\*.*"より下層のフォルダ"C:\Users\Public\Videos\Sample Videos\*.*"に移行し、11−13行目のFindNextFileにより、フォルダ"C:\Users\Public\Videos\Sample Videos\*.*"内を検索し、ファイル"C:\Users\Public\Videos\Sample Videos\Wildlife.wmv"を見つけたので、14行目のCreateFileWにより開く。
【0076】
15−20行目のログは次のことを示している。
【0077】
CreateFileWにより開いたファイル"C:\Users\Public\Videos\Sample Videos\Wildlife.wmv"を、15−16行目のReadFileと17−19行目のWriteFileにより、暗号化する。
【0078】
そして、20行目のFindNextFileにより、フォルダ"C:\Users\Public\Videos\Sample Videos\*.*"内の次のファイルを検索する。
【0079】
図5のように、あるフォルダ下にあるファイルが検索され暗号化される場合も、
図4と同様に、FindFirstFile、FindNextFile、CreateFile、ReadFile、WriteFileにより、ファイルを検索し、検索されたファイルを書き換えて暗号化する。
【0080】
図6は、ランサムウェアCryptoLockerによりアクセスされる前と後のファイル"Wildlife.wmv"の状態を示す。
図6(a)が、ランサムウェアCryptoLockerによりアクセスされる前の状態であり、
図6(b)が、ランサムウェアCryptoLockerによりアクセスされた後の状態である。
【0081】
図6に示すように、ランサムウェアCryptoLockerによりアクセスされた後には、暗号化されたファイル"Wildlife.wmv"のヘッダが書き換えられている。
【0082】
図7は、ランサムウェアCryptoLockerにより暗号化される前と後のファイル"Wildlife.wmv"のヘッダを示す。
図7(a)が、ランサムウェアCryptoLockerにより暗号化される前のヘッダであり、
図7(b)が、ランサムウェアCryptoLockerにより暗号化された後のヘッダである。
【0083】
図7に示すように、ファイル"Wildlife.wmv"の先頭から末尾までの全てのバイトの部分が書き換えられている。少なくとも、バイナリファイルであれば、ファイルの種類や、サイズ、ファイルの種類に応じた各種情報の情報を表す「ヘッダ」と呼ばれる部分(通常、先頭から数バイトから数十バイト)が書き換えられている。
【0084】
以上のことから、ランサムウェアCryptoLockerの暗号化時のファイル操作に関する挙動は、次の通りであることがわかった。
(1)ファイル検索のWindows API関数であるFindFirstFile、FindNextFileが呼び出される。
(2)ファイルを開くWindows API関数であるCreateFileが呼び出される。
(3)CreateFileの対象ファイルに、ファイルを読み出すWindows API関数であるReadFileと、ファイルにデータを書き込むWindows API関数であるWriteFileが呼び出される。
(4)CreateFileの対象ファイルのヘッダが、ランサムウェアCryptoLockerのアクセス前後で相違している。
(b)ランサムウェアCryptoWallの分析
プログラムのデバッグを支援するプログラムであるデバッガ(Debugger)を用いてランサムウェアCryptoWallの動作を分析した。
【0085】
ランサムウェアCryptoWallは、まずファイルを検索するWindows API関数であるFindFirstFileWにより、ルートドライブから端末内のファイルを検索する。
【0086】
図8は、ランサムウェアCryptoWallがファイル検索を開始する際の様子を示すデバッガの画面のキャプチャである。
【0087】
最初の
図8(a)のキャプチャは、FindFirstFileWに、ドライブのルートである"C:\*"が引数として渡されていることを示している。
【0088】
次の
図8(b)のキャプチャは、FindFirstFileWに、ドライブのルート"C:\*"より下層のフォルダである"C:\Users\*"が引数として渡されていることを示している。
【0089】
その次の
図8(c)のキャプチャは、FindFirstFileWに、フォルダ"C:\Users\*"より下層のフォルダである"C:\Users\Publice\*"が引数として渡されていることを示している。
【0090】
更にその次の
図8(d)のキャプチャは、FindFirstFileWに、フォルダ"C:\Users\Public\*"より下層のフォルダである"C:\Users\Publice\Videos\*"が引数として渡されていることを示している。
【0091】
Windows API関数であるFindFirstFileWによる、ルートドライブから端末内の更なるファイル検索の結果、最初に"C:\Users\Public\Videos\Sample Videos\Wildlife.wmv"が検索され、ランサムウェアCryptoWallにより暗号化される。
【0092】
図9は、ランサムウェアCryptoWallがファイル"C:\Users\Public\Videos\Sample Videos\Wildlife.wmv"を暗号化する際の様子を示すデバッガの画面のキャプチャである。
【0093】
最初の
図9(a)のキャプチャは、Windows API関数であるCreateFileWにより、ファイル"C:\Users\Public\Videos\Sample Videos\Wildlife.wmv"が開かれていることを示している。
【0094】
次の
図9(b)のキャプチャは、Windows API関数であるReadFileと、Windows API関数であるWriteFileが交互に呼び出され、ファイル"C:\Users\Public\Videos\Sample Videos\Wildlife.wmv"が所定のサイズ分ずつ書き換えられて暗号化されていることを示している。
【0095】
その次の
図9(c)のキャプチャは、Windows API関数であるMoveFileが呼び出され、元のファイル"C:\Users\Public\Videos\Sample Videos\Wildlife.wmv"のファイル名を暗号化後の別のファイル名に変更されていることを示している。
【0096】
図10は、ランサムウェアCryptoWallによりアクセスされる前と後のファイル"Wildlife.wmv"の状態を示す。
図6(a)が、ランサムウェアCryptoWallによりアクセスされる前の状態であり、
図6(b)が、ランサムウェアCryptoWallによりアクセスされた後の状態である。
【0097】
図10に示すように、ランサムウェアCryptoWallによりアクセスされた後には、フォルダ"C:\Users\Public\Videos\Sample Videos\*.*"内に元のファイル名"野生動物.wmv(Wildlif.wmv)"とは別のファイル名に変更され、ファイルのヘッダが書き換えられている。
【0098】
図11は、ランサムウェアCryptoWallにより暗号化される前と後のファイル"Wildlife.wmv"のヘッダを示す。
図11(a)が、ランサムウェアCryptoLockerにより暗号化される前のヘッダであり、
図11(b)が、ランサムウェアCryptoLockerにより暗号化された後のヘッダである。暗号化されたファイルはファイル名が変更されている。
【0099】
図11に示すように、ファイル"Wildlife.wmv"の先頭から末尾までの全てのバイトの部分が書き換えられている。少なくとも、バイナリファイルであれば、ファイルの種類や、サイズ、ファイルの種類に応じた各種情報の情報を表す「ヘッダ」と呼ばれる部分(通常、先頭から数バイトから数十バイト)が書き換えられている。
【0100】
次に、別のファイルを暗号化する際の様子について説明する。
【0101】
図12及び
図13は、ランサムウェアCryptoWallがファイル"C:\Users\Public\Pictures\Sample Pictures\Tulips.jpg"を暗号化する際の様子を示すデバッガの画面のキャプチャである。
【0102】
最初の
図12(a)のキャプチャは、Windows API関数であるCreateFileにより、ファイル"C:\Users\Public\Pictures\Sample Pictures\Tulips.jpg"が開かれていることを示している。
【0103】
次の
図12(b)のキャプチャは、Windows API関数であるReadFileと、Windows API関数であるWriteFileが繰り返し呼び出されることを示している。
【0104】
その次の
図13のキャプチャは、ファイル"C:\Users\Public\Pictures\Sample Pictures\Tulips.jpg"が暗号化により破損され、サムネイルで表示できなくなっていることを示している。更に、Windows API関数であるMoveFileEXが呼び出され、元のファイル"C:\Users\Public\Pictures\Sample Pictures\Tulips.jpg"が暗号化後の別のファイル名"C:\Users\Public\Pictures\Sample Pictures\p3EiSzLkWhfU5pgrD5SX9PdYPyP5ICa5iXzySi34oaY=.E08A29776586FC717E27.breaking_bad"に変更されていることを示している。
【0105】
以上のことから、ランサムウェアCryptoWallの暗号化時のファイル操作に関する挙動は、次の通りであることがわかった。
(1)ファイル検索のWindows API関数であるFindFirstFile、FindNextFileが呼び出される。
(2)ファイルを開くWindows API関数であるCreateFileが呼び出される。
(3)CreateFileの対象ファイルに、ファイルを読み出すWindows API関数であるReadFileと、ファイルにデータを書き込むWindows API関数であるWriteFileが呼び出される。
(4)CreateFileの対象ファイルのヘッダが、ランサムウェアCryptoWallのアクセス前後で相違している。
(5)ファイルを移動するWindows API関数であるMoveFileExが呼び出され、移動元の移動先が同じでファイル名が変更される。
(c)ランサムウェアCERBERの分析
プログラムのデバッグを支援するプログラムであるデバッガ(Debugger)を用いてランサムウェアCERBERの動作を分析した。
【0106】
ランサムウェアCERBERは、まずファイルを検索するWindows API関数であるFindFirstFile、FindNextFileにより、端末内のファイルを検索し、特定の拡張子を持つファイルを暗号化対象ファイルとして、そのリストをあらかじめ作成する。
【0107】
次に、リスト化した暗号化対象ファイルを、Windows API関数であるCreateFileWにより順に開いたのち、Windows API関数であるReadFileによりファイルを一度読み出し、その後、Windows API関数であるWriteFileによりファイルにデータを書き込むことにより暗号化を行う。更に、WriteFileによるデータの書き込みにより暗号化が終了すると、Windows API関数であるMoveFileWにより、同一フォルダにファイルを移動、すなわちファイル名の変更が行われる。
【0108】
図14は、ランサムウェアCERBERがファイルを暗号化する際の様子を示すデバッガの画面のキャプチャである。
【0109】
最初の
図14(a)のキャプチャは、Windows API関数であるCreateFileWにより、ファイル"C:\Python27\Lib\unittest\test\test_assertions.py"が開かれていることを示している。
【0110】
次の
図14(b)のキャプチャは、Windows API関数であるReadFileにより、CreatFileWで開いたファイルを読み込むことを示している。
【0111】
更に次の
図14(c)のキャプチャは、Windows API関数であるWriteFileにより、CreatFileWが開いたファイルにデータを書き込むことを示している。
【0112】
更に次の
図14(d)のキャプチャは、Windows API関数であるMoveFileWが呼び出され、CreatFileWが開いたファイルのファイル名を変更されたことを示している。
【0113】
以上のことから、ランサムウェアCERBERの暗号化時のファイル操作に関する挙動は、次の通りであることがわかった。
(1)ファイル検索のWindows API関数であるCreateFileが呼び出される。
(2)CreateFileの対象ファイルに、ファイルを読み出すWindows API関数であるReadFileと、ファイルにデータを書き込むWindows API関数であるWriteFileが呼び出される。
(3)CreateFileの対象ファイルのヘッダが、ランサムウェアCERBERのアクセス前後で相違している。
(4)ファイルを移動するWindows API関数であるMoveFileExが呼び出され、移動元の移動先が同じでファイル名が変更される。
(d)ランサムウェアTeslaCryptの分析
プログラムのデバッグを支援するプログラムであるデバッガ(Debugger)を用いてランサムウェアTeslaCryptの動作を分析した。
【0114】
ランサムウェアTeslaCryptは、まずファイルを検索するWindows API関数であるFindFirstFile、FindNextFileにより、Cドライブ直下から端末内のファイルを検索する。暗号化対象ファイルである特定の拡張子を持つファイルが存在した場合、Windows API関数であるCreateFileWにより開いたのち、Windows API関数であるReadFileを複数回実行してメモリ上にファイルを読み出し、そのメモリ上のファイルを暗号化し、その後、Windows API関数であるWriteFileを複数回実行して、暗号化対象ファイルを上書きする。
【0115】
図15は、ランサムウェアTeslaCryptがファイルを暗号化する際の様子を示すデバッガの画面のキャプチャである。
【0116】
最初の
図15(a)のキャプチャは、Windows API関数であるFindFirstFile、FindNextFileにより、Cドライブ直下から端末内のファイルを検索していくことを示している。
【0117】
次の
図15(b)のキャプチャは、Windows API関数であるCreateFileWにより、ファイル"C:\Users\test\Desktop\おとり.png"が開かれていることを示している。
【0118】
更に次の
図15(c)のキャプチャは、Windows API関数であるReadFileにより、CreatFileWが開いたファイルを複数回にわけて読み出すことを示している。
【0119】
更に次の
図15(d)のキャプチャは、Windows API関数であるWriteFileにより、CreatFileWが開いたファイルにデータを複数回にわけて書き込むことを示している。
【0120】
図16は、ランサムウェアTeslaCryptにより暗号化される前と後のファイル"C:\Users\test\Desktop\おとり.png"のヘッダを示す。
図16(a)が、ランサムウェアTeslaCryptoにより暗号化される前のヘッダであり、
図16(b)が、ランサムウェアTeslaCryptoにより暗号化された後のヘッダである。
【0121】
図16に示すように、ファイル"おとり.png"の先頭から末尾までの全てのバイトの部分が書き換えられている。少なくとも、バイナリファイルであれば、ファイルの種類や、サイズ、ファイルの種類に応じた各種情報の情報を表す「ヘッダ」と呼ばれる部分(通常、先頭から数バイトから数十バイト)が書き換えられている。
【0122】
以上のことから、ランサムウェアTeslaCryptの暗号化時のファイル操作に関する挙動は、次の通りであることがわかった。
(1)ファイル検索のWindows API関数であるFindFirstFile、FindNextFileが呼び出される。
(2)ファイル検索のWindows API関数であるCreateFileが呼び出される。
(3)CreateFileの対象ファイルに、ファイルを読み出すWindows API関数であるReadFileと、ファイルにデータを書き込むWindows API関数であるWriteFileが呼び出される。
(4)CreateFileの対象ファイルのヘッダが、ランサムウェアTeslaCryptのアクセス前後で相違している。
【0123】
(本発明の原理)
本願発明者等は、これら4種類のランサムウェアの分析結果から、ファイルを暗号化する際のファイル操作の挙動に、次のような共通する挙動があることに気がついた。
(1)ファイルを開くWindows API関数であるCreateFileが呼び出される。
(2)CreateFileの対象ファイルに、Windows API関数であるReadFile、WriteFileが1回以上呼び出される。
(3)CreateFileの対象ファイルのヘッダが変化している。
【0124】
一般のアプリケーションで、このような挙動をするものは想定しにくく、ランサムウェア特有の挙動である。
【0125】
そこで、本願発明者等は、このような挙動を検出することにより、ファイルを暗号化しようとする未知のランサムウェアを確実に検出し、未知のランサムウェアによる攻撃を有効に阻止することができると考え、本発明を着想するに至った。
【0126】
[第1実施形態]
本発明の第1実施形態によるプログラム、情報処理装置及び情報処理方法について
図17乃至
図43を用いて説明する。
【0127】
(本実施形態の概要)
本実施形態の概要について
図17及び
図18を用いて説明する。
【0128】
本実施形態では、ハードディスク22に保存されたユーザーデータへアクセスするという挙動を有するプログラムの全ての挙動が検出対象である。
【0129】
CPU21がメモリ23上のOSデータのプロセスを実行して、ハードディスク22に格納されたプログラムにアクセスして、そのプログラムを読み込み(
図2(c))、ハードディスク22に格納されたプログラムがメモリ23にロードされ、メモリ23上にプロセスとして展開される(
図3(a))前に、メモリ23に本発明プログラムのプロセスを常駐させておく(
図17(a))。
【0130】
本発明プログラムは、ランサムウェアが導入される危険性のある状態となる前であればいつ実行してメモリ23上にプロセスとして常駐させてもよい。
【0131】
例えば、スタートアッププログラムとして、コンピューターの起動時に起動させておく。Windows OSには、PCの起動と共に実行されるプログラムとして「スタートアッププログラム」が登録できる仕組みがある。本実施形態では、その仕組みを利用し本発明プログラムをスタートアッププログラムとして登録しておく。これにより、本発明プログラムがPCの起動直後からメモリ23上に配置している状態にする。
【0132】
また、PCの起動時にプログラムを起動する方法としては、レジストリやサービスの仕組みを使用する方法もあるが、いずれの方法を用いてもよい。
【0133】
これにより、PCの起動直後から常にコンピューターをランサムウェアから保護することができる。
【0134】
本発明プログラムは、
図17(a)に示すように、ハードディスク22に格納されたプログラムがメモリ23にロードするという動作と、CPU21がプログラムを実行するという動作との間に割り込む。CPU21によるプログラムに基づく動作をフックすることにより、プログラムが実行される直前で、そのプログラムの挙動を本発明プログラムの監視下に置く。
【0135】
これにより、これ以降、監視対象プログラムの全ての挙動は、本発明プログラムが実行直前に把握することができる。必要に応じて、監視対象プログラムの処理に機能を加えたり、変更したりすることができる。
【0136】
本発明プログラムにより、監視対象プログラムの挙動が、ランサムウェア特有の挙動であると判断された場合には、
図17(b)に示すように、本発明プログラムは、監視対象プログラムがハードディスク22内のファイルにアクセスを行おうとする直前に、そのアクセスをブロックする。このようにして、未知のランサムウェアによる攻撃をブロックしてファイルの暗号化を阻止する。
【0137】
本発明プログラムは3つの機能を有する。本発明プログラムの3つの機能について
図18を用いて説明する。
【0138】
第1の機能は、現在動作中のプログラムや、後ほど起動するプログラムである監視対象プログラムが使用するWindows APIをフックする機能である。
図18に示すように、本発明プログラムから、現在起動中のプロセス、すなわち、notepad.exe、WINWORD.exe、calc.exe、Ramsomware.exe、cmd.exe、…のプロセスが使用するWindows APIをフックする。
【0139】
第2の機能は、フックしたWindows APIにより、監視対象プログラムの挙動を本発明プログラムに通知、問い合わせをして、その結果に基づいて監視対象プログラムがランサムウェアであるか判断する機能である。
【0140】
第3の機能は、フックしたWindows APIからの通知の受領、記録、問い合わせに応答する機能である。
【0141】
第1の機能と第3の機能は、常駐している本発明プログラムの機能であり、第2の機能は、監視対象プログラム内に組み込まれる本発明プログラムの機能である。
【0142】
(フック対象のWindows API関数)
本発明プログラムは、監視対象プロセスにおいて、ランサムウェアの分析結果から得られた共通の挙動であるWindows API関数をフックすることにより、ランサムウェアの検知および防御を実現する。
【0143】
ランサムウェアの共通の挙動であるWindows API関数とは、本発明の原理で指摘したように、CreateFile(ファイル作成関数(ファイルハンドル取得関数))、(ファイル生成関数)、ReadFile(ファイル読出関数)、WriteFile(ファイル書込関数)である。
【0144】
本実施形態では、共通のWindows API関数である、ファイルを開きファイルハンドルを取得するためのCreateFile(ファイル生成関数)はフック対象とせず、ReadFile(ファイル読出関数)、WriteFile(ファイル書込関数)のみをフック対象としている。それは次のような理由からである。
【0145】
まず、共通のWindows API関数である、ReadFile(ファイル読出関数)、WriteFile(ファイル書込関数)を実行するためには、ファイルのハンドルを取得することは事前に必須の処理であるので、ReadFile(ファイル読出関数)、WriteFile(ファイル書込関数)をフック対象とするだけで、ファイルのハンドルを取得することを検出できる。
【0146】
また、ファイルのハンドルを取得するためには、CreateFile(ファイル生成関数)以外のWindows API関数、例えば、OpenFile(ファイルオープン関数)でも実現可能であるので、CreateFile(ファイル生成関数)はファイルのハンドルを取得するために必須のWindows API関数とは言えない。
【0147】
(HookReadFile)
HookReadFileは、ReadFile(ファイル読出関数)をフックするWindows API関数である。
【0148】
HookReadFileは、通常のReadFileの動作に加えて、本発明プログラムに対して、次の情報(a)〜(c)を通知する機能を付加したWindows API関数である。
【0149】
通知手段としては、プロセス間通信等、プロセスの動作に大きな遅延を発生させない程度の高速な手法が望ましい。ソケット通信やファイルによる受け渡し等でも、高速に実現できる環境であれば、いかなる方法でもよい。
(a)通知元API名。フックするWindows API関数の名前であるReadFileである。
(b)自身のプロセスID。フックするReadFileを呼び出す監視対象プロセスのプロセスIDである。
(c)ReadFileの対象ファイルパス。通知元APIであるReadFileのパラメータに指定されたファイルハンドルを示すファイルパスである。
【0150】
ここで「ファイルパス」とは、その「ファイル」を保存している「フォルダ」に辿り着くまでに階層を重ねたフォルダの「経路(path)」を含めたものである。例えば、ハードディスクの「Cドライブ」上のフォルダ「Users」内のフォルダ「user」内のフォルダ「Desktop」内にあるファイル「note.doc」の「ファイルパス」は次の通りである。
【0151】
C:\Users\user\desktop\note.doc
また、ファイルパス(C:\Users\user\desktop\note.doc)からファイル名(note.doc)を除いたファイルパス(C:\Users\user\desktop\)のことを「フォルダパス」と言う。
【0152】
HookReadFile(ReadFileのフック関数)から通知を受けた本発明プログラムは、通知された内容、すなわち、API名、プロセスID、ファイルパスを、順次、通知記録データとしてメモリ23に保存する。この通知記録データは、後述するHookWriteFile(WriteFileのフック関数)において使用される。
【0153】
なお、オペレーティングシステムではプロセスIDを再利用する機能があるので、長時間継続していると、異なるプロセスに対して偶発的に同じプロセスIDが割り当てられる可能性がある。このような偶発的なプロセスIDの一致によるランサムウェアの誤検知を防止するため、通知記録データを定期的にクリアすることが望ましい。
【0154】
通議記録データの定期的クリアの間隔は任意であるが、長くともオペレーティングシステムの終了時または再起動時にはクリアすることが望ましい。クリア間隔をユーザーが設定できるようにしてもよい。
【0155】
図19に上述したHookReadFileによる動作のイメージを示す。
図19左部に監視対象プログラムのプロセスを示し、
図19右部に本発明プログラムのプロセスを示す。
【0156】
図19左側の監視対象プログラムのプロセスには、本発明プログラムのフック機能であるHookReadFileが組み込まれている。組み込まれたHookReadFileは、通常のReadFileの動作に加えて、(a)通知元API名、(b)自身のプロセスID、(c)ReadFile対象ファイルパスを、
図19右側の本発明プロセスに通知する。
【0157】
図19右側の本発明プログラムのプロセスは、HookReadFileからの通知への対応を行う。
図19左側のHookReadFileからの通知を受け取り、通知記録データとして順次記録する。
【0158】
図19では、HookReadFileは、(a)通知元API名、(b)自身のプロセスID、(c)ReadFile対象ファイルパスとして、(a)[ReadFile]と(b)pid:3421と(c)filename:c:\Users\user\Desktop\note.docの組;(a)[ReadFile]と(b)pid:1568と(c)filename:c:\Users\user\Documents\schedule.xlsの組;(a)[ReadFile]と(b)pid:1568と(c)filename:c:\Users\user\Documents\schedule.xlsの組;・・・・を順次通知し、本発明プログラムは順次通知されたものを通知記録データとして記録している。
【0159】
(HookWriteFile)
HookWriteFileは、WriteFile(ファイル書込関数)をフックするWindows API関数である。
【0160】
HookWriteFileは、通常のWriteFileの動作に加えて、次の機能を付加したWindows API関数である。
【0161】
WriteFileに指定されたパラメータ及びパラメータから取得できる情報が、後述する「ランサムウェアによるファイル暗号化操作であることの判断基準」に合致した場合、ランサムウェアによるファイル暗号化操作であると判断し、WriteFileによるデータ書き込みを行わずにプロセスを終了させる機能。
【0162】
上記の「ランサムウェアによるファイル暗号化操作であることの判断基準」とは、次の条件(A)〜(C)を満足することである。
【0163】
条件(A):WriteFileの書き込み対象に指定されたファイルハンドルのファイルポインタの現在位置を取得し、その現在位置が先頭またはヘッダ範囲内であること。ファイルポインタの現在位置はSetFilePointer関数を使用する等で取得可能である。
【0164】
条件(B):WriteFileの呼び出しにより書き換え前後でデータが変化すること。
【0165】
条件(C):本発明プログラムに問い合わせた結果、WriteFileが呼び出し時に指定されたファイルに対して、既に自身のプロセスから ReadFileが呼び出されていること。
【0166】
条件(A)と条件(B)により、ファイルの先頭またはヘッダ範囲内情報が変化しているかを判断する。
【0167】
条件(C)を含めたのは次の理由である。
【0168】
一般的なファイルの暗号化手順では、プログラムの実装方法として、ReadFileで読み取った内容を暗号化した後、WriteFileで別のファイルに直接書き込む手法がとられる。しかし、今回分析したランサムウェアにおいては、そのような手法をとらず、あえて ReadFileで読み込んだファイルをWriteFileで書き換え、その後にリネームするといった動作を行っていた。これは、フォレンジック技術によるファイルの復元を防止するためと考えられる。ReadFileで読み込んだファイルをあえてWriteFileで上書きすることで、ディスク上のデータを上書きするため、フォレンジック技術を用いた方法でも、ファイルの復元ができなくなる可能性が高い。ランサムウェアの作者はあえてその状況を狙っているものと考えられる。本発明プログラムでは、この挙動を検知条件のひとつとしているため、このようなランサムウェアの特性に非常に効果的である。
【0169】
この付加した機能により、HookWriteFile(WriteFileのフック関数)内で、呼び出し元プロセスがランサムウェアかどうかを判断し、ランサムウェアである場合、ファイル暗号化の防止、ランサムウェア検知の通知、ランサムウェアのプロセスの強制終了を行うことができる。
【0170】
条件(A)のイメージを
図20に示す。
【0171】
図20(a)(b)左部はメモリ23上の監視対象プログラムのプロセスを示し、
図20(a)(b)右部はハードディスク22上の書き込み対象ファイルを示す。
【0172】
メモリ23上の監視対象プロセスに組み込まれたHookWriteFileから、ハードディスク22上の書き込み対象ファイルへの書き込み開始位置が指定される。
【0173】
図20(a)の場合、ハードディスク22上の上側の書き込み対象ファイルに対する書き込み開始位置"0x00000020"はファイルの先頭ではなく、下側の書き込み対象ファイルに対する書き込み開始位置"0x00000000"はファイルの先頭である。書き込み開始位置がファイルの先頭である下側の書き込み対象ファイルへの書き込みが条件(A)を満足し、ランサムウェアによる書き込みの可能性があると判断する。
【0174】
図20(b)の場合、ハードディスク22上の上側の書き込み対象ファイルに対する書き込み開始位置"0x00000024"はファイルのヘッダの範囲内でなく、下側の書き込み対象ファイルに対する書き込み開始位置"0x00000004"はファイルの先頭ではないがヘッダの範囲内である。書き込み開始位置がファイルのヘッダの範囲内である下側の書き込み対象ファイルへの書き込みが条件(A)を満足し、ランサムウェアによる書き込みの可能性があると判断する。
【0175】
なお、ヘッダの範囲内であるかを判断するためには、ファイルの各拡張子に対するヘッダのサイズが予め分かっている必要がある。各拡張子に対応するヘッダのサイズは予めHookWriteFile(WriteFileのフック関数)内に保持しておく。例えば、拡張子が"pdf"であるPDFファイルでは先頭から5バイトがヘッダである。
【0176】
条件(B)のイメージを
図21に示す。
【0177】
図21左部はメモリ23上の監視対象プログラムのプロセスを示し、
図21右部はハードディスク22上の書き込み対象ファイルを示す。
【0178】
メモリ23上の監視対象プロセスに組み込まれたHookWriteFileが書き込もうとする書き込み予定データと、ハードディスク22上の書き込み対象ファイルの書き込み前の状態のデータとを比較する。
【0179】
図21の場合、HookWriteFileが書き込もうとする書き込み予定データ"00 AA 00 BB 00 CC 00 DD 00 EE 00 FF 00 00 08 00"と、ハードディスク22上の書き込み対象ファイルの書き込み前の状態のデータ"50 4B 03 04 14 00 06 00 08 00 00 00 21 00 A3 EF"とは相違するので、条件(B)を満足し、ランサムウェアによる書き込みの可能性があると判断する。
【0180】
条件(C)のイメージを
図22に示す。
【0181】
図22(a)左部にメモリ23上の監視対象プログラムのプロセスを示し、
図22(a)右部にメモリ23上の本発明プログラムのプロセスを示す。
【0182】
図22(a)左部の監視対象プロセスに組み込まれたHookWriteFileは、自身(監視対象プロセス)のプロセスIDと、WriteFileの対象ファイルパスに基づいて、
図22(a)右部の本発明プログラムのプロセスに対して、ReadFileの通知記録データ中に、同一プロセスID、同一対象ファイルパスのReadFileの記録があるか否かを問い合わせる。
図22右側の本発明プログラムは、同一プロセスID、同一対象ファイルパスのReadFileの記録があるか否かをHookWriteFileに応答する。
【0183】
図22(a)の場合、監視対象プロセスに組み込まれたHookWriteFileからプロセスID"pid:1568"とファイルパス"C:\Users\user\Documents\schedule.xls"に基づいて、ReadFileの通知記録データに対して問い合わせる。
【0184】
図22(b)にReadFileの通知記録データを示す。
【0185】
ReadFileの通知記録データの第4〜6行、第7〜9行、第13〜15行に、HookWriteFileのプロセスID"pid:1568"、ファイルパス"C:\Users\user\Documents\schedule.xls"と同一である、プロセスID"pid:1568"、ファイルパス"C:\Users\user\Documents\schedule.xls"のReadFileの記録があるので、条件(C)を満足し、ランサムウェアによる書き込みの可能性があると判断する。
【0186】
その結果、
図22(a)右側の本発明プログラムは、同一プロセスID、同一対象ファイルパスのReadFileの記録があった旨をHookWriteFileに応答する。
【0187】
(除外リスト)
本発明プログラムを、システム上において動作する全てのプロセスから呼び出される全てのReadFile、WriteFileをフックし、そのプロセスがランサムウェアである否かを判断することは、システムに新たな負荷を加えることになる。
【0188】
そこで、本実施形態では、明らかにランサムウェアではないプログラムを予め登録した「除外リスト」を作成しておき、除外リストに登録されたプログラムに対しては、本発明プログラムを実行しないようにする。
【0190】
除外リストには正規のプログラムを登録する。例えば、システムにインストールされている「プログラム名」「プログラムファイル」「ファイルのフルパス」「ファイルサイズ」「ハッシュ値」「デジタル著名」等を必要に応じて登録する。
【0191】
図23では、正規のプログラムとして、「インターネットエクスプローラー」「MSワード」「MSエクセル」を登録している。
【0192】
除外リストは、システムへのプログラムをインストールするたびに更新し、ハードディスク22上に格納しておく。本発明プログラムの起動時に除外リストの内容を読み込むようにする。
【0193】
本発明プログラムの動作後、読み込んだ除外リストの情報はメモリ23上にマッピングされる。突然のマシントラブルでメモリ情報が揮発しても内容を失わないよう、ハードディスク22上のファイルに対して常に更新しておくことがよい。
【0194】
また、除外リストのファイルは、マルウェアやランサムウェアによる編集を避けるため、暗号化しておくことが望ましい。
【0195】
(ユーザーによる除外リストへの追加)
「ランサムウェアによるファイル暗号化操作であることの判断基準」の条件(A)は、HookWriteFileからの書き込み対象ファイルへの書き込み開始位置が先頭又はヘッダ範囲内であることである。この条件(A)は、監視対象プログラムがファイルのヘッダを書き換えるものであるかを判断するための条件である。監視対象プログラムがファイルのヘッダを書き換える場合には、監視対象プログラムがランサムウェアの可能性があると判断する。監視対象プログラムがファイルのヘッダ以外の部分を書き換える場合には、通常の書き換え処理でありランサムウェアの可能性がないと判断する。
【0196】
一般的に、コンピューターが扱うファイルは「テキストファイル(テキスト形式)」と「バイナリファイル(バイナリ形式)」の2種類に分類される。
【0197】
バイナリファイル、例えば、拡張子が"doc"、"ppt"、"exe"、"pdf"、"jpg"、"bmp"等のファイルは、通常、ファイル種別に応じたヘッダ情報を有している。バイナリファイルの内容を編集して変更し上書き保存した場合でも、通常、ヘッダ情報となるファイルの先頭部分は変更されず、データ部分が変更される。バイナリファイルのヘッダが書き換えられると、そのファイルは適切に開けなくなり、通常のアプリケーションではそのようなことは行われない。したがって、ファイルのヘッダを書き換えるプログラムはランサムウェアの可能性がある。
【0198】
ファイルの先頭部分のヘッダを書き換えるような処理を行うアプリケーションも存在するが、その場合には、ヘッダの書き換えに応じて、ファイルの拡張子も変更されてファイル種別が変更される。拡張子を含むファイル名が変わらないままで、ヘッダを書き換えることは通常のアプリケーションでは行われない。したがって、ファイル名が変わらないままで、ファイルのヘッダを書き換えるプログラムはランサムウェアの可能性がある。
【0199】
一方、テキストファイル、例えば、拡張子が"txt"、"csv"等のファイルは、通常、ファイル種別に応じたヘッダ情報を有していない。テキストファイルの場合、ファイルの先頭部分もデータ部分である。したがって、テキストファイルが先頭部分から書き換えられていても、それがランサムウェアによる暗号化か、通常のアプリケーションにより書き換えかを判断することは困難である。
【0200】
本発明プログラムでは、ファイルの拡張子に基づいて、テキスト形式のファイルであると判断された場合は、その対応をユーザーの判断にゆだねるようにする。
【0201】
図24は、テキスト形式のファイルの書き換えを検出した場合の警告画面である。
【0202】
警告画面では「以下のプロセスがテキストファイルの改変挙動を行っています。どう処理しますか。」と尋ね、「プロセス名:AAATextEditor.exe」、「該当挙動:ファイル内容の改変」、「対象ファイル:C:\Users\test\Desktop\議事録.txt」、「書き込み内容:"[議事録]\n 出席者:佐藤・・・"」を示す。
【0203】
更に「※現在の操作に心当たりのないプロセスおよびファイルである場合、ランサムウェアによるファイルの暗号化処理の可能性があります。」と警告し、その対応処理の選択ボタン「プロセスを終了」、「この警告を放置」、「プロセスを除外に追加」を示す。
【0204】
ユーザーが「プロセスを終了」を選択した場合には、プロセス"AAATextEditor.exe"を直ちに終了させる。ユーザーが、そのプロセスをランサムウェアであると判断した場合である。
【0205】
ユーザーが「この警告を放置」を選択した場合には、プロセス"AAATextEditor.exe"を終了させることなく、そのまま処理を続行する。ユーザーが、そのプロセスをランサムウェアであるか否か判断できない又は判断を保留する場合である。
【0206】
ユーザーが「プロセスを除外に追加」を選択した場合には、プロセス"AAATextEditor.exe"を、
図25に示すように、「除外リスト」に追加し、同じプロセスに対する警告を再度行わないようにする。ユーザーが、そのプロセスはランサムウェアでないと判断した場合である。
【0207】
なお、監視対象プログラムからの除外リスト(ホワイトリスト)の参照および追加は、直接ハードディスク22上のファイルへアクセスするよう実装してもよいし、一度常駐プログラムを経由してアクセスするように実装してもよい。
【0208】
(対処行動)
本発明プログラムが、監視対象プログラムをランサムウェアであると判断した場合の対処行動について説明する。
【0209】
監視対象のプログラムをランサムウェアであると判断した場合には、WriteFileによるファイルへの書き込みは行わず、監視対象プログラムによるプロセスを強制終了する。
【0210】
プロセスの強制終了は、WriteFileをフックしているHookWriteFile関数内で行う。一般的には、ExitProcess関数や、Exit関数等を用いることで実現できるが、プロセスを終了可能な命令であればいかなるものを使用してもよい。
【0211】
プロセスの強制終了により、ランサムウェアによるファイルの暗号化を防ぐことができる。プロセスの強制終了では、当該ファイルは暗号化されないため、事前のファイルのバックアップ等も不要である。
【0212】
なお、直ちにプロセスを終了させることにより不都合が生じる可能性のある環境においては、例えば、ユーザーに強制終了予定であることを事前に通知し、強制終了するか否かの判断を仰ぐようにしてもよい。また、後述する「付加機能による検出精度のコントロール」の機能を用いて対応するようにしてもよい。
【0213】
(HookReadFileとHookWriteFile)
図26に、本発明プログラムによるHookReadFileによる動作とHookWriteFileによる動作のイメージをまとめて示す。
【0214】
図26左部に監視対象プログラムのプロセスを示し、
図26右部に本発明プログラムのプロセスを示す。
【0215】
図26左側の監視対象プログラムのプロセスには、本発明プログラムのフック機能であるHookReadFileとHookWriteFileが組み込まれている。
【0216】
組み込まれたHookReadFileは、通常のReadFileの動作に加えて、(a)通知元API名、(b)自身のプロセスID、(c)ReadFile対象ファイルパスを、
図19右側の本発明プロセスに通知する。
【0217】
図26右側の本発明プログラムのプロセスは、
図26左側のHookReadFileからの通知を受け取り、通知記録データとして順次記録する。
【0218】
組み込まれたHookWriteFileは、自身(監視対象プロセス)のプロセスIDと、WriteFileの対象ファイルパスに基づいて、
図26右部の本発明プログラムのプロセスに対して、ReadFileの通知記録データ中に、同一プロセスID、同一対象ファイルパスのReadFileの記録があるか否かを問い合わせる。
図26右側の本発明プログラムは、同一プロセスID、同一対象ファイルパスのReadFileの記録があるか否かをHookWriteFileに応答する。
【0219】
組み込まれたHookWriteFileは、更に、書き換え対象ファイルがテキストファイルの場合にユーザーに通知し、その対処方法の選択肢をユーザーに示す。
【0220】
ユーザーにより監視対象プロセスの除外リストへの追加が選択された場合には、除外リストに当該プロセスを追加する。
【0221】
ユーザーにより監視対象プロセスの終了が選択された場合には、監視対象プロセスを強制終了する。
【0222】
(Windows APIのフック方法)
本発明プログラムが、Windows APIをフックする具体的な方法について、
図27乃至
図34を用いて説明する。
【0223】
すべてのWindowsプログラムは、起動するとそれぞれのプロセス空間(メモリ空間)と呼ばれる仮想メモリ上に配置される仕組みとなっている。
【0224】
それぞれのプロセス空間には、マルウェアのプロセス空間の状態を拡大して表示した
図27に示すように、Import Address Table(IAT)という項目があり、IAT にはプログラムが使用する関数(API)の一覧とそれに応じたメモリアドレス(番地)が記録されている。これはプログラムが動作する際に、どういった関数がどこのメモリに読み込まれているかを把握するための一般的な仕組みである。
【0225】
この前提のもとフック制御を行う方法について記述する。
【0226】
まず、
図28に示すように、監視対象プログラムのプロセス空間に、フック用の WriteFile関数(HookWriteFile関数)を埋め込む。自分以外の他のプロセスにコードを注入する、すなわち、コードをインジェクションするには、そのプロセスのメモリ空間において、VirtualAllocEx関数というWindows APIを利用し、まだ使用されていない領域に一定サイズのメモリ領域を確保する。
図28右部の網掛け部分がそのメモリ領域である。
【0227】
次に、
図29に示すように、WriteProcessMemoryというWindows APIを利用し、確保したメモリ領域に実行させたいコード、ここではHookWriteFile関数本体、および、その HookWriteFile関数を監視対象プログラムのプロセス空間内のIATへ組み込むための関数Aを書き込む。この動作を
図29の太線矢印で示す。なお、確保したメモリ領域の具体的なアドレスはVirtualAllocExの戻り値を確認することで取得することができる。
【0228】
次に、
図30に示すように、書き込んだコード(関数A)を実行させるために CreateRemoteThreadというWindows APIを呼び出すことにより、その任意のコードをマルウェアのプロセス空間上で実行することができる。この動作を
図30の太線矢印で示す。
【0229】
ここで、監視対象プログラムのプロセス空間のみに注目すると、
図31に示すようになる。
【0230】
次に、
図32に示すように、CreateRemoteThreadにより、関数Aが実行されると、関数 Aは、監視対象プログラムのプロセス空間のIATにおける、正規のWriteFile関数のアドレス(
図32ではアドレス"0x46700000"番地)を、HookWriteFile関数のアドレス(
図32ではアドレス"0x49000000"番地)へ書き換える。これでフックの事前処理が完了する。
【0231】
なお、どの関数がどのアドレスに展開されているか、すなわち、IATにあるその関数に対応するアドレス、を知るには、GetProcAddressというWindows APIの引数に関数名を渡すことで、指定した関数がプロセス空間のどのアドレスに対応づけられているのか、具体的なアドレスを知ることができる。
【0232】
次に、
図33及び
図34に示すように、監視対象プログラムが、例えば"0x3C0"というファイルハンドルの指すファイル内容を書き換えようとしたと仮定する。その場合、WriteFile関数が呼び出されると、監視対象プログラムは自身のプロセス空間内のIATを参照した結果、正規の WriteFile関数ではなく、HookWriteFile関数に"0x3C0"というパラメータを渡すことになる。
【0233】
HookWriteFile関数の内部では、任意の処理を行うことが可能である。具体的には、本来WriteFileを使用して書き込むデータの内容を事前にチェックする、変更する等である。本発明プログラムにおけるHookWriteFile関数の内容は、前述のとおりである。
【0234】
(付加機能による検出精度のコントロール)
本発明プログラムが監視対象プログラムをランサムウェアであると判断した場合には、ランサムウェアによるファイルの暗号化を防ぐため、監視対象プログラムによるプロセスを強制終了する。
【0235】
しかしながら、環境によっては、直ちにプロセスを強制終了させることにより不都合が生じる場合がある。そこで、本発明プログラムに付加機能を設けて、ランサムウェアの検出精度をコントロールするようにする。
【0236】
(HookFindNextFileによるコントロール)
HookFindNextFileは、FindNextFile(ファイル検索関数)をフックするWindows API関数である。
【0237】
ReadFile(ファイル読出関数)をフックするHookReadFile、WriteFile(ファイル書込関数)をフックするHookWriteFileに加えて、HookFindNextFileによりFindNextFile(ファイル検索関数)をフックするようにして、ランサムウェアの検出精度を向上させる。
【0238】
FindFirstFileとFindNextFileは、ファイルの検索や列挙に使用するWindows API関数であり、通常、セットで使用される。
【0239】
図35に、FindFirstFileとFindNextFileによる動作を示す。
【0240】
まず、場所を指定してFindFirstFileを呼び出すと、その場所の最初のファイルの情報がシステムから応答され、最初のファイルの情報(AAA.txt)が取得できる。
【0241】
次に、FindNextFileを呼び出すと、FindFirstFileにより取得したファイルハンドルから、その場所の次のファイルの情報(BBB.pdf)が取得できる。
【0242】
以降、FindNextFileを呼び出すことにより、その場所の更に次のファイルの情報(CCC.txt、DDD.exe、…)を順次取得できる。
【0243】
したがって、HookReadFile、HookWriteFileによる上述したランサムウェアの検知時に、FindFirstFileやFindNextFileが常に呼び出されている場合には、ランサムウェアが連続してファイルの暗号化を行っていると判断することができる。
【0244】
図36に示すように、まず、FindFirstFileを呼び出し、ある場所の最初のファイルの情報を取得する。続いて、ReadFileとWriteFileを呼び出し、そのファイルの暗号化処理を行う。次に、FindNextFileを呼び出し、その場所の次のファイルの情報を取得する。続いて、ReadFileとWriteFileを呼び出し、そのファイルの暗号化処理を行う。次に、同様に、FindNextFileを呼び出し、その場所の次のファイルの情報を取得する。続いて、ReadFileとWriteFileを呼び出し、そのファイルの暗号化処理を行う。以降、同様な処理を繰り返して、その場所のファイルを連続して暗号化する。
【0245】
このようなファイルの連続した暗号化処理を検出するためには、FindNextFileのみをフックして監視すればよい。FindFirstFileは必ずしもフックして監視しなくともよい。
【0246】
FindNextFileをフックするHookFindNextFileは、呼び出されると通常のFindNextFileの動作に加えて、本発明プログラムに対して次の情報(a)〜(c)を通知する。
【0247】
通知手段としては、プロセス間通信等、プロセスの動作に大きな遅延を発生させない程度の高速な手法が望ましい。ソケット通信やファイルによる受け渡し等でも、高速に実現できる環境であれば、いかなる方法でもよい。
(a)通知元API名。フックするWindows API関数の名前であるFindNextFileである。
(b)自身のプロセスID。フックするFindNextFileを呼び出す監視対象プロセスのプロセスIDである。
(c)通知元APIであるFindNextFileのパラメータで指定されたデータバッファから取得できるファイル名。データバッファには次のファイルの情報が格納されている。
【0248】
したがって、HookReadFile、HookWriteFileによりランサムウェアが検知されたことを条件として、その暗号化処理の前に、FindNextFileが呼び出され、かつ、取得された次のファイル名がReadFileおよびWriteFileの対象ファイルと合致するかどうかを確認することにより、暗号化処理が複数のファイルに対して連続して行われていることを判断することができる。
【0249】
上記を判断するためには、例えば、HookReadFile、HookWriteFile、HookNextFileが、それぞれ、本発明プログラムに対して通知する(a)通知元API名、(b)プロセスID、(c)ファイルパスを、通知記録データに記録しておき、その通知記録データに基づいて判断する。
【0250】
図37に通知記録データの具体例を示す。
【0251】
図37の通知記録データには、第4〜6行に、FindNextFileのプロセスID"pid:1568"、ファイルパス"C:\Users\user\Documents\schedule.xls"の記録があり、第7〜9行、第13〜15行に、ReadFileのプロセスID"pid:1568"、ファイルパス"C:\Users\user\Documents\schedule.xls"の記録があり、第10〜12行、第16〜118行に、WriteFileのプロセスID"pid:1568"、ファイルパス"C:\Users\user\Documents\schedule.xls"の記録がある。
【0252】
FindNextFileのプロセスIDとファイルパスは、ReadFileとWriteFileのプロセスIDとファイルパスと同一である。WriteFileにより、ファイル"schedule.xls"のヘッダが変更されたことが検出された場合には、暗号化処理が複数のファイルに対して連続して行われていると判断する。
【0253】
図37の通知記録データには、更に、第22〜36行に、同じフォルダ
"C:\Users\user\Documents\"内のファイル"description.doc"に対して同様な処理を行っていることが記録されている。WriteFileにより、ファイル"description.doc"のヘッダが変更されたことが検出された場合には、暗号化処理が同一フォルダ内の複数のファイルに対して連続して行われていると判断する。
【0254】
暗号化処理が複数のファイルに対して連続して行われているかの判断を有効にするか設定することにより、ランサムウェアによる暗号化処理に対する検知挙動の精度をコントロールすることができる。
【0255】
図38は、複数ファイルに対する暗号化処理を有効にするかの設定画面である。
図38の設定画面の表現方法は一例であり、他の表現方法でもよい
設定画面では、チェックボタンの後に「複数のファイルに対する暗号化処理を検知条件の入れる」を表示すると共に、「チェックを入れない場合は単一ファイルに対する暗号化処理も検知対象に含まれます」との注意書きを表示する。ユーザーがチェックボタンをチェックすることに検知条件を変更することができる。
【0256】
例えば、単一のファイルに対する暗号化処理を行う可能性のあるユーザー環境では、この検知条件がないと、正当な暗号化処理をランサムウェアによる処理と誤検知することとなる。このような誤検知、誤検知による過検知を発生させないようにすることができる。
【0257】
(HookMoveFileによるコントロール)
HookMoveFileは、MoveFile(MoveFileA、MoveFileW、MoveFileExA、MoveFileExW)(ファイル移動関数)をフックするWindows API関数である。
【0258】
ReadFile(ファイル読出関数)をフックするHookReadFile、WriteFile(ファイル書込関数)をフックするHookWriteFileに加えて、HookMoveFileによりMoveFile(ファイル移動関数)をフックするようにして、ランサムウェアの検出精度を向上させる。
【0259】
MoveFileは、ファイルの移動及びファイル名の変更を行うためのWindows API関数である。
図39に示すように、MoveFileの第一引数は移動元のファイルパス(ファイル名)であり、第二引数は移動先のファイルパス(ファイル名)である。
【0260】
MoveFileの第一引数と第二引数のファイル名を除くファイルパスが異なる場合は、「ファイルの移動」の処理になる。MoveFileの第一引数と第二引数のファイル名を除くファイルパスが同じ場合は、実質的に「ファイル名の変更」の処理となる。
【0261】
ランサムウェアには、暗号化対象のファイル名を暗号化後に変更するものがある。これは、暗号化ファイルの元ファイル名を判断不能にするためであり、ファイルの中身だけではなくファイル名も同時に暗号化処理を行う。
【0262】
そのようなランサムウェアは、
図40に示すように、ファイルの暗号化処理が行われた直後にMoveFileを呼び出すことで、ファイル名の暗号化も併せて行う。その流れを検知することで、ランサムウェアによるファイル名の暗号化挙動を本発明プログラムが把握することを可能にする。
【0263】
図40に示すように、FindNextFileを呼び出し、その場所の次のファイルの情報を取得する。続いて、CreateFile、ReadFile、WriteFileを呼び出し、そのファイルの暗号化処理を行う。続いて、MoveFileを呼び出し、そのファイルのファイル名を暗号化している。
図40では、MoveFileにより、暗号化されたファイル"ABS.pdf"のファイル名が"g1d4fr.vvv"に変更されている。
【0264】
このようなファイル名の暗号化処理を検出するために、MoveFileをフックして監視する。MoveFileをフックするHookMoveFileは、呼び出されると通常のMoveFileの動作に加えて、本発明プログラムに対して次の情報(a)〜(c)を通知する。
【0265】
通知手段としては、プロセス間通信等、プロセスの動作に大きな遅延を発生させない程度の高速な手法が望ましい。ソケット通信やファイルによる受け渡し等でも、高速に実現できる環境であれば、いかなる方法でもよい。
(a)通知元API名。フックするWindows API関数の名前であるMoveFileである。
(b)自身のプロセスID。フックするMoveFileを呼び出す監視対象プロセスのプロセスIDである。
(c)通知元APIであるMoveFileの第一引数と第二引数で指定されたファイルパス。
【0266】
したがって、HookReadFile、HookWriteFileによりランサムウェアが検知されたことを条件として、その暗号化処理の後に、MoveFileが呼び出され、かつ、MoveFileの第一引数と第二引数のパス(ファイルパスからファイル名を除いたファイルパス)が同一であるかどうかを確認することにより、ファイル名に対する暗号化処理が行われていることを判断することができる。
【0267】
上記を判断するためには、例えば、HookReadFile、HookWriteFileが、それぞれ、本発明プログラムに対して通知する(a)通知元API名、(b)プロセスID、(c)ファイルパス、MoveFileが、それぞれ、本発明プログラムに対して通知する(a)通知元API名、(b)プロセスID、(c)第一引数のファイルパス、(d)第二引数のファイルパスを、通知記録データに記録しておき、その通知記録データに基づいて判断する。
【0268】
図41に通知記録データの具体例を示す。
【0269】
図41の通知記録データには、第4〜6行、第10〜12行に、ReadFileのプロセスID"pid:1568"、ファイルパス"C:\Users\user\Documents\schedule.xls"の記録があり、第7〜9行、第13〜15行に、WriteFileのプロセスID"pid:1568"、ファイルパス"C:\Users\user\Documents\schedule.xls"の記録があり、第16〜19行に、MoveFileのプロセスID"pid:1568"、第一引数ファイルパス"C:\Users\user\Documents\schedule.xls"、第二引数ファイルパス"C:\Users\user\Documents\g1d4fr6ps.vvv"の記録がある。
【0270】
MoveFileのプロセスIDは、ReadFileとWriteFileのプロセスIDと同一であり、MoveFileの第一引数のファイルパスは、ReadFileとWriteFileのファイルパスと同一であり、MoveFileの第1引数のパスと第2引数のパスは同一である。WriteFileによりファイル"schedule.xls"のヘッダが変更されたことが検出された場合には、"schedule.xls"が暗号化処理され、かつ、"schedule.xls"のファイル名も"g1d4fr6ps.vvv"に暗号化処理されていると判断する。
【0271】
図41の通知記録データには、更に、第22〜37行に、同じフォルダ
"C:\Users\user\Documents\"内のファイル"description.doc"に対して同様な処理を行っていることが記録されている。WriteFileによりファイル"description.doc"のヘッダが変更されたことが検出された場合には、"description.doc"が暗号化処理され、かつ、"description.doc"のファイル名も"p6dfg7p4.vvv"暗号化処理されていると判断する。
【0272】
ファイルに対する暗号化処理を検知した上で、ファイル名の変更が行われていることを検知した場合、本発明プログラムは、その情報をユーザーに示して、ランサムウェアによる暗号化処理に対する検知挙動の精度をコントロールすることができる。
【0273】
図42は、ファイル名の変化を検知した場合に警告するか否かの設定画面である。
図42の設定画面の表現方法は一例であり、他の表現方法でもよい
設定画面では、チェックボタンの後に「「ファイル名の変化」を検知条件に入れる」を表示すると共に、「チェックを入れない場合はファイル名が変化しない暗号化処理も検知対象に含まれます」「チェックを入れた場合はファイル名の変化に関する情報が検知時に表示され、対処を選択可能となります」との注意書きを表示する。ユーザーがチェックボタンをチェックすることで警告するか否かを設定することができる。
【0274】
図43は、ファイル内容が改変され、かつ、ファイル名が改変された場合の警告画面である。慎重なユーザーはこの情報を元にどう対処するかを選択できユーザビリティが向上するとともに、誤検知、誤検知による過検知のコントロールも可能となる。
【0275】
警告画面では「以下のプロセスがテキストファイルの改変挙動を行っています。どう処理しますか。」と尋ね、「プロセス:AAAA.exe」、「該当挙動:ファイル内容の改変、ファイル名の改変、「d1g2r.vvv」に変更しようとしています」、「「対象ファイル:C:\Users\test\Document\BBB.pdf」を示す。
【0276】
更に、その対応処理の選択ボタン「プロセスを終了」、「この警告を放置」、「プロセスを除外に追加」を示す。
【0277】
ユーザーが「プロセスを終了」を選択した場合には、プロセス"AAAA.exe"を直ちに終了させる。ユーザーが、そのプロセスをランサムウェアであると判断した場合である。
【0278】
ユーザーが「この警告を放置」を選択した場合には、プロセス"AAAA.exe"を終了させることなく、そのまま処理を続行する。ユーザーが、そのプロセスをランサムウェアであるか否か判断できない又は判断を保留する場合である。
【0279】
ユーザーが「プロセスを除外に追加」を選択した場合には、プロセス"AAAA.exe"を、前述した「除外リスト」に追加し、同じプロセスに対する警告を再度行わないようにする。ユーザーが、そのプロセスはランサムウェアでないと判断した場合である。
【0280】
[第2実施形態]
本発明の第2実施形態によるプログラム、情報処理装置及び情報処理方法について
図44乃至
図51を用いて説明する。
【0281】
本発明の第1実施形態は、主なランサムウェアの挙動を分析して共通部分を洗い出し、そこから確実に不正であると判断できる挙動を検知・防御するものである。しかしながら、分析したランサムウェアによる手法でなくても、ファイルの暗号化処理は可能である。
【0282】
そこで、本願発明者等は、分析したランサムウェア以外の想定しうる挙動を検出することにより、未知のランサムウェアを確実に検出し、ランサムウェアによる攻撃を有効に阻止することができると考え、本実施形態を着想するに至った。
【0283】
本願発明者等が想定した暗号化手法について説明する。
図44に本願発明者等が想定した暗号化手法を示す。
【0284】
あるファイルAを暗号化対象とした場合、本発明の第1実施形態では、暗号化されたファイルは元のファイルに直接上書き処理している。しかしながら、直接上書き処理しなくても、暗号化されたファイルを元のファイルが存在したフォルダに存在する状態にすることができる。
【0285】
図44の暗号化方法について、ステップの番号順に説明する。
(ステップ1):ReadFileにより、ファイルAを読み込みメモリ23上で暗号化する。
(ステップ2):メモリ23上のファイルAの暗号化されたデータを、WriteFileにより、任意の場所にファイルBとして作成する。
(ステップ3−A):暗号化されたファイルBを、MoveFileにより、ファイル名をファイルCに変更する。
(ステップ3−B):暗号化されたファイルBを、MoveFileにより、ファイル名をファイルAに変更し、ファイルAが存在したフォルダに移動することでファイルAを上書きする。
(ステップ4):MoveFileにより、ファイルCをファイルAが存在したフォルダに移動する。
(ステップ5):DeleteFileにより、ファイルAを削除する。
【0286】
ステップ5の後は、ファイルAが存在したフォルダに、暗号化されたファイルAのファイル名がファイルCに変更された「状態1」となる。
【0287】
ステップ3−Bの後は、ファイルAが存在したフォルダに、暗号化されたファイルAが存在する「状態2」となる。
【0288】
図45に暗号化方法の複数のケースを示す。
【0289】
暗号化方法のケース1は、ステップ1、ステップ2、ステップ3−A、ステップ4、ステップ5の順番に進行し、状態1となるケースである。
【0290】
暗号化方法のケース1は、ステップ1、ステップ2、ステップ3−Bの順番に進行し、状態2となるケースである。
【0291】
本実施形態では、例えば、ケース1、ケース2を検知することにより、分析したランサムウェア以外の想定しうる挙動を検出するようにする。
【0292】
なお、「状態1」「状態2」となるための挙動はケース1、ケース2に限らないが、そのような別のケースについても、後述する検知方法と同様の方法により検知することが可能である。
【0293】
本実施形態においても、第1実施形態におけるHookReadFile、HookWriteFileによる暗号化処理を検知する。本実施形態では、それに加えて、MoveFile(MoveFileA、MoveFileW、MoveFileExA、MoveFileExW)(ファイル移動関数)をフックするHookMoveFileや、DeleteFile(ファイル削除関数)をフックするHookDeleteFileを用いる。
【0294】
そして、HookReadFile、HookWriteFile、HookDeleteFileが、それぞれ、本発明プログラムに対して(a)通知元API名、(b)プロセスID、(c)ファイルパスを通知し、HookMoveFileが、本発明プログラムに対して(a)通知元API名、(b)プロセスID、(c)第一引数のファイルパス、(d)第二引数のファイルパスを通知する。本発明プログラムに通知された、これらデータは、適宜、所定のリストに記録する。
【0295】
(ケース1の検知)
図48に、ケース1の検知の事前処理を示す。
【0296】
本発明プログラムに対して、HookReadFileから通知される、(a)通知元API名、(b)プロセスID、(c)ファイルパスを、リストAとして記録する。
【0297】
本発明プログラムに対して、HookWriteFileから通知される、(a)通知元API名、(b)プロセスID、(c)ファイルパスを、リストBとして記録する。
【0298】
本発明プログラムに対して、HookMoveFileから通知される、(a)通知元API名、(b)プロセスID、(c)第一引数のファイルパス、(d)第二引数のファイルパスを、リストCとして記録する。
【0300】
条件1:あるプロセスにより、DeleteFileが呼び出され、引数のファイルパス(削除対象のファイル)がリストAに含まれている。すなわち、HookDeleteFileから通知されるプロセスIDが、HookReadFileから通知されるプロセスIDと同一であり、かつ、HookDeleteFileから通知されるファイルパスがリストAに含まれている。
【0301】
条件1の具体例を
図47に示す。
図47に示すように、あるプロセスにより、DeleteFileが呼び出され、引数のファイルパス"C:\DDD\CC.doc"がリストAに含まれている。
【0302】
この条件1は、あるプロセスが過去にReadFileで読み込んだことがあるファイルをDeleteFileにより削除しようとしていることを意味する。
【0303】
条件2:DeleteFileの引数(削除対象ファイルの)のフォルダパスが、リストCの第二引数のフォルダパスと等しい。すなわち、HookDeleteFileから通知されるプロセスIDが、HookMoveFileから通知されるプロセスIDと同一であり、かつ、HookDeleteFileから通知されるファイルパスからファイル名を除いたパスが、リストCの第二引数からファイル名を除いたパスと同一である。
【0304】
条件2の具体例を
図48に示す。
図48に示すように、DeleteFileの引数のフォルダパス"C:\DDD\"が、リストCの第二引数のフォルダパス"C:\DDD\"と等しい。
【0305】
この条件2は、あるプロセスが削除しようとしているファイルの場所が、過去にそのプロセスが何らかのファイルを移動先として指定した記録があるということを意味する。
【0306】
条件3:MoveFileの第一引数のファイルが、リストBに含まれている。すなわち、HookWriteFileから通知されるプロセスIDが、HookMoveFileから通知されるプロセスIDと同一であり、かつ、HookMoveFileから通知される第一引数のファイルパスと同一である。
【0307】
条件3の具体例を
図49に示す。
図49に示すように、MoveFileの第一引数のファイル"C:\XXX\VV.doc"が、リストBに含まれている。
【0308】
この条件3は、あるプロセスが過去にWriteFileで書き込んだファイルを、MoveFileで移動させようとしていることを意味する。
【0309】
条件4:上記の条件2を満足したMoveFileの第一引数のファイルのヘッダが、第1の条件を満足したDeleteFileの引数のファイルのヘッダと異なる。
【0310】
条件4の具体例を
図50に示す。
図50に示すように、MoveFileの第一引数のファイル"C:\DDD\CC.doc"のヘッダが、第1の条件を満足したDeleteFileの引数のファイル"C:\XXX\VV.doc"のヘッダと異なる。
【0311】
この条件4は、第1実施形態におけるファイルのヘッダの相違の判断条件と同じである。
【0312】
(ケース2の検知)
図51に、ケース2の検知の事前処理を示す。
【0313】
本発明プログラムに対して、HookReadFileから通知される、(a)通知元API名、(b)プロセスID、(c)ファイルパスを、リストAとして記録する。
【0314】
本発明プログラムに対して、HookWriteFileから通知される、(a)通知元API名、(b)プロセスID、(c)ファイルパスを、リストBとして記録する。
【0316】
条件1:あるプロセスにより、MoveFileが呼び出され、第二引数のファイルパスがリストAに含まれている。すなわち、HookMoveFileから通知されるプロセスIDが、HookReadFileから通知されるプロセスIDと同一であり、かつ、HookMoveFileから通知される第二引数のファイルパスがリストAに含まれている。
【0317】
この条件1は、このプロセスが過去にReadFileで読み込んだ事があるファイルを何らかのファイルで上書きしようとしていることを意味する。
【0318】
条件2:その際、MoveFileの第一引数のファイルパスが、リストBに含まれている。すなわち、HookMoveFileから通知されるプロセスIDが、HookWriteFileから通知されるプロセスIDと同一であり、かつ、HookMoveFileから通知される第一引数のファイルパスがリストBに含まれている。
【0319】
この条件2は、このプロセスが過去にWriteFileで書き込んだことがあるファイルを、移動させようとしていることを意味する。
【0320】
条件3:MoveFileの第一引数のファイルのヘッダが、第二引数のファイルのヘッダと異なる。
【0321】
この条件3は、第1実施形態におけるファイルのヘッダの相違の判断条件と同じである。
【0322】
[変形実施形態]
本発明は上記実施形態に限らず種々の変形が可能である。
【0323】
例えば、上記実施形態では、マイクロソフトのオペレーティングシステムであるマイクロソフトウィンドウズ(Microsoft Windows)に本発明を適用したが、Android、BSD、iOS、Linux、OS X、Windows Phone、IBM z/OS(全て登録商標)等の他のオペレーティングシステムに本発明を適用してもよい。各オペレーティングシステムに対するランサムウェアによる攻撃を確実かつ有効に阻止することができる。
【解決手段】所定のプロセスから呼び出されるファイル書込関数がデータを書き込むファイルパスと同一のファイルパスに対して、所定のプロセスからファイル読出関数が既に呼び出されているという第1の条件と、ファイル書込関数が、ファイルパスのファイルのヘッダを書き換えるという第2の条件とを満足する場合に、所定のプロセスをマルウェアと判断する。