JP6734481B2 - コールスタック取得装置、コールスタック取得方法、および、コールスタック取得プログラム - Google Patents
コールスタック取得装置、コールスタック取得方法、および、コールスタック取得プログラム Download PDFInfo
- Publication number
- JP6734481B2 JP6734481B2 JP2019529066A JP2019529066A JP6734481B2 JP 6734481 B2 JP6734481 B2 JP 6734481B2 JP 2019529066 A JP2019529066 A JP 2019529066A JP 2019529066 A JP2019529066 A JP 2019529066A JP 6734481 B2 JP6734481 B2 JP 6734481B2
- Authority
- JP
- Japan
- Prior art keywords
- stack
- function
- thread
- memory
- call stack
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/55—Detecting local intrusion or implementing counter-measures
- G06F21/554—Detecting local intrusion or implementing counter-measures involving event detection and direct action
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/55—Detecting local intrusion or implementing counter-measures
- G06F21/56—Computer malware detection or handling, e.g. anti-virus arrangements
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/07—Responding to the occurrence of a fault, e.g. fault tolerance
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2221/00—Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/03—Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
- G06F2221/034—Test or assess a computer or a system
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Virology (AREA)
- General Health & Medical Sciences (AREA)
- Health & Medical Sciences (AREA)
- Quality & Reliability (AREA)
- Debugging And Monitoring (AREA)
Description
本発明は、コールスタック取得装置、コールスタック取得方法、および、コールスタック取得プログラムに関する。
コンピュータとインターネットの普及に伴い、サイバー攻撃もまた高度化・多様化している。特定組織を狙った標的型攻撃では未知のコンピュータウイルス(マルウェア)が用いられることも多く、未然に防ぐことが難しくなっている。そのため、攻撃を受けた後に、原因の特定や被害の最小化等の対応を迅速に行うことが求められている。
こうした対応を行うインシデントレスポンスで行われる手法の1つにメモリフォレンジックスと呼ばれる被害端末のメモリ解析がある。コンピュータは、実行する命令(コード)や使用するデータをメモリ上に保存しながら動作する。そのため、メモリには、動いていたアプリケーションの状態、開かれていたファイル、レジストリ等のリソース、実行していたコードや読み書きしたデータ、通信先や送受信データ等、その瞬間の実行状態(動作状態)が含まれている。したがって、メモリに残ったデータを解析することで、そのときに何が起こっていたか把握することができる。
しかし、既存のメモリフォレンジックス技術では、動作していた個々のアプリケーションが、具体的にどのような動作をしていたか等を知ることは難しい。アプリケーションの動作状態を知る方法として、例えば、プログラムのデバッグ等で利用されているスタックトレースと呼ばれる技術がある。アプリケーションを実行するスレッドは、各々スタックと呼ばれるデータ領域を持ち、関数が呼び出されるたびに呼び出し元を示すアドレス(戻りアドレス)がスタックに積まれる。スタックに積まれた戻りアドレスは、呼び出された関数の処理を終了する際に、呼び出し元関数へ戻るために利用され、破棄される。スタックトレースは、スタックの構造を解析し、保持されている戻りアドレスを取得していくことで、その時点での関数呼び出しの入れ子状態(コールスタック)を明らかにする。したがって、アプリケーションを実行していた各スレッドに対し、メモリダンプからスタックトレースと同等の結果が得られれば、アプリケーションの動作状態の把握が可能になると考えられる。
一般的なスタックトレースは、スタック内に保存されたフレームポインタ(もしくはベースポインタ)を辿ることで戻りアドレスを取得する。スタックには、戻りアドレスだけでなく、関数が使用するデータも保持している。フレームポインタは、スタックの先頭を示すスタックポインタとは別に、現在実行中の関数が使用する、スタック内のデータ領域を示している。一般的な関数は、最初にスタックに呼び出し元が使用していたフレームポインタの値を積み、その位置を自身のフレームポインタとして設定する。
具体的には、図1に示すように、スタックにはフレームポインタが示す位置に、呼び出し元の関数が使用していたフレームポインタが存在し、その1つ前のエントリに呼び出し元への戻りアドレスが格納されている。そのため、現在のフレームポインタの値から、前のフレームポインタと戻りアドレスの取得を繰り返していくことでスタック内の戻りアドレスを取得できる。
S.M.Hejazi,et al., "Extraction of Forensically Sensitive Information from Windows Physical Memory", Digital Investigation 6, Supplement, S121-S131, 2009
A.R.Arasteh,et al., "Forensic Memory Analysis: From Stack and Code to Execution History", Digital Investigation 4, Supplement, S114-S125, 2007
ここで、スタックトレースをメモリフォレンジックスに適用するためには、メモリダンプのみから、(1)実行コンテキストの取得と、(2)スタック内の戻りアドレスの取得とを行うことが必要となる。
しかし、障害発生時の状態等を付加されている特殊なメモリダンプ(クラッシュダンプ、コアダンプ)を除き、一般的なメモリダンプは実行コンテキストを持たない。すなわち、一般的なメモリダンプは、スタック領域の位置やフレームポインタの値、実行していたコードのアドレス等を取得できない。
また、フレームポインタは関数の実行に不可欠なものではないため、コンパイラの最適化によってフレームポインタを使わない実行ファイルが存在する。さらに、64ビット版Windows(登録商標)等、実行環境全体としてフレームポインタを使用しないことを前提としているものも存在する。このようにフレームポインタが使われない場合、前述のようなスタック内のフレームポインタを辿って戻りアドレスを取得していくことはできない。
ここで、既存技術として非特許文献1や非特許文献2に記載される技術があるが、フレームポインタを使わない実行環境へは適用できない。また、フレームポインタを使わない実行環境ファイルへの対策として、スタック内の戻りアドレスをスキャンにより見つけることで(2)スタック内の戻りアドレスの取得を行う手法も提案されている。当該手法は、(1)実行コンテキストの取得によりスタックの位置が特定できていればフレームポインタを使用しているか否かに変わらず使用可能であるが、戻りアドレスでない関数ポインタ等を誤検知する可能性があるという問題がある。
以上から、既存技術では、フレームポインタを使用しないことを前提とした環境に対して、(1)実行コンテキストの取得を実現できず、(2)スタック内の戻りアドレスの取得についても誤検知する可能性があった。そのため、フレームポインタを使用しないことを前提とした環境では、メモリダンプから、アプリケーションの動作状態を示すコールスタックを取得することができない可能性があった。
そこで、本発明は、前記した問題を解決し、フレームポインタを使用しないことを前提とした環境であっても、メモリダンプから、アプリケーションの動作状態を示すコールスタックを取得することを課題とする。
前記した課題を解決するため、本発明は、コンピュータのメモリの状態を記録したメモリダンプから、前記コンピュータで動作していたアプリケーションのコールスタックを取得するコールスタック取得装置であって、前記メモリダンプから、前記コールスタックの作成対象となるスレッドの所属するプロセスのメモリ空間を再現するメモリ空間再現部と、前記再現されたメモリ空間から、メモリに保存された前記スレッドのレジスタ情報を、前記スレッドの実行コンテキストとして取得する実行コンテキスト取得部と、前記取得した前記スレッドの実行コンテキストに含まれるスタックポインタから、現在のスタックの位置を取得するスタック位置取得部と、前記取得した実行コンテキストに含まれる現在実行中の命令ポインタから、現在実行中の関数を取得する関数取得部と、前記メモリ空間に含まれる実行ファイルに埋め込まれたメタデータを解釈することにより、前記現在実行中の関数が使用するスタックの幅を取得し、前記取得したスタックの幅に基づき、スタック上の戻りアドレスを取得することで、前記現在実行中の関数の呼び出し元関数を特定し、前記特定した呼び出し元関数を現在実行中の関数として前記メタデータの解釈に基づく戻りアドレス取得を繰り返し行うことにより、前記現在実行中の関数の呼び出し元となる一連の関数を特定し、前記特定した一連の関数を示すコールスタックを取得するスタック取得部とを備えることを特徴とする。
本発明によれば、フレームポインタを使用しないことを前提とした環境であっても、メモリダンプから、アプリケーションの動作状態を示すコールスタックを取得することができる。
以下、図面を参照しながら、本発明を実施するための形態(実施形態)について説明する。本発明は本実施形態に限定されない。
[概要]
本実施形態のコールスタック取得装置10(図2参照)は、メモリダンプと、スレッドID(コールスタックの取得対象となるスレッドのスレッドID)との入力を受け付けると、当該スレッドIDの実行コンテキストを収集し、アプリケーションの動作状態を示すコールスタックの取得を行う。
本実施形態のコールスタック取得装置10(図2参照)は、メモリダンプと、スレッドID(コールスタックの取得対象となるスレッドのスレッドID)との入力を受け付けると、当該スレッドIDの実行コンテキストを収集し、アプリケーションの動作状態を示すコールスタックの取得を行う。
なお、メモリダンプは、コンピュータのメモリの状態を記録したものであり、例えば、物理メモリダンプ、仮想メモリダンプ、実行中のコンピュータのライブメモリ、コンピュータ休止時に作成される状態保存データ、仮想マシンのサスペンドデータやスナップショット等があるが、本実施形態のコールスタック取得装置10は、メモリダンプの種類やその取得方法に影響を受けない。また、コールスタック取得装置10は、メモリダンプ取得時において、実行状態やデータ構造参照用データ等を特別に付加するような特殊なツールや機能も必要としない。つまり、コールスタック取得装置10は、コンピュータの障害時情報等の付加情報がメモリダンプに含まれていない場合であっても、コールスタックを取得することができる。
また、以下では、コールスタック取得装置10が、64ビット版Windows環境のメモリダンプ中に含まれる64ビットアプリケーションを対象に処理を行う場合を例に説明するが、他のOS(Operating System)環境のメモリダンプを対象に処理を行ってもよい。
[構成]
図2を用いてコールスタック取得装置10の構成例を説明する。コールスタック取得装置10は、例えば、メモリダンプと、スレッドIDとを入力とし、入力されたスレッドIDのスレッドのコールスタックを取得し、出力する。
図2を用いてコールスタック取得装置10の構成例を説明する。コールスタック取得装置10は、例えば、メモリダンプと、スレッドIDとを入力とし、入力されたスレッドIDのスレッドのコールスタックを取得し、出力する。
コールスタック取得装置10は、準備部(メモリ空間再現部)11と、実行コンテキスト取得部12と、スタックトレース部13とを備える。
準備部11は、メモリダンプと、スレッドIDとを入力とし、メモリダンプから、当該スレッドIDのスレッドの所属するプロセスの仮想メモリ空間の再現と、当該スレッドの管理データ(スレッドオブジェクト)の取得とを行う。
実行コンテキスト取得部12は、準備部11により取得された仮想メモリ空間とスレッド(スレッドオブジェクト)とを入力とし、スレッドに対して仮想メモリ空間から実行コンテキストの取得を行う。
スタックトレース部13(スタック位置取得部、関数取得部、スタック取得部)は、準備部11により取得されたスレッドおよび再現された仮想メモリ空間と、実行コンテキスト取得部12により取得された実行コンテキストとを入力とし、当該スレッドのスタック内から各関数への戻りアドレスを取得することでコールスタックを取得し、出力する。
例えば、アプリケーションを実行しているスレッドの1つが、mainからfuncA、funcAからfuncB、funcBからfuncC、という順に関数を呼び出す動作を行っていた場合、スタックトレース部13は、これらの関数を順に積み上げたコールスタック(図2参照)を取得し、出力する。
なお、コールスタック取得装置10は、スレッドの識別に、スレッドIDを用いているが、スレッド管理データの仮想アドレスや物理アドレス等を用いてもよい。
次に、準備部11を詳細に説明する。準備部11は、以下の(1)および(2)を行う。(1)メモリダンプから、仮想メモリ空間を再現する。(2)メモリダンプに含まれるスレッドオブジェクトを列挙し、指定されたスレッドIDに対応するスレッドオブジェクトを取得する。
(1)では、準備部11は、例えば、メモリダンプに含まれるカーネルや各プロセスに対応したページテーブルを検出し、そのデータを解釈することで仮想メモリ空間を再現する。なお、メモリダンプが仮想メモリダンプの場合、メモリダンプ自体が仮想メモリ空間であるため、再現は不要である。
(2)では、準備部11は、例えば、プロセスオブジェクト(EPROCESS構造体)が持つスレッドのリストや、シグネチャスキャン等により、指定されたスレッドIDに対応するスレッドオブジェクトを取得する。
なお、上記の(1)および(2)の処理は、例えば、以下の文献に記載される技術を用いて実行される。
Michael Hale Ligh, et al., “The Art of Memory Forensics: Detecting Malware and Threats in Windows, Linux, and Mac Memory, Linux, and Mac Memory”, Wiley Publishing, 2014
準備部11が、プロセスオブジェクト(EPROCESS構造体)の持つスレッドのリストを用いる場合、まず、カーネルが持つプロセスリストを辿り、対象のスレッドの所属するプロセスを示すEPROCESS構造体を取得する。ここで、EPROCESS構造体のThreadListHeadメンバにスレッドのリストが保持されているので、準備部11は、このリストを探索することで、対象のスレッドIDに対応するスレッドオブジェクト(ETHREAD構造体)を列挙できる。
また、準備部11が、シグネチャスキャンを行う場合、ETHREAD構造体が持つ値の特徴をシグネチャ化し、物理アドレス空間もしくは仮想アドレス空間をスキャンし、当該ETHREAD構造体を発見する。
次に、実行コンテキスト取得部12を詳細に説明する。実行コンテキスト取得部12は、まず、準備部11が取得したスレッドオブジェクトから、当該スレッドオブジェクトが保持する実行コンテキストを取得する。
Windowsでは、システムコールの発行や割り込みが発生した場合、例えば、メモリ内のKTRAP_FRAMEと呼ばれる構造体にこれまで使用されていたレジスタの値を保存する。図3に示す通り、ETHREAD構造体内のTcb.TrapFrameメンバに、KTRAP_FRAME構造体のポインタが保持されている。したがって、準備部11が取得したスレッドオブジェクト、すなわち、ETHREAD構造体から上記の構造を辿ることで各種レジスタの値を取得することができる。
なお、本実施形態では、実行コンテキスト取得部12が実行コンテキストを取得する際、KTRAP_FRAME構造体を用いる場合について説明したが、スレッドの実行コンテキストすべてもしくは一部を保持するデータ構造なら、KTRAP_FRAME構造体以外の構造体を用いてもよい。例えば、下記が挙げられる。
例えば、OSがWindowsの場合、KTRAP_FRAME構造体、CONTEXT構造体、WOW64_CONTEXT構造体、KTHREAD/ETHREAD構造体、KPCR/KPRCB構造体、TEB/NT_TIB構造体、USER_STACK構造体、KPROCESSOR_STATE構造体、KNONVOLATILE_CONTEXT_POINTERS構造体等を用いてもよい。また、OSがLinux(登録商標)の場合、thread_info構造体、thread_struct構造体、pt_regs構造体、task_struct構造体、sigcontext構造体等を用いてもよい。さらに、jmp_buf構造体、スタック等を用いてもよい。
次に、スタックトレース部13は、準備部11により作成されたスレッドおよび仮想メモリ空間と、実行コンテキスト取得部12により取得された実行コンテキストとを入力として、当該スレッドのスタックから戻りアドレスを取得することでコールスタックを取得し、出力する。
具体的には、スタックトレース部13は、下記のステップ(A)およびステップ(B)を実行した後、ステップ(C)を繰り返し実行することによりスタックから取得されたすべての戻りアドレスを取得する。ここでは、スタックトレース部13は、ステップ(A)〜ステップ(C)の処理を、図4に例示する実行コンテキストと、実行ファイル(PE32+ファイル)とを用いて実行する場合を例に説明する。
この実行コンテキストは、図4に示すように、RSPレジスタ、RIPレジスタ、各種レジスタを含む。また、PE32+ファイルは、PEヘッダ、Exception Directory(例外処理用データのディレクトリ)、.text セクション等を含む。この例外処理用データは、例外処理においてスタックの巻き戻し(すなわち、関数呼び出しの巻き戻し)に必要な情報(UNWIND_INFO、アンワインド情報)を含む。
ステップ(A):スタックトレース部13は、実行コンテキスト取得部12により取得されたスレッドの実行コンテキストに含まれるスタックポインタ(RSPレジスタ)から、現在のスタックの位置(上限)を取得する。
ステップ(B):スタックトレース部13は、実行コンテキスト取得部12により取得されたスレッドの実行コンテキストに含まれる現在実行中の命令ポインタ(RIPレジスタ)から、現在実行中の命令(関数)の位置を取得する。これにより、スタックトレース部13は、現在実行中の関数を取得することができる。
ステップ(C):スタックトレース部13は、例えば、PE32+形式の実行ファイル(図4参照)が持つ例外処理用データを解釈し、ステップ(B)で取得された現在実行中の関数が使用するスタックの幅を特定し、ステップ(A)で取得した現在のスタックの位置から、特定したスタックの幅分スタックポインタを巻き戻した位置に存在する戻りアドレスを取得することで、現在実行中の関数の呼び出し元の関数を特定する。
すなわち、ステップ(C)において、スタックトレース部13は、仮想メモリ空間に含まれる実行ファイルに埋め込まれたメタデータに基づく関数が使用するスタックの幅の特定と、特定した幅に基づいた戻りアドレス取得とを繰り返し行う。これにより、スタックトレース部13は、現在のスタックの位置から、現在実行中の関数の呼び出し元となる一連の関数を辿ることができる。そして、スタックトレース部13は、現在実行中の関数の呼び出し元となる一連の関数に対応する戻りアドレスを、当該関数が呼び出された順に積み上げたコールスタックを取得する。
このステップ(C)において、スタックトレース部13は、例えば、PE32+ファイルの持つ例外処理用データのうち、各関数に対応したスタック巻き戻しのための情報(アンワインド情報)、すなわち、RUNTIME_FUNCTION構造体、UNWIND_INFO構造体、UNWIND_CODE構造体を解釈する。
このRUNTIME_FUNCTION構造体は、関数の情報、具体的には、関数の範囲と対応するUNWIND_INFO構造体へのRVA(相対仮想アドレス)を持つ。
UNWIND_INFO構造体は、スタックの巻き戻しに必要な情報を持つ。UNWIND_CODE構造体は、スタックの確保に関連した動作を示すオペレーションコードと、それに付随する情報を持つ。具体的なオペレーションコードとして、例えば、不揮発性整数レジスタをスタックにプッシュすることを示すUWOP_PUSH_NONVOL、スタック上に領域を確保することを示すUWOP_ALLOC_SMALL、UWOP_ALLOC_LARGE等がある。UNWIND_INFO構造体は、関数で行われるスタックを確保する処理の情報として、UNWIND_CODE構造体の配列を持っている。
スタックトレース部13は、これらのメタデータを解釈することでスタックの巻き戻しをエミュレーションし、戻りアドレスを取得することでコールスタックを取得する。このコールスタックの取得手順の詳細は後記する。
以上説明したコールスタック取得装置10によれば、フレームポインタを使用しないことを前提とした環境であっても、メモリダンプから、アプリケーションの動作状態を示すコールスタックを取得することができる。
[処理手順]
次に、図5を用いて、コールスタック取得装置10の処理手順の例を説明する。なお、コールスタック取得装置10は、メモリダンプと、スレッドID(コールスタックの取得対象となるスレッドのスレッドID)との入力を受け付け済みであるものとする。また、実行ファイルは、PE32+形式の実行ファイルである場合を例に説明する。
次に、図5を用いて、コールスタック取得装置10の処理手順の例を説明する。なお、コールスタック取得装置10は、メモリダンプと、スレッドID(コールスタックの取得対象となるスレッドのスレッドID)との入力を受け付け済みであるものとする。また、実行ファイルは、PE32+形式の実行ファイルである場合を例に説明する。
コールスタック取得装置10の準備部11は、メモリダンプから仮想メモリ空間を再現し(S1)、また、メモリダンプから、指定されたスレッドIDに対応するスレッドオブジェクトを取得する(S2)。次に、実行コンテキスト取得部12は、仮想メモリ空間から、スレッドオブジェクトが保持する各種レジスタの値を当該スレッドの実行コンテキストとして取得する(S3)。
S3の後、スタックトレース部13は、S3で取得した実行コンテキストに含まれるスタックポインタから、現在のスタックの位置を取得し(S4)、S3で取得した実行コンテキストに含まれる現在実行中の命令ポインタから、現在実行中の関数を取得する(S5)。その後、スタックトレース部13は、メモリダンプに含まれるPE32+形式の実行ファイルのメタデータを解釈することによって、現在実行中の関数の呼び出し元となる一連の関数それぞれに対応する戻りアドレスを取得し、コールスタックを取得する(S6)。そして、スタックトレース部13は、取得したコールスタックを出力する。
ここで、図5のS6の処理における、メモリダンプに含まれる実行ファイルのメタデータの解釈により、現在実行中の関数の呼び出し元となる一連の関数それぞれに対応する戻りアドレスを取得する処理について、図6を用いて詳細に説明する。ここでも、実行ファイルは、PE32+形式の実行ファイルである場合を例に説明する。
まず、スタックトレース部13は、プロセスオブジェクト(EPROCESS構造体)が持つメモリマップ管理データ構造であるVADツリーを参照し、RIPが示すアドレスを含む連続したメモリ領域のベースアドレスを特定する(S601)。このVADツリーの参照方法は、例えば、以下の文献に記載される方法を用いる。
Brendan Dolan-Gavitt,“The VAD Tree: A Process-Eye View of Physical Memory”, Digital Investigation 4, Supplement, S62-S64, Sep 2007
S601の後、スタックトレース部13は、S601で特定したメモリ領域の先頭のPEヘッダのシグネチャの有無を確認し、PE32+形式の実行ファイルやDLL(Dynamic Link Library)が存在することを確認する(S602)。
S602で、スタックトレース部13は、PEヘッダのシグネチャの有無を確認し、PE32+形式の実行ファイルやDLLが存在することが確認できると(S603でYes)、PEヘッダを解釈することで、Exception Directory(IMAGE_DIRECTORY_ENTRY_EXCEPTION)のRVAを取得し、Exception Directoryがロードされている仮想アドレスを算出する(S604)。
S604の後、スタックトレース部13は、S604で算出された仮想アドレスにロードされているException Directory(.pdataセクション)に含まれるRUNTIME_FUNCTION構造体の配列からRIPに対応するものを取得する(S605)。
S605の後、スタックトレース部13は、S605で取得したRUNTIME_FUNCTION構造体のUnwindDataメンバからUNWIND_INFO構造体の仮想アドレスを算出し、UNWIND_INFO構造体を取得する(S606)。
S606の後、スタックトレース部13は、S606で取得したUNWIND_INFO構造体に含まれるUNWIND_CODE構造体の配列を解釈し、UNWIND_CODE構造体それぞれに対応する処理を行うことで、スタックポインタの巻き戻し(RSPの更新)とスタックに退避されていた各種レジスタの値の復元とを行う(S607)。
なお、スタックトレース部13は、S606で取得したアンワインド情報(UNWIND_INFO構造体に示される情報)が他のアンワインド情報を参照している場合(S608でYes)、参照している他のアンワインド情報のUNWIND_INFO構造体についてS606の処理を実行し、取得したUNWIND_INFO構造体に対しS607の処理を実行する。
一方、S608において、スタックトレース部13が、S606で取得したアンワインド情報(UNWIND_INFO構造体に示される情報)が他のアンワインド情報を参照していない場合(S608でNo)、S607での巻き戻し後のRSPの示す位置に存在するデータを戻りアドレスとして取得し、RSPを1エントリ分巻き戻し、取得した戻りアドレスの値でRIPを更新する(S609)。つまり、スタックトレース部13は、現在実行中の命令の位置(ポインタ)を、1つ前の関数呼び出しの位置に移動させる。そして、スタックトレース部13は、S609による更新後のRSPがスタックの底(下限)に到達するまで、S609による更新後のRIPを対象に、S601以降の処理を繰り返し実行する。つまり、スタックトレース部13は、S609による更新後のRSPがスタックの底(下限)に到達しておらず、かつ、戻りアドレスとして取得した値が実行可能領域であれば(S610でNo)、再度S601以降の処理を実行し、S609による更新後のRSPがスタックの底(下限)に到達、または、戻りアドレスとして取得した値が実行可能領域でなければ(S610でYes)、処理を終了する。本実施形態では実行コンテキストに含まれるRSPから連続する確保済みのメモリ領域の範囲をスタックの範囲としたが、他の方法で対象にする範囲を指定することも可能である。例えば、OS等がスタックの範囲を管理している場合はそのデータ構造から取得が可能である。また、入力値として探索する範囲の大きさ等をユーザから指定可能とする方法も考えられる。
なお、Windowsは、動的に生成されたコードでも例外処理をサポートするため、専用の管理テーブル(RtlpDynamicFunctionTable)と登録用API(RtlAddFunctionTable API等)を用意している。したがって、S603で、スタックトレース部13が、PEヘッダが確認できなかった場合(S603でNo)であっても、専用の管理テーブル(RtlpDynamicFunctionTable)を参照することで、RUNTIME_FUNCTION構造体を取得することができる。
すなわち、S603で、スタックトレース部13が、PEヘッダを確認できなかった場合(S603でNo)、スタックトレース部13は、まず、VADツリーからntdll.dllがロードされているベースアドレスを取得し、シンボル情報と合わせてRtlpDynamicFunctionTableの仮想アドレスを算出する(S611)。そして、スタックトレース部13は、S611で算出された仮想アドレスにあるRtlpDynamicFunctionTableを参照し、RIPに対応するRUNTIME_FUNCTION構造体を取得する(S612)。その後、スタックトレース部13は、S612で取得したRUNTIME_FUNCTION構造体を用いて、S606以降の処理を行う。
このようにすることで、スタックトレース部13は、メモリダンプに含まれる実行ファイルのメタデータ(例えば、PE32+形式の実行ファイルに含まれる例外処理用データや、Windowsが例外処理用に用意する管理テーブル等)を解釈することにより、スレッドが実行していた関数の呼び出し元となる関数が分かる。そして、スタックトレース部13は、当該関数の呼び出し元となる一連の関数を順に辿ることで、スレッドが実行中であった関数を、呼び出し順に積み上げたコールスタックを取得することができる。
[その他の実施形態]
なお、コールスタック取得装置10は、コールスタックの作成にあたり、RUNTIME_FUNCTION構造体、UNWIND_INFO構造体、UNWIND_CODE構造体等を用いる場合を例に説明したが、各関数が使用するスタックの幅やスタックの使用方法を特定可能なデータ構造であれば、これらの構造体に限定されない。
なお、コールスタック取得装置10は、コールスタックの作成にあたり、RUNTIME_FUNCTION構造体、UNWIND_INFO構造体、UNWIND_CODE構造体等を用いる場合を例に説明したが、各関数が使用するスタックの幅やスタックの使用方法を特定可能なデータ構造であれば、これらの構造体に限定されない。
例えば、Windowsでは、FPO_DATA構造体、STACKFRAME/STACKFRAME64構造体、EXCEPTION_REGISTRATION_RECORD構造体、EXCEPTION_RECORD構造体、IMAGE_FUNCTION_ENTRY64構造体がある。したがって、コールスタック取得装置10は、これらの構造体を用いてコールスタックを取得してもよい。また、ELF形式の実行ファイルの場合、コールスタック取得装置10は、.eh_frameや.debug_frameセクション等に埋め込まれたCFI(Call Frame Information)等のDWARF形式のデバッグ情報を用いて、コールスタックを取得してもよい。
また、本実施形態のコールスタック取得装置10は、インシデントレスポンス、エンドポイント脅威監視、仮想化基盤による仮想計算機(VM、Virtual Machine)の監視等、様々な場面に用いることができる。
[適用例]
例えば、図7の符号701に示すように、インシデントレスポンスにコールスタック取得装置10を用いてもよい。この場合、コールスタック取得装置10は、被害PCのメモリダンプを解析し、コールスタックを取得する。そして、フォレンジックアナリスト等が、作成されたコールスタックの内容を見ることで、被害PCの被害状況や対策を検討し、インシデントレスポンスを速やかに行うことができる。
例えば、図7の符号701に示すように、インシデントレスポンスにコールスタック取得装置10を用いてもよい。この場合、コールスタック取得装置10は、被害PCのメモリダンプを解析し、コールスタックを取得する。そして、フォレンジックアナリスト等が、作成されたコールスタックの内容を見ることで、被害PCの被害状況や対策を検討し、インシデントレスポンスを速やかに行うことができる。
また、図7の符号702に示すように、脅威監視サーバによる監視対象PC(エンドポイント)の脅威監視にコールスタック取得装置10を用いてもよい。この場合、コールスタック取得装置10は、脅威監視サーバに装備される。そして、脅威監視サーバは、監視Agentにより監視された監視対象PCのメモリの監視データ(メモリダンプ)を取得すると、コールスタック取得装置10により、メモリダンプを解析し、監視対象PCのコールスタックを取得する。脅威監視サーバは、取得されたコールスタックを分析することで、監視対象PCの動作状態を監視することができる。
さらに、図7の符号703に示すように、仮想化基盤による仮想計算機(VM)の監視にコールスタック取得装置10を用いてもよい。この場合、コールスタック取得装置10は、仮想化基盤となるコンピュータに装備される。そして、仮想化基盤となるコンピュータは、自身の内部に構築された各VMのメモリ(仮想化メモリ)を監視し、監視の結果得られた各VMのメモリダンプから各VMのコールスタックを取得する。そして、仮想化基盤となるコンピュータは、各VMのコールスタックを分析することで、各VMの動作状態を監視することができる。
[プログラム]
また、上記の実施形態で述べたコールスタック取得装置10の機能を実現するプログラムを所望の情報処理装置(コンピュータ)にインストールすることによって実装できる。例えば、パッケージソフトウェアやオンラインソフトウェアとして提供される上記のプログラムを情報処理装置に実行させることにより、情報処理装置をコールスタック取得装置10として機能させることができる。ここで言う情報処理装置には、デスクトップ型またはノート型のパーソナルコンピュータが含まれる。また、その他にも、情報処理装置にはスマートフォン、携帯電話機やPHS(Personal Handyphone System)等の移動体通信端末、さらには、PDA(Personal Digital Assistants)等がその範疇に含まれる。また、コールスタック取得装置10を、クラウドサーバに実装してもよい。
また、上記の実施形態で述べたコールスタック取得装置10の機能を実現するプログラムを所望の情報処理装置(コンピュータ)にインストールすることによって実装できる。例えば、パッケージソフトウェアやオンラインソフトウェアとして提供される上記のプログラムを情報処理装置に実行させることにより、情報処理装置をコールスタック取得装置10として機能させることができる。ここで言う情報処理装置には、デスクトップ型またはノート型のパーソナルコンピュータが含まれる。また、その他にも、情報処理装置にはスマートフォン、携帯電話機やPHS(Personal Handyphone System)等の移動体通信端末、さらには、PDA(Personal Digital Assistants)等がその範疇に含まれる。また、コールスタック取得装置10を、クラウドサーバに実装してもよい。
図8を用いて、上記のプログラム(コールスタック取得プログラム)を実行するコンピュータの一例を説明する。図8に示すように、コンピュータ1000は、例えば、メモリ1010と、CPU1020と、ハードディスクドライブインタフェース1030と、ディスクドライブインタフェース1040と、シリアルポートインタフェース1050と、ビデオアダプタ1060と、ネットワークインタフェース1070とを有する。これらの各部は、バス1080によって接続される。
メモリ1010は、ROM(Read Only Memory)1011およびRAM(Random Access Memory)1012を含む。ROM1011は、例えば、BIOS(Basic Input Output System)等のブートプログラムを記憶する。ハードディスクドライブインタフェース1030は、ハードディスクドライブ1090に接続される。ディスクドライブインタフェース1040は、ディスクドライブ1100に接続される。ディスクドライブ1100には、例えば、磁気ディスクや光ディスク等の着脱可能な記憶媒体が挿入される。シリアルポートインタフェース1050には、例えば、マウス1110およびキーボード1120が接続される。ビデオアダプタ1060には、例えば、ディスプレイ1130が接続される。
ここで、図8に示すように、ハードディスクドライブ1090は、例えば、OS1091、アプリケーションプログラム1092、プログラムモジュール1093およびプログラムデータ1094を記憶する。前記した実施形態で説明した各種データや情報は、例えばハードディスクドライブ1090やメモリ1010に記憶される。
そして、CPU1020が、ハードディスクドライブ1090に記憶されたプログラムモジュール1093やプログラムデータ1094を必要に応じてRAM1012に読み出して、上述した各手順を実行する。
なお、上記のコールスタック取得プログラムに係るプログラムモジュール1093やプログラムデータ1094は、ハードディスクドライブ1090に記憶される場合に限られず、例えば、着脱可能な記憶媒体に記憶されて、ディスクドライブ1100等を介してCPU1020によって読み出されてもよい。あるいは、上記のプログラムに係るプログラムモジュール1093やプログラムデータ1094は、LAN(Local Area Network)やWAN(Wide Area Network)等のネットワークを介して接続された他のコンピュータに記憶され、ネットワークインタフェース1070を介してCPU1020によって読み出されてもよい。
10 コールスタック取得装置
11 準備部
12 実行コンテキスト取得部
13 スタックトレース部
11 準備部
12 実行コンテキスト取得部
13 スタックトレース部
Claims (5)
- コンピュータのメモリの状態を記録したメモリダンプから、前記コンピュータで動作していたアプリケーションのコールスタックを取得するコールスタック取得装置であって、
前記メモリダンプから、前記コールスタックの作成対象となるスレッドの所属するプロセスのメモリ空間を再現するメモリ空間再現部と、
前記再現されたメモリ空間から、メモリに保存された前記スレッドのレジスタ情報を、前記スレッドの実行コンテキストとして取得する実行コンテキスト取得部と、
前記取得した前記スレッドの実行コンテキストに含まれるスタックポインタから、現在のスタックの位置を取得するスタック位置取得部と、
前記取得した実行コンテキストに含まれる現在実行中の命令ポインタから、現在実行中の関数を取得する関数取得部と、
前記メモリ空間に含まれる実行ファイルに埋め込まれたメタデータを解釈することにより、前記現在実行中の関数が使用するスタックの幅を取得し、前記取得したスタックの幅に基づき、スタック上の戻りアドレスを取得することで、前記現在実行中の関数の呼び出し元関数を特定し、前記特定した呼び出し元関数を現在実行中の関数として前記メタデータの解釈に基づく戻りアドレス取得を繰り返し行うことにより、前記現在実行中の関数の呼び出し元となる一連の関数を特定し、前記特定した一連の関数を示すコールスタックを取得するスタック取得部と
を備えることを特徴とするコールスタック取得装置。 - 前記スレッドのレジスタ情報は、
前記スレッドの動作中にOS(Operating System)がメモリに保存したレジスタ情報である
ことを特徴とする請求項1に記載のコールスタック取得装置。 - 前記実行ファイルに埋め込まれたメタデータは、
前記実行ファイルに埋め込まれた例外処理用データのうち、前記実行ファイルで用いられる関数のスタックの巻き戻しのための情報である
ことを特徴とする請求項1に記載のコールスタック取得装置。 - コンピュータのメモリの状態を記録したメモリダンプから、前記コンピュータで動作していたアプリケーションのコールスタックを取得するコールスタック取得方法であって、
前記メモリダンプから、前記コールスタックの作成対象となるスレッドの所属するプロセスのメモリ空間を再現するステップと、
前記再現されたメモリ空間から、メモリに保存された前記スレッドのレジスタ情報を、前記スレッドの実行コンテキストとして取得するステップと、
前記取得した前記スレッドの実行コンテキストに含まれるスタックポインタから、現在のスタックの位置を取得するステップと、
前記取得した実行コンテキストに含まれる現在実行中の命令ポインタから、現在実行中の関数を取得するステップと、
前記メモリ空間に含まれる実行ファイルに埋め込まれたメタデータを解釈することにより、前記現在実行中の関数が使用するスタックの幅を取得し、前記取得したスタックの幅に基づき、スタック上の戻りアドレスを取得することで、前記現在実行中の関数の呼び出し元関数を特定し、前記特定した呼び出し元関数を現在実行中の関数として前記メタデータの解釈に基づく戻りアドレス取得を繰り返し行うことにより、前記現在実行中の関数の呼び出し元となる一連の関数を特定し、前記特定した一連の関数を示すコールスタックを取得するステップと
をコールスタック取得装置が実行することを特徴とするコールスタック取得方法。 - コンピュータのメモリの状態を記録したメモリダンプから、前記コンピュータで動作していたアプリケーションのコールスタックを取得するためのコールスタック取得プログラムであって、
前記メモリダンプから、前記コールスタックの作成対象となるスレッドの所属するプロセスのメモリ空間を再現するステップと、
前記再現されたメモリ空間から、メモリに保存された前記スレッドのレジスタ情報を、前記スレッドの実行コンテキストとして取得するステップと、
前記取得した前記スレッドの実行コンテキストに含まれるスタックポインタから、現在のスタックの位置を取得するステップと、
前記取得した実行コンテキストに含まれる現在実行中の命令ポインタから、現在実行中の関数を取得するステップと、
前記メモリ空間に含まれる実行ファイルに埋め込まれたメタデータを解釈することにより、前記現在実行中の関数が使用するスタックの幅を取得し、前記取得したスタックの幅に基づき、スタック上の戻りアドレスを取得することで、前記現在実行中の関数の呼び出し元関数を特定し、前記特定した呼び出し元関数を現在実行中の関数として前記メタデータの解釈に基づく戻りアドレス取得を繰り返し行うことにより、前記現在実行中の関数の呼び出し元となる一連の関数を特定し、前記特定した一連の関数を示すコールスタックを取得するステップと
をコンピュータに実行させるためのコールスタック取得プログラム。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2017134516 | 2017-07-10 | ||
JP2017134516 | 2017-07-10 | ||
PCT/JP2018/025117 WO2019013033A1 (ja) | 2017-07-10 | 2018-07-02 | コールスタック取得装置、コールスタック取得方法、および、コールスタック取得プログラム |
Publications (2)
Publication Number | Publication Date |
---|---|
JPWO2019013033A1 JPWO2019013033A1 (ja) | 2019-11-07 |
JP6734481B2 true JP6734481B2 (ja) | 2020-08-05 |
Family
ID=65001973
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2019529066A Active JP6734481B2 (ja) | 2017-07-10 | 2018-07-02 | コールスタック取得装置、コールスタック取得方法、および、コールスタック取得プログラム |
Country Status (3)
Country | Link |
---|---|
US (1) | US11182479B2 (ja) |
JP (1) | JP6734481B2 (ja) |
WO (1) | WO2019013033A1 (ja) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP7424599B2 (ja) * | 2019-05-23 | 2024-01-30 | コネクトフリー株式会社 | システムおよび情報処理方法 |
WO2021024428A1 (ja) * | 2019-08-07 | 2021-02-11 | 日本電信電話株式会社 | 解析システム、解析方法および解析プログラム |
US11163645B2 (en) * | 2019-09-23 | 2021-11-02 | Denso Corporation | Apparatus and method of control flow integrity enforcement utilizing boundary checking |
US20210216667A1 (en) * | 2020-01-10 | 2021-07-15 | Acronis International Gmbh | Systems and methods for protecting against unauthorized memory dump modification |
US11288170B1 (en) * | 2020-12-10 | 2022-03-29 | International Business Machines Corporation | Log analysis debugging without running on real production environment |
Family Cites Families (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6560773B1 (en) * | 1997-12-12 | 2003-05-06 | International Business Machines Corporation | Method and system for memory leak detection in an object-oriented environment during real-time trace processing |
US7028056B1 (en) * | 2000-04-14 | 2006-04-11 | Microsoft Corporation | Method and arrangements for generating debugging information following software failures |
US7320125B2 (en) * | 2001-05-24 | 2008-01-15 | Techtracker, Inc. | Program execution stack signatures |
US7178132B2 (en) * | 2002-10-23 | 2007-02-13 | Microsoft Corporation | Forward walking through binary code to determine offsets for stack walking |
US7149929B2 (en) * | 2003-08-25 | 2006-12-12 | Hewlett-Packard Development Company, L.P. | Method of and apparatus for cross-platform core dumping during dynamic binary translation |
US7290176B2 (en) * | 2004-07-31 | 2007-10-30 | Hewlett-Packard Development Company, L.P. | Method and system for generating stacked register dumps from backing-store memory |
US7958512B2 (en) * | 2005-10-31 | 2011-06-07 | Microsoft Corporation | Instrumentation to find the thread or process responsible for an application failure |
US8088011B2 (en) * | 2005-11-08 | 2012-01-03 | Microsoft Corporation | Dynamic debugging dump for game console |
US8566944B2 (en) | 2010-04-27 | 2013-10-22 | Microsoft Corporation | Malware investigation by analyzing computer memory |
US8732681B2 (en) | 2011-05-16 | 2014-05-20 | Texas Instruments Incorporated | Stack analysis for post mortem analysis |
US8607098B2 (en) * | 2011-05-26 | 2013-12-10 | International Business Machines Corporation | Generating appropriately sized core files used in diagnosing application crashes |
US8909990B2 (en) * | 2012-08-04 | 2014-12-09 | Microsoft Corporation | Historical software diagnostics using lightweight process snapshots |
US9015534B2 (en) * | 2012-11-08 | 2015-04-21 | Dell Products L.P. | Generation of memory dump of a computer process without terminating the computer process |
US10621026B2 (en) * | 2017-06-04 | 2020-04-14 | Apple Inc. | Auto bug capture |
-
2018
- 2018-07-02 WO PCT/JP2018/025117 patent/WO2019013033A1/ja active Application Filing
- 2018-07-02 US US16/628,263 patent/US11182479B2/en active Active
- 2018-07-02 JP JP2019529066A patent/JP6734481B2/ja active Active
Also Published As
Publication number | Publication date |
---|---|
US11182479B2 (en) | 2021-11-23 |
US20200218803A1 (en) | 2020-07-09 |
WO2019013033A1 (ja) | 2019-01-17 |
JPWO2019013033A1 (ja) | 2019-11-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP6734481B2 (ja) | コールスタック取得装置、コールスタック取得方法、および、コールスタック取得プログラム | |
CN107808094B (zh) | 检测文件中的恶意代码的系统和方法 | |
US9015814B1 (en) | System and methods for detecting harmful files of different formats | |
US8978141B2 (en) | System and method for detecting malicious software using malware trigger scenarios | |
US8516589B2 (en) | Apparatus and method for preventing virus code execution | |
US9804948B2 (en) | System, method, and computer program product for simulating at least one of a virtual environment and a debugging environment to prevent unwanted code from executing | |
US10129275B2 (en) | Information processing system and information processing method | |
JP2010262609A (ja) | 効率的なマルウェアの動的解析手法 | |
US11797676B2 (en) | Exception handlers in a sandbox environment for malware detection | |
WO2004075060A1 (ja) | コンピュータウィルス検出装置 | |
EP2985716B1 (en) | Information processing device and identifying method | |
CN113176926A (zh) | 一种基于虚拟机自省技术的api动态监控方法及系统 | |
WO2018129916A1 (zh) | 沙箱检测的方法、沙箱系统和沙箱设备 | |
JP5766650B2 (ja) | 情報処理装置、監視方法および監視プログラム | |
KR20110057297A (ko) | 악성 봇 동적 분석 시스템 및 방법 | |
US11914711B2 (en) | Systems and methods for automatically generating malware countermeasures | |
JP6817454B2 (ja) | コールスタック取得装置、コールスタック取得方法およびコールスタック取得プログラム | |
US20220261481A1 (en) | Software packer-agnostic unpacking of packed executables | |
EP2819055B1 (en) | System and method for detecting malicious software using malware trigger scenarios | |
Safitri | A study: Volatility forensic on hidden files | |
RU2592383C1 (ru) | Способ формирования антивирусной записи при обнаружении вредоносного кода в оперативной памяти | |
EP3293660A1 (en) | System and method of detecting malicious code in files | |
US20230138346A1 (en) | Managing file dependency management in virtual machines | |
EP4310707A1 (en) | System and method for detecting malicious code by an interpreter in a computing device | |
JP6687844B2 (ja) | マルウエア解析装置、マルウエア解析方法及びマルウエア解析プログラム |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20190614 |
|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20200707 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20200709 |
|
R150 | Certificate of patent or registration of utility model |
Ref document number: 6734481 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 |