特許第6297425号(P6297425)IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ エヌ・ティ・ティ・コミュニケーションズ株式会社の特許一覧

特許6297425攻撃コード検出装置、攻撃コード検出方法、及びプログラム
<>
  • 特許6297425-攻撃コード検出装置、攻撃コード検出方法、及びプログラム 図000002
  • 特許6297425-攻撃コード検出装置、攻撃コード検出方法、及びプログラム 図000003
  • 特許6297425-攻撃コード検出装置、攻撃コード検出方法、及びプログラム 図000004
  • 特許6297425-攻撃コード検出装置、攻撃コード検出方法、及びプログラム 図000005
  • 特許6297425-攻撃コード検出装置、攻撃コード検出方法、及びプログラム 図000006
  • 特許6297425-攻撃コード検出装置、攻撃コード検出方法、及びプログラム 図000007
  • 特許6297425-攻撃コード検出装置、攻撃コード検出方法、及びプログラム 図000008
  • 特許6297425-攻撃コード検出装置、攻撃コード検出方法、及びプログラム 図000009
  • 特許6297425-攻撃コード検出装置、攻撃コード検出方法、及びプログラム 図000010
  • 特許6297425-攻撃コード検出装置、攻撃コード検出方法、及びプログラム 図000011
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】6297425
(24)【登録日】2018年3月2日
(45)【発行日】2018年3月20日
(54)【発明の名称】攻撃コード検出装置、攻撃コード検出方法、及びプログラム
(51)【国際特許分類】
   G06F 21/56 20130101AFI20180312BHJP
【FI】
   G06F21/56 320
【請求項の数】8
【全頁数】14
(21)【出願番号】特願2014-130741(P2014-130741)
(22)【出願日】2014年6月25日
(65)【公開番号】特開2016-9405(P2016-9405A)
(43)【公開日】2016年1月18日
【審査請求日】2017年2月9日
(73)【特許権者】
【識別番号】399035766
【氏名又は名称】エヌ・ティ・ティ・コミュニケーションズ株式会社
(74)【代理人】
【識別番号】100107766
【弁理士】
【氏名又は名称】伊東 忠重
(74)【代理人】
【識別番号】100070150
【弁理士】
【氏名又は名称】伊東 忠彦
(72)【発明者】
【氏名】田中 恭之
【審査官】 平井 誠
(56)【参考文献】
【文献】 特開2015−127906(JP,A)
【文献】 田中 恭之,攻撃コードの特徴からみた対策の検討,2014年 暗号と情報セキュリティシンポジウム,2014年 1月21日,p.1-8
(58)【調査した分野】(Int.Cl.,DB名)
G06F 21/56
(57)【特許請求の範囲】
【請求項1】
入力データから攻撃コードを検出する攻撃コード検出装置であって、
前記入力データの中から、所定のデータ長の部分データ列を複数取り出す取得手段と、
前記複数の部分データ列について、各部分データ列の数値が所定の範囲に集中する度合を評価する評価手段と、
前記評価手段による評価結果に基づいて、前記入力データにおける前記攻撃コードの検出結果を出力する出力手段と
を備えることを特徴とする攻撃コード検出装置。
【請求項2】
前記評価手段は、前記複数の部分データ列について、特定の数値に該当する部分データ列が存在するか否かについて更に評価を行う
ことを特徴とする請求項1に記載の攻撃コード検出装置。
【請求項3】
前記特定の数値は、メモリにおけるコードの実行権を制御する所定の関数の引数である
ことを特徴とする請求項2に記載の攻撃コード検出装置。
【請求項4】
前記評価手段は、前記各部分データ列の数値が所定の範囲に集中する度合の評価として、部分データ列間の差分の大きさが所定の閾値よりも小さいか否かの評価を行う
ことを特徴とする請求項1ないし3のうちいずれか1項に記載の攻撃コード検出装置。
【請求項5】
前記評価手段は、前記取得手段により取得される部分データ列が、コンピュータのメモリ空間におけるユーザ領域外のアドレスを示す場合に、当該部分データ列を前記評価の対象外とする
ことを特徴とする請求項1ないし4のうちいずれか1項に記載の攻撃コード検出装置。
【請求項6】
前記攻撃コードはROPコードであることを特徴とする請求項1ないし5のうちいずれか1項に記載の攻撃コード検出装置。
【請求項7】
コンピュータを、請求項1ないし6のうちいずれか1項における攻撃コード検出装置における各手段として機能させるためのプログラム。
【請求項8】
入力データから攻撃コードを検出する攻撃コード検出装置が実行する攻撃コード検出方法であって、
前記攻撃コード検出装置が、前記入力データの中から、所定のデータ長の部分データ列を複数取り出す取得ステップと、
前記攻撃コード検出装置が、前記複数の部分データ列について、各部分データ列の数値が所定の範囲に集中する度合を評価する評価ステップと、
前記攻撃コード検出装置が、前記評価ステップによる評価結果に基づいて、前記入力データにおける前記攻撃コードの検出結果を出力する出力ステップと
を備えることを特徴とする攻撃コード検出方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、コンピュータの脆弱性を狙った不正プログラムを検出する技術に関連するものである。
【背景技術】
【0002】
コンピュータの脆弱性を狙った不正プログラムによる攻撃が重要な問題となっている。通常、そのような攻撃により、コンピュータシステムの脆弱性が明らかになると、脆弱性を無くすための脆弱性パッチがリリースされ、ユーザに配布される。しかし、脆弱性パッチがリリースされる前に、攻撃手法やツールが公になって、攻撃が行われるゼロデイ攻撃が後を絶たない。
【0003】
上記の攻撃の特徴は、DEP(Data Execution Prevention、データ実行防止)等のコンピュータ側の防御手法を回避するために、ROP(Return Oriented Programming)に代表されるコードリユースという攻撃手法が多く用いられることである。コードリユースを正確にとらえるためにはその性質上、コンピュータ側のメモリ状態を把握する必要がある。例えば、特許文献1には、ホストコンピュータ側でメモリ状態を把握して攻撃を回避する技術が開示されている。
【0004】
また、昨今の標的型攻撃では、攻撃コードを埋め込んだ悪性文書ファイルを送付し、被害者がファイルを開くことでマルウェア感染等が引き起こされ、情報の搾取等がなされるケースが多い。このような悪性文書ファイルにも最新のものについてはROP攻撃コードが含まれているケースが出てきている。例えば、特許文献2には、文書ファイルから悪意のあるシェルコード等を動的に検出する技術が記載されている。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】特開2011−258019号公報
【特許文献2】特開2013−239149号公報
【非特許文献1】三村 守,田中 英彦 : Handy Scissors:悪性文書ファイルに埋め込まれた実行ファイルの自動抽出ツール,情報処理学会論文誌,Vol.54,No.3,pp.1211-1219(Mar. 2013).
【非特許文献2】大坪 雄平,三村 守,田中 英彦 : ファイル構造検査による悪性 MS 文書ファイル検知手法の検知, 情報処理学会研究報告, Vol.2013-IOT-22, No.16 (2013).
【非特許文献3】Boldewin, F.: Analyzing MSOffice malware with OfficeMalScanner (2009), http://www.reconstructer.org/code.html
【発明の概要】
【発明が解決しようとする課題】
【0006】
しかし、例えば特許文献2に記載されたような動的解析により攻撃コード(悪意のあるシェルコード等)を検出する手法は、攻撃コードにより試験環境が被害を受ける可能性があり危険であるとともに、エクスプロイトコード等を作動させるためにOSやアプリケーションのバージョン・パッチレベルを適切に合わせた特定の環境を整えなければならない等、解析に手間がかかるという問題がある。
【0007】
本発明は上記の点に鑑みてなされたものであり、文書ファイル等の入力データ内の攻撃コードを静的解析により検出する技術を提供することを目的とする。
【課題を解決するための手段】
【0008】
本発明の実施の形態によれば、入力データから攻撃コードを検出する攻撃コード検出装置であって、
前記入力データの中から、所定のデータ長の部分データ列を複数取り出す取得手段と、
前記複数の部分データ列について、各部分データ列の数値が所定の範囲に集中する度合を評価する評価手段と、
前記評価手段による評価結果に基づいて、前記入力データにおける前記攻撃コードの検出結果を出力する出力手段とを備える攻撃コード検出装置が提供される。
【0009】
また、本発明の実施の形態によれば、入力データから攻撃コードを検出する攻撃コード検出装置が実行する攻撃コード検出方法であって、
前記攻撃コード検出装置が、前記入力データの中から、所定のデータ長の部分データ列を複数取り出す取得ステップと、
前記攻撃コード検出装置が、前記複数の部分データ列について、各部分データ列の数値が所定の範囲に集中する度合を評価する評価ステップと、
前記攻撃コード検出装置が、前記評価ステップによる評価結果に基づいて、前記入力データにおける前記攻撃コードの検出結果を出力する出力ステップと
を備えることを特徴とする攻撃コード検出方法が提供される。
【発明の効果】
【0010】
文書ファイル等の入力データ内の攻撃コードを静的解析により検出する技術を提供できる。
【図面の簡単な説明】
【0011】
図1】悪性文書ファイルの動作を説明するための図である。
図2】ROPコードを含む悪性文書ファイルの内容例を示す図である。
図3】本発明の実施の形態に係る悪性文書ファイル検出装置100の機能構成図である。
図4】悪性文書ファイル内のROPコードを説明するための図である。
図5】ROPコードの例を示す図である。
図6】メモリ領域の例を示す図である。
図7】攻撃コード判定部103における動作例を示すフローチャートである。
図8】ダブルワード間の比較の例を示す図である。
図9】疑似コード例1を示す図である。
図10】疑似コード例2を示す図である。
【発明を実施するための形態】
【0012】
以下、図面を参照して本発明の実施の形態を説明する。なお、以下で説明する実施の形態は一例に過ぎず、本発明が適用される実施の形態は、以下の実施の形態に限られるわけではない。例えば、本実施の形態では、ROPコードの検知を例として説明しているが、本発明の適用先はこれに限らず、ROPコードと同様の特性を有する他の攻撃コードにも適用可能である。
【0013】
(攻撃コードと防御メカニズム等について)
本発明の実施の形態では、文書ファイルからROPコードを静的に特定する技術が提供されるが、当該技術の理解を促進するために、まず、既存の攻撃コードと防御メカニズム、及びその回避手法等について説明する。
【0014】
図1(a)は、コンピュータ上でユーザが通常の悪性文書ファイルを開いた場合における各コードの実行動作を示す図である。図1(a)に示すように、ユーザが悪性文書ファイルを開くと、まず、閲覧ソフトの脆弱性を攻撃するエクスプロイトコードが作動する。エクスプロイトコードは、閲覧ソフトの制御権をコントロールできるようにするまでの役割を担う。制御権が取られると、シェルコードが実行される。シェルコードは文書ファイル内に埋め込まれた実行ファイル(マルウェア)を取り出して実行する。マルウェアが実行されると、例えば、ユーザ情報の搾取等が行われる。
【0015】
上記のような悪意のあるシェルコードの実行を防止する技術としてDEP(Data Execution Prevention)がある。エクスプロイトコードにより制御権を取られ配置されるシェルコードは、メモリ上のプログラム領域ではなく、スタックやヒープと呼ばれるデータ領域内に配置される。DEPは、このようなデータ領域内に配置されたコードの実行を防止する機能である。DEPは、メモリの特定の部分がデータの保持のみを目的にしていることをマークし、プロセッサがその領域を実行不可能であると認識することによって機能する。
【0016】
ROPは、DEPを回避するための手法の一つである。ROPは、リターン(ret命令)で終わるコードの断片(ROPgadgetと呼ばれる)をつなぎ合わせて、実行させたい処理を実現するものであり、スタックに実行したいコードのアドレスを積み上げておき、それに従って処理がジャンプしていくように調整することで、攻撃者が意図した様々なコード実行を可能とする。この場合、コードの実行は通常のコード領域で行われるため、DEPによる防御は働かない。
【0017】
ただし、ROPのみで複雑な処理を行うことは困難であるため、ROPを利用して、データ領域の実行権を変更させる命令、つまり、DEPを解除する命令(例:VirtualProtect関数)を実行させることで、データ領域に配置されたシェルコードを実行可能にして、当該シェルコードを実行させる制御が行われる。
【0018】
ROPを回避する手法としてはASLR(Address Space Layout Randomization)がある。ASLRは、アドレス空間をOS起動時にランダム化するものであり、これにより、攻撃者がAPI関数やスタック・ヒープの固定的な既知アドレスを利用することに対抗し得る。
【0019】
しかし、例えば当該OSが32bitのOSである場合、攻撃者はランダム化されたアドレス空間をスキャンして必要なアドレスを見つけ出すことによって、現実時間・現実試行回数内でASLRを回避可能である。また、DLL(Dynamic Link Library)によっては、ランダム化が行われないものも存在し、これを悪用した手法が用いられている。また、ASLRによるランダム化が行われる場合であっても、脆弱性を利用して特定のDLLのベースアドレスを得ることで動的にROPコードを組み立てる手法も存在する。
【0020】
図1(b)は、DEP等の防御メカニズムを回避するROPコードを含む悪性文書ファイルの動作例を説明するための図である。
【0021】
図1(b)は、ROPコード実行と復号コード実行を含む点が図1(a)と異なる。図1(b)の場合、暗号化したシェルコードが用いられ、シェルコードは復号コードによって復号されてから実行される。また、復号コードを実行するためには、復号コードが配置されているメモリ領域に実行権限が必要なため、DEP回避のためのROPコードが実行される。また、安定して攻撃を成功させるために、ROPコードに加えて(又はROPコードに代えて)、SEH(Structured Exception Handling)コードが実行される場合が多い。
【0022】
(本実施の形態における検出対象コードについて)
図2に、ROPコード等の悪性コードを含む悪性文書ファイルの内容例を示す。図2に示す悪性文書ファイル内のROP(SEH含む)コード部は、前記のようにDEP回避や安定動作を目的とし、後続する復号コード部の外に配置され、復号コードの実行権を付与する。ROPコードは復号コード部の外に配置されることから暗号化されない。ただし、ROPコードは100Byte程度、SEHコードは10Byte程度であり、SEHコードについては短いため特徴を捕らえるのは困難と考えられることから、本実施の形態では、静的解析によりROPコードの特徴を捕らえることで、文書ファイルにおけるROPコードの有無を判定し、文書ファイルが悪性文書ファイルであるか否かを判定することとしている。このように、ROPコードは復号コード内に含めることはできず平文で現れることから、静的解析で高速に検出することが可能である。
【0023】
文書ファイルを悪性文書ファイルであると特定するためには、文書ファイルにおけるいずれかの悪性コードを検出できればよいが、以下で説明する観点から、本実施の形態では、悪性文書ファイルに含まれる各種の悪性コードのうち、ROPコードを検出対象としている。
【0024】
エクスプロイトコード部は、脆弱性を発動させるためのコードであるため、特徴が現れやすく意図的な暗号化は難しいため特定がしやすいが、ゼロデイのように未知の脆弱性の場合は特定ができない。また、復号コード部は、暗号化シェルコードを復号する目的で数10Byte程度からなり、XOR等の論理演算を用いる単純な物が多く、正常なコードと区別が困難である。ポリモーフィックコードを生成するエンコーダの場合、サイズが大きくなり特徴を捕らえられる可能性があるものの本実施の形態では、対象としていない。
【0025】
シェルコード部はいくつかの共通した特徴を持つ。その中でも多くのコードはAPI関数アドレスの自己解決を行う為にPEB(Process Environment Block)を参照するため判定が可能である。しかし容易に暗号化や難読化が行われ、特に複数回暗号化を行う手法であるマルチエンコーディングが行われると検出が困難となるので対象としない。
【0026】
一方、前記のように、ROPコードは復号コード内に含めることはできず平文で現れることから、静的解析で高速に検出することが可能である。また、本実施の形態の手法により、特定の関数の引数等の既知の文字列に頼らない未知のDLLに対するROPコードを検出可能である。
【0027】
(装置構成)
図3に、本発明の実施の形態に係る悪性文書ファイル検出装置100の機能構成図を示す。悪性文書ファイル検出装置100は、オフラインで設置し、検査対象の文書ファイル(入力データ)を手動で入力することにより悪性文書ファイルの検出することとしてもよいし、ネットワーク上に設置し、ネットワーク上で文書ファイルを取得することで悪性文書ファイルの検出を行うこととしてもよい。なお、悪性文書ファイル検出装置100を攻撃コード検出装置と称してもよい。また、本実施の形態の「文書ファイル」は特定の種類に限定されず、どのようなものでもよい。また、攻撃コード検出の対象は文書ファイルに限られず、本発明に係る技術により、任意の入力データから攻撃コードを検出できる。
【0028】
図3に示すように、悪性文書ファイル検出装置100は、文書ファイル入力部101、文書ファイル格納部102、攻撃コード判定部103、及び判定結果出力部104を備える。
【0029】
文書ファイル入力部101は、悪性文書ファイルか否かを検査する対象とする文書ファイルを入力する。入力された文書ファイルは文書ファイル格納部102に格納される。攻撃コード判定部103は、対象の文書ファイルを静的に解析することにより、文書ファイルに攻撃コードが含まれているか否かの判定を行う。本実施の形態において、有無判定の対象とする攻撃コードはROPコードである。攻撃コード判定部103の処理内容については後述する。
【0030】
判定結果出力部104は、攻撃コード判定部103による攻撃コード有無の判定結果を出力する。攻撃コード有との判定結果が得られた場合、対象の文書ファイルは悪性文書ファイルであると判断できる。
【0031】
本実施の形態に係る悪性文書ファイル検出装置100は、例えば、1つ又は複数のコンピュータに、本実施の形態で説明する処理内容を記述したプログラムを実行させることにより実現可能である。すなわち、悪性文書ファイル検出装置100が有する機能は、当該コンピュータに内蔵されるCPUやメモリ、ハードディスクなどのハードウェア資源を用いて、悪性文書ファイル検出装置100で実施される処理に対応するプログラムを実行することによって実現することが可能である。また、上記プログラムは、コンピュータが読み取り可能な記録媒体(可搬メモリ等)に記録して、保存したり、配布したりすることが可能である。また、上記プログラムをインターネットや電子メールなど、ネットワークを通して提供することも可能である。
【0032】
(ROPコードの内部構成について)
本実施の形態における攻撃コード判定部103における処理内容は、ROPコードの内部構成と密接に関連するため、ここでROPコードの内部構成について説明する。
【0033】
前述したように、ROPコードは、実行権限のあるメモリ領域のコード部分を繋いで利用することでDEPを回避して任意のコードを実行可能とする。
【0034】
発明者による調査の結果、攻撃コードとしてROPコードが用いられる場合、ROPを利用して自由度の高い任意のシェルコードを書くのではなく、後続するコード領域に実行権限を付与するものしか見られないことがわかっている。実行権限を付与可能な関数の例としてはVirtualProtect、VirtualAlloc、HeapCreate、SetProcessDEPPolicy、WriteProcessMemory、NtSetInformationProcess等がある。
【0035】
ROPコードには、DEPを制御するAPI関数(例:VirtualProtect関数)に関するROPgadgetコード、これらの関数に適切な引数等を準備するために用いられるROPgadgetコード(通常のROPgadgetコードと呼ぶ)、関数等への引数が含まれる。攻撃者は、スタックにこの2種類のROPgadgetコード及び引数等を適切に積んでおき、ROPコードを実行し、シェルコード配置エリアのメモリ領域に実行権限を付与し、DEPを回避する。DEPが回避されると、復号コードの実行等、次の処理が開始される。
【0036】
攻撃者は、安定して攻撃を成功させるためにメモリ空間に固定値として存在するROPgadgetコードを用いようとする。ASLRが機能している場合これが困難となるが前述した回避方法がある。発明者が調査したところ、ASLR非対応モジュールの物理アドレスを用いる攻撃方法が多数存在し、また逆にASLR非対応モジュールの数は限られることから、用いられるROPgadgetコードの数は限定的であり、この物理アドレスに関する特徴を用いる検出手法が有効である。
【0037】
悪性文書ファイル内でのROPコードは、上述したようにスタックの状態を作るため、例えば図4に示すように構成される。図4における個々の四角は1バイトを示す。32bit環境において、Bで示すDEPを制御するAPI関数に関するROPgadgetコード、Aで示す通常のROPgadgetコードのそれぞれは4バイトの物理メモリアドレスである。
【0038】
このようなROPコードの特徴を利用して、攻撃者が用いる既知のアドレスを検出することでROPコードを検出することが考えられる。しかし、未知のASLR非対応物理アドレスを用いる攻撃手法、もしくは、ASLR対応DLLでも、特定のDLLベースアドレスを動的に攻撃コード内で取得して用いる攻撃手法が存在し、このような攻撃手法では、既知のアドレスを検出する手法によるROPコードの検出は難しくなる。
【0039】
そこで、本実施の形態では、特定のDLL等の物理アドレスに依存しない方法でROPコードを検出する技術が用いられる。
【0040】
ASLR非対応のあるDLLから作成されたROPコードの例を図5に示す。図5においてアドレスはリトルエンディアンで配置されている。当該DLLのベースアドレスは非ASLRであることから常に固定であり、0x7C340000〜0x7C396000にロードされる。このことから、作成されるROPgadgetは上位バイトが0x7C3となり、図5において網掛けで示すように4バイト周期で現れる。
【0041】
図6は、32bitOSにおけるメモリ空間を示す図である。図6には、上述したDLLがロードされる領域を示している。図5で例に挙げたDLLは、図6で斜線で示す部分にロードされ、ROPgadgetとして悪用される。また、悪用される多くのDLLはカーネル領域ではなく、ユーザ領域にロードされるものであるため、DLLを利用するROPコードにおける物理アドレスは最大で0x7FFFFFFFとなると考えられる。つまり、図6にグレーで示す0x80000000から0xFFFFFFFFのカーネル領域のアドレスは利用されないと考えられる。
【0042】
また、図5に白で示した部分のうち、40バイトから47バイト目の値が0x40000000であるが、これはVirtualProtect関数での実行権を付与するのに必要な引数である。また、図5において、網掛けを除く白部分の文字列について、一般的な文書ファイルによく見られる0x00や0xFF等でなく、散らばりのある値となっていることも特徴の1つである。
【0043】
上記の例のように、ROPコードを用いる攻撃者は、非ASLRのDLLを探し出してその固定アドレスを利用するため、ROPコードには、特定のアドレス空間に集中した物理アドレスが連続するという特徴がある。もしくは、ASLR対応のDLLの場合でも、脆弱性を利用してそのDLLのベースアドレスを知ることで固定アドレスを利用することが可能であるため、ASLR対応のDLLの場合でも、ROPコードには、特定のアドレス空間に集中した物理アドレスが連続するという特徴があると考えられる。
【0044】
(攻撃コード検出部103の動作例)
攻撃コード検出部103は、文書ファイルの中から上記のような特徴を検出することにより、ROPコードの有無を判定する処理を行う。
【0045】
攻撃コード検出部103の処理の概要を図7のフローチャートを参照して説明する。図7に示す処理は、悪性文書ファイルか否かを検査する対象とする文書ファイルの先頭のバイトデータから、最後のバイトデータまで1バイトづつ順番に行うものである。なお、25個のダブルワードを全部取得できなくなった時点で処理を終了することとしてもよい。また、ROPコードが検出された旨の判定結果が得られた時点で処理を終了してもよい。
【0046】
図7の処理の前提として、文書ファイル入力部101から悪性文書ファイルか否かを検査する対象とする文書ファイルが入力され、当該文書ファイルが文書ファイル格納部102に格納されているものとする。攻撃コード検出部103は、文書ファイル格納部102から文書ファイルのデータを読み取り、以下で説明する処理を実行する。
【0047】
ステップ101において、攻撃コード判定部103は、現在のバイト位置(処理開始時点であれば文書ファイルにおける最初のバイト)から4バイト分のデータであるダブルワードを取得する。本例では、文書ファイルにおいてリトルエンディアンで文字列が並んでいるものとし、それを考慮してダブルワードとする。以下の25個のダブルワードを取得する場合も同様である。
【0048】
ステップ102において、攻撃コード判定部103は、取得したダブルワードの値が所定アドレスよりも大きいか否かを判定し、大きい場合はステップ103に進み、大きくない場合はステップ104に進む。ステップ103において、攻撃コード判定部103は、文書ファイルにおける着目するバイトを1バイト進めてステップ101からの処理を再び行う。
【0049】
本実施の形態では、上記の所定アドレスは、前述したユーザ領域の最大アドレス0x7FFFFFFFである。本例では、ROPコードはユーザ領域にロードされたプログラムをROPgadgetとして利用すると想定し、ユーザ領域の最大アドレスよりも大きなアドレスについては、ROPコードに含まれないものとしている。
【0050】
ステップ104において、攻撃コード判定部103は、現在のバイト位置から連続する25個のダブルワードを文書ファイルから取得し、当該25ダブルワード間での比較、及び、25ダブルワードにおける所定値有無によりスコアの算出を行う。
【0051】
25ダブルワード間での比較の処理の例を図8を参照して説明する。図8の例では、最初のダブルワードと、他の24個のダブルワードのそれぞれとの比較処理を行う。本例において、比較処理とは、比較対象のダブルワード間の数値の差の絶対値が所定の閾値よりも小さいか(「以下」でもよい)どうかを判定し、小さい場合にスコアを加算する。この処理は、部分データ列の数値が所定の範囲に集中する度合を評価することの例である。なお、図8の処理例は一例に過ぎない。例えば、各ダブルワードを他の各ダブルワードと比較する(25:25)こととしてもよい。また、部分データ列(ダブルワード)の数値が所定の範囲に集中する度合を評価するために、部分データ列に関する分散、エントロピー等を計算し、所定閾値との比較等を行うこととしてもよい。
【0052】
前述したように、ROPコードにおいては、特定のアドレス空間に集中した物理アドレスが現れるという特徴があることから、ステップ104の処理でこの特徴を見出そうとするのである。
【0053】
また、25ダブルワードにおける所定値有無における所定値とは、例えば、前述したメモリ権限を変更する関数(例:VirtualProtect関数)においてメモリ権限を変更(例:実行権付与)するために必要な引数(例:0x40000000)である。25ダブルワードの中に当該所定値が存在する場合、当該文書ファイルにROPコードが存在する可能性が高くなるため、大きなスコアを加算する。もしくは、当該所定値が存在することをROPコードが存在すると判定することの条件としてもよい。なお、所定値有無検査は必須ではなく、部分データ列の数値が所定の範囲に集中する度合を評価するのみによりROPコード有無判定を行うことも可能である。
【0054】
ステップ105において、攻撃コード判定部103は、25ダブルワードの検査結果により、所定の検出条件を満たすかどうかを判定し、満たす場合はステップ106に進み、満たさない場合はステップ103に進む。所定の検出条件とは、例えば、スコアが所定の閾値よりも大きいこと、もしくは、スコアが所定の閾値よりも大きいこと、かつ、上記の所定値が存在すること、等である。
【0055】
ステップ106において、攻撃コード判定部103は、ROPコードが検出されたことを示す判定結果を判定結果出力部104に通知し、判定結果出力部104は、ROPコードが検出されたことを示す判定結果を出力する。
【0056】
図9に、攻撃コード判定部103が実行する処理に対応する疑似コード例1を示す。疑似コード例1は図7に示した処理と基本的に同じ処理を示すが、より詳細な処理例を示している。
【0057】
疑似コード例1に従った処理では、攻撃コード判定部103は、対象とする文書ファイルをバイナリデータとして、先頭から1バイト毎にチェックする(01行、19行)。攻撃コード判定部103は、1個目のダブルワード(4バイト)を読み出し(02行)、ユーザ領域に存在する要件を満たしていれば(02行)、1個目のダブルワードとそれに連続する24個のダブルワードからなる25個のダブルワード(100バイト)を検査する(07行〜15行)。
【0058】
この検査処理においては、図8に示したようにしてダブルワード間の差をとり、差が閾値を下回る場合にスコアを上げる(08行、09行)。また、図9の例では、25個のダブルワード内に、VirtualProtect関数を用いて実行権を付与するために必要な引数があれば、ROPフラグを立てる(12行、13行)。図9の例では、ROPフラグが立ちスコアが閾値を超えていればROPコードが見つかったと判定する(16行、17行)。
【0059】
図9の例における08行での閾値(0x10000000)については、発明者によりROPに用いられる代表的なDLLを調査した結果から得られたものであるが、これは一例であり、他の閾値を使用してもよい。
【0060】
また、ROPフラグを立てるかどうかを判定するための引数については、0x40000000以外にもいくつかのパターンがあるが多くはないことが確認されている。
【0061】
図9に示す疑似コード例1では、0x40000000等の引数をROPコード判定の決定要因にしていたが、これを決定要因にせず、スコアを上げる材料としてもよい。その場合の疑似コード例である疑似コード例2を図10に示す。
【0062】
図10における12行と13行に示すように、ダブルワードが引数に一致した場合に、スコアを大きく上げることとしている。他の処理については図9の場合と同様である。
【0063】
図10の例のようにスコアのみでもROPコードの検出が可能である。また、図10において、引数のスコア加算を入れずにROPコードを検出することも可能である。このように、スコアのみで検出する方式では、関数仕様が未知の実行権限付与関数が使用されるROPコードも検出することが可能である。
【0064】
なお、上記のように、ダブルワード間での差が所定閾値を下回る場合にスコアを上げる方式の場合、このような関係にあるダブルワードを含む良性文書ファイルを悪性文書ファイルであると誤検出する可能性があり得る。このような誤検出としては、例えば、良性文書ファイルにおいて終端文字列等として頻繁に使用される文字列(例:0x00、0x****0000)や1バイト周期で現れる同一文字列があるが、いずれもROPコードの構成はできなくなるので、これらを評価の対象外とすることで誤検出を回避可能である。
【0065】
また、ROPコードには必ず無意味なJUNKコード(例:FFFFFFFF)が入ることから、1つ又は複数の無意味コードを定義し、検査対象の複数の部分データ列(ダブルワード)の中に含まれる無意味コードの数を判定条件に追加することとしてもよい。例えば、無意味コードが所定数個以上あればスコアを加算するといった処理を行うことができる。
【0066】
また、本実施の形態では、32bit環境を想定しているが、64bit環境でも本実施の形態に係る技術を同様に適用可能である。64bit環境であれば、文書ファイル(入力データ)を8バイトずつ区切り、評価を行う。
【0067】
(実施の形態のまとめ、効果等)
以上、説明したように、本実施の形態により、入力データから攻撃コードを検出する攻撃コード検出装置であって、前記入力データの中から、所定のデータ長の部分データ列を複数取り出す取得手段と、前記複数の部分データ列について、各部分データ列の数値が所定の範囲に集中する度合を評価する評価手段と、前記評価手段による評価結果に基づいて、前記入力データにおける前記攻撃コードの検出結果を出力する出力手段とを備える攻撃コード検出装置が提供される。
【0068】
前記評価手段は、前記複数の部分データ列について、特定の数値に該当する部分データ列が存在するか否かについて更に評価を行うこととしてもよい。前記特定の数値は、例えば、メモリにおけるコードの実行権を制御する所定の関数の引数である。
【0069】
前記評価手段は、前記各部分データ列の数値が所定の範囲に集中する度合の評価として、例えば、部分データ列間の差分の大きさが所定の閾値よりも小さいか否かの評価を行う。また、前記評価手段は、前記取得手段により取得される部分データ列が、コンピュータのメモリ空間におけるユーザ領域外のアドレスを示す場合に、当該部分データ列を前記評価の対象外とすることとしてもよい。前記攻撃コードは例えばROPコードである。
【0070】
本実施の形態により、ROPコードを文書ファイルの静的解析により特定することが可能となる。本実施の形態では、静的に解析することから、解析時間が短い、OSや文書閲覧ソフト等複数のバージョンを準備しての解析環境が不要、ファイルを動作させないことから安全である等、のメリットがある。またROPコードを検出することで、ゼロデイ等未知の脆弱性をつくタイプの攻撃コードが埋め込まれた悪性文書ファイルでも検出可能である。
【0071】
悪性文書ファイルに埋め込まれた悪性コードを静的解析により検出する既存技術として、非特許文献1〜3に記載された技術がある。非特許文献1では、悪性文書ファイルに埋め込まれた実行ファイル(マルウェア本体)を複数のエンコード方式への対応や総当たり方式による鍵の探索により自動抽出するHandy Scissorsが提案されている。
【0072】
また、非特許文献2では、文書ファイルのサイズや構造に関する情報を検査することで悪性文書ファイルを検知する手法が提案されている。また、非特許文献3においては、鍵の探索機能を持つツールとしてOfficeMalScannerが開示されている。
【0073】
いずれも既存のアンチウィルスソフトと比較して高い悪性文書検知性能を有するものの、いずれにおいても本実施の形態で説明したようなROPコードの特徴に着目した静的解析による検出手法は示されていない。本実施の形態に係る技術を用いることで、非特許文献1〜3に記載された技術では検知できないROPコードを含む悪性文書ファイルを検知することが期待できる。
【0074】
本発明は、上記の実施の形態に限定されることなく、特許請求の範囲内において、種々変更・応用が可能である。
【符号の説明】
【0075】
100 悪性文書ファイル検出装置
101 文書ファイル入力部
102 文書ファイル格納部
103 攻撃コード判定部
104 判定結果出力部
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10