博 士 論 文
仮想化技術に基づいたマルウェア解析のための
システムコールトレース手法に関する研究
(Research on System Call Tracing for Malware Analysis
based on Virtualization Technology)
2016
年
3
月
立命館大学大学院情報理工学研究科
情報理工学専攻博士課程後期課程
立命館大学審査博士論文
仮想化技術に基づいたマルウェア解析のための
システムコールトレース手法に関する研究
(Research on System Call Tracing for Malware Analysis
based on Virtualization Technology)
2016
年
3
月
March 2016
立命館大学大学院情報理工学研究科
情報理工学専攻博士課程後期課程
Doctoral Program in Advanced Information
Science and Engineering Graduate School of
Information Science and Engineering
Ritsumeikan University
大月
勇人
OTSUKI Yuto
研究指導教員
:
毛利 公一 教授
Supervisor: Professor MOURI Koichi
内容梗概
コンピュータとネットワークの普及に伴い,マルウェアの脅威が問題となっている. その対策のためにはマルウェアを解析し,その特徴を理解することが必要となる.し かし,解析を妨害する機能を持つマルウェアを解析することは困難である.これらの マルウェアを短時間で解析可能とすることで,対策の実現までの時間の短縮,ひいて はマルウェアによる被害の削減が見込める.そこで,本研究ではマルウェアを実行し て挙動を観測する動的解析をベースとし,短時間でより精度の高い解析が可能なマル ウェア解析技術を実現する. 動的解析を行う上で課題となるのが,挙動観測自体を困難にするマルウェアのアン チデバッグ機能とプロセス感染機能である.アンチデバッグ機能は,マルウェア自身 が動的解析の対象となっていることを検出し,実行の停止や解析の妨害などを行うも のである.動的解析では実際に実行されない挙動を解析することはできないため,マ ルウェアは当該機能を用いて悪意ある機能を隠蔽する.プロセス感染型マルウェアは, 正規のプロセスのメモリ空間内に自身のコードを挿入し,そのプロセスに悪意ある挙 動を実行させる.そのため,API やシステムコールの呼出し元をプロセス単位で区別 する従来の挙動観測手法では,感染されたプロセス本来の挙動からその内部に潜むマ ルウェアの挙動のみを識別することは困難である.上記のような動的解析妨害機能を 持つマルウェアを解析可能にする既存研究では,解析機能の隠蔽や細粒度での挙動観 測を行っている.しかし,これらは,マルウェアから容易に検出可能な特徴を残してい るものや,オーバヘッドが高く短時間での解析に向かないものが多い.そこで,本論 文では解析時の課題を解決し,かつ低オーバヘッドでの挙動観測を実現することを目 的として,軽量な仮想計算機モニタをベースとするシステムコールトレーサ Alkanet と,プロセッサが持つブランチトレース機能を活用したシステムコールの呼出し元識 別手法 BTS トレースの 2 つの手法を提案し,上記の課題を解決する. 提案手法の 1 つである Alkanet は,アンチデバッグ機能を持つマルウェアや典型的 なプロセス感染型マルウェアを短時間で解析することを可能とする.Alkanet は,仮 想計算機モニタ BitVisor をベースとし,マルウェアの可視範囲に解析システム特有の 特徴を持たない仮想環境を構築することで,マルウェアに対して透過的な挙動観測を 可能とする.Alkanet は,Windows XP 上で動作するマルウェアが発行するシステム コールをトレースする機能を実現している.アンチデバッグ手法に対する耐性評価に より,Alkanet は典型的な手法の 94%に対して耐性があることを確認している.また, Alkanet では,典型的なプロセス感染型マルウェアが他のプロセスに感染する時にスは実機の 78%の性能で動作可能であり,他の動的解析システムと比べて十分な処理速 度で挙動観測が可能であることを確認している.すなわち,Alkanet は,既存システ ムよりも多様なマルウェアをより短時間で解析可能である. もう 1 つの提案手法である BTS トレースは,マルウェアが感染したメモリ領域を識 別し,その領域を起源とするシステムコールを識別可能にすることで,プロセス感染 型マルウェアに対してさらに解析精度を高める.BTS トレースは,プロセッサのブラ ンチトレース機能 Branch Trace Store によって記録された分岐命令の情報に基づいて 関数呼出し階層を取得する BTS トレース本体と,Windows が持つメモリ管理情報と 発行されるシステムコールの情報を用いて感染領域を識別する手法から成る.これら により,既存手法と比べて高信頼かつ低オーバヘッドで,マルウェアのコードを起源 としてシステムコールが発行されたことを識別可能とする.Alkanet に本手法を適用 し,システムコールの呼出し元を識別する機能を実現することで,正規プロセスに潜 んで動作するマルウェアの挙動を正規プロセス本来の挙動と正確に識別可能であるこ とを確認した. なお,提案手法では Windows XP をマルウェア実行環境として想定していたが,既 に x64 版の Windows 7 や Windows 10 を対象とするプロトタイプを実現しており,新 しい Windows に提案手法を適応可能であることを確認している.
Abstract
Malware has become a major security threat on computers. Understanding mal-ware characteristics by malmal-ware analysis is required for taking measures against the threat. However, it is difficult to analyze malware that has the functions to disturb the analysis. To take measures quickly and suppress damages caused by malware, it is required to reduce analysis time for such malware. Therefore, This research aims to establish new methods which can analyze malware more accurately in a short time.
Recent malwares have anti-debugging functions or infect other running processes. These functions are issues in dynamic analysis which executes malware and observes its behavior. Malware with anti-debugging functions detects analysis tools analyzing itself, and then it stops running or disturbs analysis to hide main malicious functions. It is difficult to analyze such malware because dynamic analysis cannot analyze unex-ecuted behavior. Process-infecting malware hides their malicious codes in the memory space of other processes. Even if a running process is benign, the executed codes may be malicious. Conventional methods to observe malware focus on process. The methods cannot distinguish behavior of the malicious codes from original behavior of the infected process. Existing systems which have the ability to analyze such malware conceal their analysis functions from the malware and observe its behavior accurately by fine-grained tracing. However, they still have easily detectable characteristics and large observation overhead. Therefore, to observe malware behavior without the in-fluence from the disturbing functions and large overhead, “Alkanet” and “BTStrace” are proposed in this paper.
Alkanet makes it possible to analyze malware with anti-debugging functions and typical process-infecting malware in a short time. Alkanet is a system call tracer based on the lightweight virtual machine monitor BitVisor. The virtual machine pro-vided by Alkanet has no easily detectable characteristics unlike other analysis systems. Alkanet can transparently observe malware running on Windows XP. 94% of typical anti-debugging techniques are ineffective against Alkanet. Alkanet observes malicious behavior focusing on thread because typical process-infecting malware injects threads into the target process. Alkanet can analyze more various malware than conventional
systems.
BTStrace makes it possible to distinguish behavior of malware hiding in the benign processes more accurately. BTStrace finds malicious regions in the memory space and detects system calls originating in the regions. The proposed method consists of two functions. The first one extracts a call hierarchy from branch records which are stored by processor’s Branch Trace Store. The other finds malicious regions based on Win-dows’s memory management data and information of invoked system calls. BTStrace can distinguish system calls originating in malicious regions from other system calls in more trustworthy and low overhead compared with existing methods. Alkanet ex-tended with BTStrace could distinguish behavior of the malicious codes from original behavior of the infected process by evaluation experiments.
Furthermore, it has been already confirmed that the proposed methods are adaptable for new Windows by experiments using new prototype implementations for Windows 7 x64 and Windows 10 x64.
i
目 次
第 1 章 緒論 1 1.1 背景 . . . . 1 1.2 マルウェア解析手法と解決すべき課題 . . . . 2 1.3 論文の構成 . . . . 4 第 2 章 動的解析における課題 7 2.1 緒言 . . . . 7 2.2 アンチデバッグ機能 . . . . 8 2.3 プロセス感染機能 . . . . 9 2.4 結言 . . . 11 第 3 章 提案手法 13 3.1 緒言 . . . 13 3.2 アンチデバッグ耐性と低オーバヘッドの両立方法 . . . 13 3.2.1 解析基盤 . . . 14 3.2.2 OS の内部情報を取得する方法 . . . . 14 3.2.3 挙動の観測粒度 . . . 15 3.3 プロセス感染型マルウェアの観測方法 . . . . 16 3.3.1 システムコール発行者の識別粒度 . . . 16 3.3.2 スレッド単位の識別手法 . . . 16 3.3.3 メモリ領域単位の識別手法 . . . 17 3.4 結言 . . . 18 第 4 章 Alkanet 19 4.1 緒言 . . . 19 4.2 Alkanet の構成と概要 . . . . 19 4.2.1 構成 . . . 19 4.2.2 監視対象とするシステムコール . . . 214.2.3 取得する情報 . . . 21 4.3 システムコールトレースの実装 . . . 22 4.3.1 システムコールのフック . . . 23 4.3.2 システムコールの特定 . . . 24 4.3.3 プロセスとスレッドの特定 . . . 25 4.3.4 引数と戻り値の取得 . . . 26 4.4 オーバヘッド評価 . . . 27 4.4.1 計測環境 . . . 28 4.4.2 結果と考察 . . . 29 4.5 耐解析手法に対する評価 . . . 32 4.5.1 評価方法 . . . 32 4.5.2 結果と考察 . . . 32 4.6 システムコールトレース機能の評価 . . . 35 4.6.1 SdBot.exe のシステムコールログ取得結果 . . . . 35 4.6.2 Polipos.exe の解析結果 . . . . 39 4.6.3 多様なマルウェアに対する有効性の評価 . . . 40 4.7 結言 . . . 43 第 5 章 呼出し元識別手法 45 5.1 緒言 . . . 45 5.2 呼出し元識別機能の概要 . . . 46 5.3 BTS による VM 上のスレッドの観測 . . . . 46 5.3.1 BTS . . . . 46 5.3.2 VM 上で発生する分岐の取得 . . . . 47 5.3.3 スレッド毎の分岐記録の取得 . . . 48 5.4 関数呼出し階層の抽出 . . . 49 5.5 感染領域の識別 . . . 50 5.5.1 マッピングされた実行ファイル . . . 51 5.5.2 動的に生成されたコード . . . 51 5.6 スタックトレースとの比較評価 . . . 52 5.6.1 評価環境 . . . 52 5.6.2 評価手法と検体 . . . 52 5.6.3 ログエントリ . . . 53
iii 5.6.4 評価結果 . . . 54 5.7 スタック偽装耐性の評価 . . . 56 5.7.1 スタック偽装方法 . . . 56 5.7.2 サンプルプログラムの動作 . . . 56 5.7.3 評価結果 . . . 58 5.8 感染領域識別機能の評価 . . . 59 5.8.1 評価手法と検体 . . . 59 5.8.2 評価結果 . . . 60 5.9 パフォーマンスの評価 . . . 62 5.10 考察 . . . . 62 5.10.1 誤検知や見逃しに関する考察 . . . . 62 5.10.2 他の解析システムへの適用可能性 . . . . 64 5.10.3 パフォーマンスの更なる改善方法 . . . . 65 5.10.4 マルウェアへの露顕性に関する考察 . . . . 65 5.11 結言 . . . . 65 第 6 章 新しい Windows への適応性に関する検討 67 6.1 緒言 . . . 67 6.2 他の Windows への移行時に再実装が必要な機能 . . . 68 6.3 x64 版 Windows の特徴 . . . . 69 6.3.1 システムコール呼出しの流れ . . . 69 6.3.2 PCR のマップ位置 . . . . 70 6.3.3 システムコールの引数と戻り値 . . . 71 6.3.4 WOW64 . . . . 71 6.4 Alkanet10 の実装 . . . . 73 6.4.1 システムコールのフック . . . 74 6.4.2 システムコールの特定 . . . 75 6.4.3 プロセスとスレッドの特定 . . . 75 6.4.4 引数と戻り値の取得 . . . 75 6.4.5 WOW64 システムコールのトレース . . . . 76 6.5 機能評価 . . . 76 6.5.1 評価目的と検体 . . . 76 6.5.2 ログエントリ . . . 77
6.5.3 評価結果 . . . 78 6.6 考察 . . . 79 6.7 結言 . . . 79 第 7 章 関連研究 81 7.1 緒言 . . . 81 7.2 仮想化技術を活用したマルウェア動的解析システム . . . 81 7.3 呼出し元を識別する手法 . . . 82 7.4 コントロールフローの検証手法 . . . 83 7.5 結言 . . . 84 第 8 章 結論 85 謝辞 89 参考文献 91 著者発表論文 97
v
図 目 次
2.1 マルウェアの挙動観測方法 . . . . 9 2.2 挿入したコードの実行方法 . . . 10 3.1 スレッド乗っ取り型マルウェアのシステムコール呼出し過程 . . . 18 4.1 Alkanet の全体構成 . . . . 20 4.2 システムコールフックの流れ . . . . 24 4.3 動作中のスレッド情報取得の流れ . . . 26 4.4 システムコールフック時のスタック . . . 27 4.5 SdBot.exe: システムフォルダへのコピー . . . . 37 4.6 SdBot.exe: 自身のファイルの削除 . . . . 38 4.7 Polipos: スレッド挿入 . . . . 40 4.8 Polipos: svchost.exe に挿入されたスレッドの追跡 . . . . 40 5.1 BTS 用バッファの管理 . . . . 48 5.2 BTS から関数呼出し階層の取得 . . . . 50 5.3 Conficker.dll によるシステムコール . . . . 55 5.4 マルウェアが API を呼び出したときのスタック . . . 57 5.5 FPOTest.dll による NtCreateFile システムコール . . . . 59 5.6 svchost.exe へのコードインジェクション . . . . 61 6.1 x86 版 Windows と x64 版 Windows のシステムコール呼出しの流れ . . . 70 6.2 swapgs 命令による GS ベースアドレスの交換 . . . . 71 6.3 x64 版 Windows におけるシステムコールの引数 . . . . 72 6.4 WOW64 からのシステムコール . . . . 73 6.5 syscall フックと sysret フック . . . . 74 6.6 bat ファイルのドロップと cmd.exe の起動のログ . . . . 78表 目 次
4.1 Alkanet がログに記録するシステムコール . . . . 22 4.2 評価用マシンの構成 . . . . 28 4.3 PCMark05 によるベンチマーク結果 . . . . 31 4.4 耐解析手法に対する評価結果 . . . . 34 4.5 マルウェア 33 体の解析結果 . . . 421
第
1
章 緒論
1.1
背景
コンピュータとネットワークの普及に伴い,マルウェアの脅威が問題となっている. マルウェアは,Malicious (悪意ある) と Software の混成語であり,ウイルス,ワーム, トロイの木馬などに代表されるユーザの意図しない不正な動作を行うプログラムの総 称である.従来のマルウェアは愉快犯や自己顕示を目的としたものが多かったが,近年 のマルウェアは機密情報や金銭の窃取,更なる攻撃への踏み台確保などを目的としてお り,より社会を脅かす存在となっている.日本国内でも RAT (Remote Administration Tool/Remote Access Trojan) と呼ばれる遠隔操作型マルウェアを用いた特定企業・政 府機関に対する標的型攻撃 [1,2] や,インターネットバンキングの不正送金を行うマル ウェアの被害 [3, 4] などが確認されている. こうしたマルウェアの脅威に対して,様々な対策が行われている.例えば,マルウェ アが悪用する脆弱性を塞ぐためのセキュリティパッチの作成や,マルウェアを検知す る技術の強化,遠隔操作型マルウェアを指揮統制するサーバの無効化などが挙げられ る.これらの対策を実現するためには,マルウェアの感染経路や悪用する脆弱性,感 染後の活動や潜伏方法,外部と通信する場合の通信先や通信方法など,マルウェアの 特徴を理解することが必要となる.したがって,まずはマルウェアが持つ機能や挙動 を解析することが重要である. 一方で,前述のように,近年のマルウェアおよびそれを用いる攻撃者の目的は,金 銭や機密情報を得ることである.攻撃者からすれば,攻撃の要であるマルウェアを解 析され,対策が取られてしまうとこれらの目的を達成できなくなる.そのため,攻撃 者は,マルウェアに解析を妨害する様々な技術を組み込むことで,解析を困難にして いる.また,Symantec 社によれば,2011 年だけで 4 億 300 万種を超えるマルウェア が新たに出現し,前年比 41%増となっている [6].新たなマルウェアが急増している 主な要因として,自身と同様の挙動をする別の複製を生成するマルウェア [5] や,特 定のマルウェアをカスタマイズして作成するためのツールキットなどにより,いわゆ る亜種の作成が容易となっていることが挙げられる.このように次々に新種や亜種のマルウェアが出現している現状では,個々のマルウェアの解析に時間を費やすことは できない.以上から,マルウェア解析技術を向上させ,解析妨害技術を組み込まれた マルウェアでも短時間でかつ十分な情報の取得を可能とすることが必要である.本研 究では,マルウェア解析技術を向上させることで,マルウェア対策技術の発展,ひい てはマルウェアに脅かされない社会の実現に寄与することを目指す.
1.2
マルウェア解析手法と解決すべき課題
マルウェアの解析手法は,人手でマルウェアのコードを読み解く静的解析と,マル ウェアを実際に実行して挙動を観測する動的解析に大別される.静的解析は,マルウェ アの機能を網羅的に解析できるため,マルウェアについて詳細な情報が必要な場合に 有効である.一方で,動的解析は,比較的短時間でマルウェアの持つ機能や概略を把 握することが可能である.一般的なマルウェア解析手順では,まず解析にかかる時間 の短い動的解析を行い,その解析結果に基づき,必要に応じて静的解析による詳細な 解析を行う.しかし,解析に耐性があるマルウェアの場合,解析環境下で悪意ある挙 動を行わない,多重に難読化されているなどにより,短時間での解析では十分な情報 を得られないことが多い.特に静的解析の場合,コードの難読化やパッキングなどの 解析を妨害する技術の影響を受けやすく,解析にかかる時間が増大する.そのため, 静的解析で近年のマルウェアを短時間で解析することは困難である. また,前述のように新たに出現したマルウェアの中には亜種が多数含まれる.この ような亜種の場合,既知のマルウェアと同様の挙動をするものや,部分的に機能の追 加や改良が加えられたものも多い.そのため,動的解析の段階で既知種と挙動の類似 性が確認できれば,静的解析による詳細な解析を行う手間を削減できる.動的解析結 果の類似性からマルウェアを分類する取り組みや,挙動に基づいたマルウェア検出技 術の開発も実際に行われている [7, 8].したがって,動的解析において,解析に耐性を 持つマルウェアについても十分な情報取得が可能になれば,対策を実現するまでにか かる時間を大幅に減らすことに寄与できると考えられる.しかし,動的解析における 挙動観測の粒度や精度と観測によって発生するオーバヘッドはトレードオフの関係に あるため,詳細な情報を取得するために細粒度の挙動観測を行うと解析にかかる時間 が長くなってしまう.以上から,本研究では,観測オーバヘッドの小さい粗粒度の挙 動観測手法をベースとして,マルウェアの動的解析妨害機能への耐性を高めることを 目指す. 動的解析をする上で特に課題となるのが,挙動観測自体を困難にするアンチデバッグ1.2. マルウェア解析手法と解決すべき課題 3 機能と他のプロセスへ感染する機能である.アンチデバッグ機能 [9–11] は,マルウェ ア自身が動的解析の対象となっていることを検出し,実行の停止や解析の妨害などを 行うものである.動的解析では実際に実行されない挙動を解析することはできないた め,マルウェアは当該機能を用いて悪意ある機能を隠蔽する.既存研究には,アンチ デバッグ機能を回避するため,仮想計算機モニタ(VMM)やエミュレータを用いて, マルウェア実行環境の外部に解析機能を実現するものがある [12–15].しかし,一般的 な VMM やエミュレータが提供する仮想計算機 (VM) は,実機にない特徴を有してい ることが多く,マルウェアに検出されやすい [16]. 他のプロセスへ感染する機能は,他の動作中のプロセスに自身のコードを挿入し,そ のプロセスを隠れ蓑として悪意ある挙動を行うものである [17].動的解析では,マル ウェアを実行させる環境内で動作している他のアプリケーションの挙動と,マルウェ アの挙動を混交せずに解析する必要がある.当該機能は本来無害なプロセスに悪意あ る挙動を実行させるため,プロセスを単位としてマルウェアと他のアプリケーション を区別する従来の方法ではマルウェアに感染されたプロセス本来の挙動とその内部に 潜むマルウェアの挙動とを区別できない.以下,本論文では,当該機能を単にプロセ ス感染機能と呼称し,当該機能を持つマルウェアをプロセス感染型マルウェア,マル ウェアに感染されたプロセスを被感染プロセスと呼称する.さらに,被感染プロセス のメモリ空間内で,マルウェアに挿入されたコードが存在するメモリ領域を感染領域, 被感染プロセス本来のコードが存在するメモリ領域を非感染領域と呼称する. 以上から,本研究では下記の条件を満たす動的解析手法を実現する. (1) オーバヘッドが少なく,解析速度の低下を軽減できる. (2) 解析に耐性を持つマルウェアでも解析できる. (3) 他のプロセスへ感染するマルウェアでも解析できる. 本論文では,上記の 3 点を満たすために,VMM をベースとするシステムコールト レーサ Alkanet [18] と,プロセッサの持つブランチトレース機能を活用したシステム コールの呼出し元識別手法 BTS トレース [19] を提案する.Alkanet は,Windows で 動作するマルウェアを解析対象とし,典型的なアンチデバッグ機能やプロセス感染機 能を持つマルウェアでも短時間で解析可能にしている.Alkanet では,軽量な VMM である BitVisor [20] をベースとすることで,マルウェアに対して透過的,かつ高速な 動的解析を可能とする.また,典型的なプロセス感染型マルウェアは,挿入した悪意 あるコードを実行するためにスレッドも被感染プロセスに挿入する.Alkanet ではこ
の特徴に着目し,システムコールの発行者をスレッド単位で識別することでプロセス 感染機能を持つマルウェアについても解析を可能にしている.
さらに,BTS トレースでは,システムコール発行までに経由したメモリ領域の情報 を取得することで,より正確に被感染プロセス本来の挙動とマルウェアの挙動の判別 することを可能にする.BTS トレースでは,プロセッサの持つブランチトレース機能 の 1 つである BTS (Branch Trace Store) を活用することで,システムコールの呼出し 過程の取得を可能にしている.さらに,Windows が持つメモリ管理情報を用いて感染 領域の範囲を特定する.これらにより,感染領域を経由して発行されたシステムコー ルと,非感染領域のみを経由して発行されたシステムコールの区別を可能とする. 以上の提案手法により,これまで詳細な解析が必要であった動的解析を妨害する機 能を持つマルウェアでも短時間で解析が可能となる.すなわち,前述の挙動に基づい てマルウェアの分類や検出を行う既存研究などに提案手法で取得した解析結果を適用 することで,これまでより広範囲のマルウェアをすばやく処理することが可能となる ことも見込める.したがって,提案手法は,1.1 節で述べたようなマルウェアの対策技 術の発展などにも寄与できると考えられる.
1.3
論文の構成
前述のように,本論文では,VMM をベースとするシステムコールトレーサ Alkanet と,ブランチトレース機能を用いたシステムコールの呼出し元識別手法 BTS トレー スの 2 つの手法を提案する.以下,2 章では,特にマルウェアが持つ動的解析を妨害す る 2 つの機能,すなわち,アンチデバッグ機能とプロセス感染機能について述べ,既 存の動的解析技術ではこれらの機能を持つマルウェアを短時間で解析することが困難 であることを示す. 3 章では,前述した 3 つの目標に対する提案手法のアプローチを述べる.動的解析 の解析精度とオーバヘッドはトレードオフの関係にあるため,3 点の目標全てを両立 させることは容易ではない.1 つ目の提案手法である Alkanet は,典型的なマルウェ アを低オーバヘッドで解析可能なマルウェア動的解析システムを実現している.もう 一方の提案手法である BTS トレースは,Alkanet をベースとし,さらにプロセス感染 型マルウェアに対する解析精度を高めることを可能とする. 4 章では,システムコールトレーサ Alkanet の概要と構成,システムコールトレー ス手法の実装について述べる.また,ベンチマーク評価,典型的なアンチデバッグ手 法に対する耐性評価により,低オーバヘッドとアンチデバッグ機能に対する耐性を併1.3. 論文の構成 5 せ持つことを示す.さらに,実際に Alkanet 上で動作させたマルウェアの解析結果と 考察を述べ,典型的なプロセス感染型マルウェアを含む多様なマルウェアの解析に対 して有効であることを示す. 5 章では,BTS トレースについて述べ,プロセス感染型マルウェアに対する有効性 を示す.具体的には,BTS を用いて VM 内で実行された分岐命令を記録する手法,関 数呼出し階層の取得法,感染領域の識別手法を述べる.また,BTS トレースと既存手 法との比較評価や,実際にマルウェアが作成した感染領域を識別可能であることを示 す.さらに,パフォーマンス評価の結果や,マルウェアからの露顕性などについての 考察を述べる.
提案手法の基盤となる Alkanet は,x86 版 Windows XP Service Pack 3 をマルウェ ア実行環境として想定している.しかし,2015 年現在,Windows XP のサポート終 了や新しい Windows の登場に伴い,マルウェアの世代交代も進んでいる.そのため, 新しい Windows で動作するマルウェアの挙動を観測可能とする必要がある.6 章で は,新しいバージョンの Windows に対して,Alkanet の適応性に関する考察を述べ る.Alkanet の機能のうち,新しい Windows に対応するために再実装が必要となる機 能について述べ,x64 版 Windows 10 環境を対象とする Alkanet のプロトタイプ実装 を例に,変更が必要であった機能の詳細を述べる.さらに,当該プロトタイプを用い て行った基礎評価の結果について述べ,今後新しい Windows へ対応する場合について 考察を述べる. 7 章では関連研究として,既存の仮想化技術を活用したマルウェア動的解析システ ムについて述べ,Alkanet との比較について述べる.また,API やシステムコールの 呼出し元となったメモリ領域の識別を可能とする既存研究や分岐命令に着目して攻撃 を検出する既存研究などと BTS トレースとの比較についても述べる. 最後に,8 章で本論文で述べた提案手法とその成果をまとめ,今後の課題を示す.
7
第
2
章 動的解析における課題
2.1
緒言
動的解析は,実際にマルウェアを実行し,デバッガや API トレーサなどのモニタリ ングツールを用いて挙動を観測する手法である.マルウェアの動的解析における挙動 観測単位の最も細粒度のものとして,機械語命令単位やメモリアクセス単位で挙動を 観測する方法がある.細粒度の解析は,詳細な情報の取得が可能であるが,オーバヘッ ドが大きく,また,処理内容の理解に手間がかかる.比較的粗粒度のものには,呼び 出される Windows API を記録する API トレースや,発行されたシステムコールを記 録するシステムコールトレースがある.これらは,API やシステムコール呼出し時に のみ処理をフックするため,細粒度のものと比べてオーバヘッドが小さい.また,実 行された処理内容を API やシステムコールという意味のある単位で捉えるため,挙動 の理解が容易である.一方で,フック対象の API やシステムコールを使用せずに行わ れる挙動は観測できない.したがって,詳細さが必要な解析においては細粒度の観測 手法,高速さが求められる場合には粗粒度の観測手法が有効である. しかし,動的解析には本質的に下記に示す 3 点の課題があり,動的解析を妨害する 機能を持ったマルウェアはこれらの課題を悪用し,挙動観測自体を困難にする. • 観測期間内で実行されなかった挙動は解析できない. • マルウェアによって行われた挙動のみを識別可能にする必要がある. • 挙動観測の詳細度を向上させると,観測によるオーバヘッドが増加する. 動的解析では観測期間内で実行された挙動に基づいて解析が行われるため,特定の 条件下でのみ動作するような挙動の解析は困難である.マルウェアのアンチデバッグ 機能は,自身が解析下にあることを検出し,意図的に本来の挙動を実行しないことで解 析されることを防ぐ.また,マルウェアを実行する環境内では,他のアプリケーショ ンやバックグラウンドプロセスなども動作している.そのため,それらの動作とマル ウェアの動作とを混交せずに識別できなければ,観測すべきマルウェアの挙動を見逃す場合や,無害なアプリケーションの挙動をマルウェアの挙動として誤検出する場合 が発生する.プロセス感染型マルウェアは,本来無害なプロセスに悪意ある挙動を行 わせることで,自身の挙動の特定を困難にさせる.粗粒度の観測手法では,マルウェア の実行コードが存在するメモリ領域を詳細に追跡することが困難であるため,上記の ような見逃しや誤検出が発生しやすい.一方で,細粒度の挙動観測では,細かい動作 条件の特定や挙動実行者の識別精度向上が期待できるが,それに伴い観測オーバヘッ ドも増加する.観測オーバヘッドの増加は,短時間での解析を困難とするだけでなく, マルウェアに解析下にあることを検出される要因となる. 以下,本章では,Windows で動作するマルウェアを対象に,動的解析で課題となるアンチデバッグ機能とプロセ ス感染機能について述べ,既存の動的解析技術では解析困難であることを示す.
2.2
アンチデバッグ機能
前述のように,動的解析は,マルウェアを実行し,観測された挙動に基づいて行われ るため,観測期間内に実行されなかった挙動を解析することはできない.そのため,マ ルウェアは,悪意ある挙動を開始する前に自身が解析下にあることを検出することで, 解析者に対して本来の挙動を隠蔽するアンチデバッグ機能を持つ [9–11].したがって, 当該機能を持つマルウェアの本来の挙動について動的解析を行うためには,マルウェ アに検出されない方法でその挙動を観測する必要がある. 一般的なデバッガや API トレーサなどは,図 2.1 の (a) のように,マルウェアと同 じ環境で Windows が提供するデバッグ支援機能やドライバの助力を得て動作する.し かし,デバッグ支援機能は本来ソフトウェアをデバッグするためのものであるため, デバッグ対象のプログラムから不可視に動作できるように設計されていない.そのた め,当該機能を用いてマルウェアを解析すると,解析対象のマルウェアは解析されて いることを容易に検出できる.また,ドライバもユーザプログラムとの通信用インタ フェースや Windows のドライバ管理情報などがマルウェアから可視範囲内に存在す るため,完全に不可視とは言えない.そのため,個々のアンチデバッグ手法を無効化 する方法 [21] やデバッガ支援機能に頼らない独自の解析機能を実現する方法 [22] など が行われてきた.しかし,マルウェアと同じ環境で動作している以上,動的解析ツー ルの存在や痕跡を全て隠蔽することは困難である.また,無効化や隠蔽のために実行 環境の改竄を行っていくと,オーバヘッドの増大や実行環境全体への影響が大きくな り,正確な解析が難しくなるという問題もある. 既存研究では,図 2.1 の (b) のように,VMM やエミュレータを用いて,マルウェ2.3. プロセス感染機能 9 図 2.1 マルウェアの挙動観測方法 ア実行環境の外部に解析機能を実現する手法が用いられている [12–15].VMM やエ ミュレータは,それらが実現する VM 内で動作する OS よりも高い権限で動作するた め,OS やその上で動作している全てのプロセスを透過的に監視することが可能であ る.しかし,一般的な VMM やエミュレータが提供する VM は,特定のハードウェア のエミュレーションやゲスト OS との通信用のインタフェースなどにより,実機にな い特徴を有していることが多い.これらの特徴は,マルウェアに解析下にあることを 検出される要因となっている [16].また,既存研究の多く [12, 13] は,OS 内部の情報 を得るためのプロセスやドライバを VM 内に導入しており,これらも検出される要因 となり得る. また,動的解析では,マルウェア実行時に観測によるオーバヘッドが発生するため, 観測されていない場合と比べて処理時間が長くなる.そのため,マルウェアは,特定 の処理にかかる時間を計測して想定以上の時間がかかっていないかを調べることで, 自身が解析環境下にあることを検出するものも存在する.したがって,挙動観測によ るオーバヘッドの増加は,解析速度の低下だけでなく,マルウェアに検出されるリス クにもつながる.
2.3
プロセス感染機能
プロセス感染型マルウェアは,自身の持つ悪意あるコードの実行を他のプロセスに 行わせることで,解析者による解析やアンチウイルスソフトウェアによる検出を逃れ ようとする.被感染プロセスのメモリ空間には,マルウェアのコードが存在する感染 領域と正常な領域である非感染領域が混在し,どちらの領域も被感染プロセスによっ て実行される.したがって,従来の動的解析手法のようにプロセス単位で解析対象を図 2.2 挿入したコードの実行方法 区別している場合,被感染プロセスによって行われた挙動が被感染プロセス本来のも のであるのか,マルウェアによるものであるのかを判別できない. 当該機能は,大きく分けて被感染プロセスのメモリ空間へコードを挿入する段階と 実際にコードを実行する段階の 2 段階が存在する.コードの実行方法に着目すると,マ ルウェアが挿入したコードを実際に実行するためには,被感染プロセス内にそのコー ドを実行するためのスレッドを確保する必要がある.これは,Windows における実行 単位が,プロセスではなくスレッドであるためである.挿入したコードの実行方法に 着目すると,プロセス感染機能は図 2.2 に示す (a) スレッド挿入型,(b) スレッド乗っ 取り型に大別される.以下,本論文では,上記方法 (a),(b) を用いるプロセス感染型 マルウェアをそれぞれスレッド挿入型マルウェア,スレッド乗っ取り型マルウェアと 呼称する. 方法 (a) は,被感染プロセス内に感染領域のコードを実行するためのスレッドを新規に 作成する方法である.スレッドを新規に作成するため,被感染プロセス本来の処理を実 行しているスレッドに干渉することなく,挿入したコードを実行させることが可能であ る.Windows では,指定したプロセス内にスレッドを作成する CreateRemoteThread API が提供されているため,マルウェアは当該 API を用いることで容易に被感染プ ロセス内にスレッドを作成することができる.実際に,2007 年から今なお猛威を奮 う Zeus [23–25] などの数多くのマルウェアが,他のプロセスに対しスレッドの挿入を 行う. 方法 (b) は,被感染プロセス内に元々存在していたスレッドに挿入したコードを実 行させる方法である.例えば,標的型攻撃での使用率が近年急増している PlugX は,
2.4. 結言 11 無改竄の正規の実行ファイルを起動し,DLL プリロードやエントリポイントへのパッ チングなどによって,正規の実行ファイルのコードを実行するはずであったスレッド に悪意あるコードを実行させる [26, 27].また, 2012 年 9 月時点までに世界中で 900 万台の端末に感染したといわれる ZeroAccess は,バックグラウンドで動作しているプ ロセスのスレッドに対して,そのスレッドがスリープした時に実行するタスクとして 登録することで自身のコードを実行させる [28, 29]. 動的解析では,マルウェアの動作を他のアプリケーションの動作と混交せずに解析 する必要がある.プロセス感染型マルウェアの解析では,被感染プロセス内の感染領 域を起点とする挙動を識別可能にすることが望ましい.既存研究では,マルウェアが 書き込んだメモリ領域を 1 バイト単位で追跡する細粒度のテイント解析を行うことで, 感染領域の特定やその領域から行われる挙動を観測可能とするものがある [30,31].し かし,テイント解析の実現には,マルウェアが実行する命令やメモリアクセスを常に監 視する必要があるため,観測時に発生するオーバヘッドが大きい.一方,高速な解析に 向いている API トレースやシステムコールトレースなどでは,フック対象の API やシ ステムコールが感染領域から直接呼び出されるとは限らないため,観測した挙動が感 染領域を起源とするものであることを判別することは困難である.当該手法をベース とする既存研究の多くでは,プロセスを単位としてマルウェアと他のアプリケーショ ンとを区別するに留まっている [12, 15].この方法では,被感染プロセスで行われるマ ルウェアの挙動を見逃してしまうか,被感染プロセス本来の挙動をマルウェアの挙動 として誤検知してしまう.
2.4
結言
動的解析おける挙動観測手法としては,機械語命令単位やメモリアクセス単位で挙 動を観測する細粒度のものと,呼び出される API やシステムコールを観測する粗粒度 のものがある.詳細な情報を取得するために挙動観測粒度を細かくすると観測による オーバヘッドも増加し,オーバヘッド削減のために観測粒度を粗くすると挙動の見逃 しが発生しうる.また,動的解析はマルウェアを実行し,その挙動を観測する手法で あるため,観測期間内に実行されない挙動は解析できない.マルウェアが持つ動的解 析妨害機能の 1 つであるアンチデバッグ機能は,自身が解析下にあることを検出し,動 作の停止や解析を妨害する活動を行う.これまでにも,当該機能を無効化する試みや 仮想化技術を用いた解析機能の隠蔽が行われているが,容易に検出可能な特徴を残し ているものが多く,十分な対策が取られているとは言いがたい.もう 1 つの動的解析妨害機能であるプロセス感染機能は,他のプロセス内に自身のコードを挿入すること で,そのプロセスを隠れ蓑として悪意ある挙動を行う.動的解析ではマルウェアの動 作を他のアプリケーションの動作と混交せずに解析する必要がある.しかし,被感染 プロセス本来の挙動とその内部に潜んだマルウェアの挙動の区別は困難であり,既存 手法では細粒度の解析を行う必要がある.このように,動的解析妨害機能を持つマル ウェアは既存の動的解析手法では短時間での解析が困難となっている.
13
第
3
章 提案手法
3.1
緒言
既存研究では,解析に耐性を持つマルウェアや他のプロセスへ感染するマルウェア を解析可能にするために,解析機能の隠蔽や細粒度での挙動観測を行っている.しか し,これらは,容易に検出可能な特徴を残しているものや,オーバヘッドが高く短時間 での解析に向かないものが多い.本研究では,Windows のユーザ空間で動作するマル ウェアを解析対象とし,観測オーバヘッドを低く抑えつつ,上記の特徴を持つマルウェ アを解析可能とすることを目指す.本論文では,VMM をベースとするシステムコー ルトレーサ Alkanet と,ブランチトレース機能を用いたシステムコールの呼出し元識 別手法 BTS トレースの 2 つの手法を提案する.Alkanet は,典型的なマルウェアにつ いて短時間での解析を可能とするため,アンチデバッグ機能に対する耐性と低オーバ ヘッドでの挙動観測の両立を実現している.プロセス感染型マルウェアについては, 典型的なスレッド挿入型マルウェアを解析可能としている.呼出し元識別手法である BTS トレースは,Alkanet の拡張機能として実現することで,観測オーバヘッドの増 加と引き替えに被感染プロセス内に潜むマルウェアの挙動の識別精度を向上させる. 本章では,アンチデバッグ機能に対する耐性と低オーバヘッドでの挙動観測を両立す るためのアプローチについて述べた後,プロセス感染型マルウェアに対する Alkanet と BTS トレースのアプローチをそれぞれ述べる.3.2
アンチデバッグ耐性と低オーバヘッドの両立方法
提案手法では,アンチデバッグに対する耐性を高め,さらに低オーバヘッドでの挙動 観測を可能とすることを目標にする.そのためには,マルウェアの可視範囲に解析シ ステム特有の特徴を出さないことと,挙動のフック頻度やエミュレーションの必要性 を低く抑えることが必要である.本節では,これらを実現するための提案手法 Alkanet のアプローチを述べる.3.2.1
解析基盤
2.2 節で述べたように,Windows のデバッグ支援機能を用いると情報の収集は容易 となるが,マルウェアによる解析の検出・妨害も容易となってしまう.既存研究では, VMM やエミュレータを用いることで,多くのアンチデバッグの影響を受けずに解析 を可能としている [12–15].しかし,一般的な VMM やエミュレータは,マルウェア に検出されやすい特徴を持つ [16].また,エミュレータはオーバヘッドが大きいため, 短時間での解析には不向きであり,実行時間の時間計測を行うマルウェアに検出され やすい. 以上から,本研究では,解析に耐性を持つマルウェアも解析でき,かつ,オーバヘッド を少なく抑えるべく,軽量な VMM である BitVisor [20] をベースとして,マルウェア動的 解析システムを構築する.BitVisor は,Intel VT(Intel Virtualization Technology)[32] や AMD-V(AMD Virtualization)[33] といったハードウェアによる仮想化支援機能 を利用して仮想環境を構築する.当該機能により,エミュレーションが不要な命令は 実 CPU 上で実行され,エミュレーションが必要な命令についても容易にフックが可 能となる.また,BitVisor では,実マシンに搭載されているハードウェアの多くをそ のまま VM に提供する準パススルー方式を採用しているため,マルウェアに対して実 環境とほぼ同等の環境を提供することができる.したがって,ハードウェア構成から マルウェアに検出されることはなく,エミュレーションが必要な処理も最小限に抑え ている.以上により,仮想化のオーバヘッドを最小に抑えられるため,ソフトウェア のみで実現されたエミュレータや VMM に比べ,高速に動作することが可能である. すなわち,解析時間の短縮や時間計測を用いたアンチデバッグの回避が見込める. ただし,BitVisor も仮想化支援機能が提供する命令を用いたゲスト OS との通信用 インタフェースを持っている.そこで,マルウェア実行後に当該命令が実行された場 合に,仮想化支援機能を使用していない状態をエミュレーションすることで,当該イ ンタフェースの存在を隠蔽する.3.2.2
OS
の内部情報を取得する方法
Windows 上で動作するマルウェアを解析するためには,Windows 内部の情報を取 得する必要がある.しかし,VMM と OS は互いに独立したソフトウェアであるため, VMM が OS 内部の情報を取得することは容易ではない [34, 35].仮想化技術を活用し た既存の動的解析システムの多くは,OS 内部に情報提供用エージェントとして動作 するプロセスやドライバを導入している [12, 13].しかし,この方法では,マルウェア3.2. アンチデバッグ耐性と低オーバヘッドの両立方法 15 にエージェントを検出・攻撃される恐れがある.また,VMM 側からエージェントの 隠蔽や保護を行うことも可能であるが,オーバヘッドの原因となる. そこで,提案手法では, VMM として動作する解析システムに Windows が使用す るメモリ領域を直接参照し,独自に Windows のデータ構造の解釈を行う機能を実現 する.VMM は, OS より高い権限で動作するため, OS のメモリ領域も含め,VM 内の全てのメモリ領域にアクセスできる.これにより,マルウェアに対して不可視性 を保ちながら,Windows 内部情報の取得を可能とする.
3.2.3
挙動の観測粒度
マルウェアの挙動観測手法には,機械語命令単位やメモリアクセス単位で挙動を観 測する細粒度のものと,呼び出される API やシステムコールを観測する粗粒度のもの がある.高速な解析を実現するという目的においては,最も粗粒度かつ抽象度の高い Windows API を観測する API トレースが,観測オーバヘッドの低さと挙動の理解容易 性の高さの観点で有効である.しかし,フック対象 API より下位の API やシステム コールをマルウェアが直接呼出した場合,フックを回避されてしまう.また,Software Breakpoint Detection や Stolen Bytes などの API フックを回避するためのアンチデ バッグ手法 [9–11] も存在する.これらは,API を提供する DLL がユーザ空間にマッ プされていることを利用し,フックの検出・回避を行う. 提案手法では,マルウェアがシステムに影響を与えるためにシステムコールを必要 とすることに着目し,システムコールトレースを採用する.具体的には,発行される システムコールをフックし,その種類や引数などを記録する.システムコールのエン トリポイントは,カーネル空間に存在するため,ユーザモードで動作するプロセスか らはアクセスできず,また,エントリポイントを経由せずに呼び出すこともできない. すなわち,マルウェアが意図的にフックを回避することはできない.また,システム コールトレースのログは,API トレースのログと比較して抽象度が低いものの,機械 語命令単位やメモリアクセス単位と比べれば抽象度が高く挙動の理解が容易である. 以上から,システムコールトレースは,マルウェアの挙動を確実に,かつ低オーバヘッ ドで観測可能であり,挙動の理解が容易なログを提供できる.したがって,ユーザモー ドで動作するマルウェアを解析する上で,システムコールをトレースすることは有効 であると考えられる.3.3
プロセス感染型マルウェアの観測方法
3.3.1
システムコール発行者の識別粒度
3.2 節で,提案手法では,アンチデバッグ機能に対する耐性と低オーバヘッドでの解 析を両立するために,VMM からシステムコールトレースを行うことでマルウェアを 解析することを示した.マルウェアの動作を他のアプリケーションの動作と混交せず に解析するために,観測したシステムコールがマルウェアによって発行されたのか否 かを識別可能とする必要がある. 提案手法と同様に VMM やエミュレータを用いて API トレースやシステムコールト レースを実現する既存研究では,CR3 レジスタの値をベースとし,プロセス単位でマ ルウェアの挙動とそれ以外の挙動とを区別するものが多い [12, 15].しかし,プロセス 感染型マルウェアの場合,プロセス単位で見ると被感染プロセスが悪意ある挙動を実 行している形となるため,より細粒度でマルウェアが動作していることを識別可能と することが望ましい.ただし,前述のように粒度を細かくすると同時にオーバヘッド も増加するため,提案手法が満たすべき他の 2 つの目標の達成が困難となる. 以上から,本論文ではこの課題に対し,システムコールを発行したスレッドに着目し た比較的粗粒度かつ低オーバヘッドの識別手法と,システムコール発行までにそのス レッドが実行したメモリ領域に着目する細粒度の呼出し元識別手法の 2 つの解決策を 示す.前者は Alkanet の一部として実現しており,典型的なプロセス感染型マルウェ アであるスレッド挿入型マルウェアの解析を可能とする.後者は 2 つ目の提案手法で ある BTS トレースであり,被感染プロセス本来の挙動との区別がさらに困難なスレッ ド乗っ取り型マルウェアも含め,プロセス感染型マルウェアの挙動を識別可能とする.3.3.2
スレッド単位の識別手法
Windows では実際にコードを実行するのはスレッドであるため,マルウェアは挿入 したコードを実行するためのスレッドを被感染プロセス内に確保する必要がある.そ のため,典型的なプロセス感染型マルウェアは,コードとともにスレッドを挿入する ことで,被感染プロセス本来の動作に干渉せずに悪意あるコードを実行する. Alkanet では,マルウェアのコードを実行するスレッドを追跡する機能を実現する. 具体的には,Windows のスレッド管理のためのデータ構造を解釈することでシステム コールを発行したスレッドを識別し,かつ,発行されたシステムコールの引数などか らマルウェアが作成したスレッドの識別を可能とする.これにより,被感染プロセス3.3. プロセス感染型マルウェアの観測方法 17 内に作成された悪意あるスレッドが発行したシステムコールと,他のスレッドが発行 したシステムコールとの区別が可能となる.
3.3.3
メモリ領域単位の識別手法
スレッド乗っ取り型マルウェアは,被感染プロセスに元々存在するスレッドを悪用 するため,Alkanet によるスレッド単位での識別手法でもマルウェアの挙動と被感染 プロセス本来の挙動の区別は困難である.具体的には,図 3.1 に示すように,被感染 プロセス内のスレッドが発行するシステムコールにはシステムコールを呼出すまでの 過程に感染領域を含むものと非感染領域のみであるものが混交する.そこで,BTS ト レースでは,システムコールが感染領域を経由して発行されたか否かをメモリ領域単 位で識別可能にする.提案手法の技術的課題は,(1) 監視対象のシステムコールが発 行されるまでの関数呼出し階層の取得と,(2) 感染領域の識別の 2 点となる. 課題 (1) に対する解決手法として,スタックに積まれた戻りアドレスを利用するス タックトレースが考えられる [36].しかし,スタックトレースは,プロセスのスタッ ク領域がユーザ空間に存在するため,マルウェアによりスタックを改竄・偽装された 場合に,正確な関数呼出し階層を取得できない [37].したがって,課題 (1) を解決す るためには,マルウェアが改竄できない情報に基づいて関数呼出し階層を取得する必 要がある.提案手法では,近年のプロセッサに搭載されているブランチトレース機能 の 1 つである BTS に着目し,実際に実行された分岐命令の情報から,スタックトレー スと同等の関数呼出し階層を取得する. 課題 (2) については,既存研究 [30, 31] でも行われているように細粒度のテイント解 析による解決が考えられるが,オーバヘッドが大きくなる.提案手法では,Windows のメモリ管理用のデータ構造 VAD (Virtual Address Descriptor) および PTE (Page Table Entry) から,実行ファイルがマッピングされている領域やページのアクセス権 限に関する情報を取得可能であることに着目する.また,ファイル作成やメモリの確 保などにはシステムコールが必要であるため,これらのシステムコールを解析するこ とで,マルウェアが作成したファイルや確保したメモリ領域を取得することができる. したがって,これらの情報を組み合わせることで,感染領域と非感染領域を識別し,課 題 (2) を解決する. 以上の課題を解決し,Alkanet に BTS トレース機能を実現することで,感染領域を起 源とするシステムコールと非感染領域のみを経由して発行されたシステムコールとを 識別可能となる.これにより,被感染プロセス本来の挙動と混交せずにスレッド乗っ図 3.1 スレッド乗っ取り型マルウェアのシステムコール呼出し過程 [19] 取り型マルウェアの挙動を解析可能とする.
3.4
結言
本章では,1 章で述べた 3 つの特徴を合わせ持つマルウェア動的解析手法を実現する ための提案手法のアプローチを述べた.提案手法の 1 つである Alkanet では,動的解 析では観測期間内に動作しなかった挙動は解析できないことから,典型的なアンチデ バッグに対する耐性を優先し,かつ低オーバヘッドの両立を目指す.具体的には,軽 量な VMM をベースとし,マルウェアに対して透過的なシステムコールトレースを実 現することでこの目標を達成する.プロセス感染機能を持つマルウェアに対しては, マルウェアをスレッド単位で区別することで,典型的なプロセス感染型マルウェアで あるスレッド挿入型マルウェアの解析を可能とする.もう 1 つの提案手法である呼出 し元識別手法 BTS トレースは,システムコール発行に至るまでに実行されたメモリ 領域の情報を取得することで,感染領域を起源とするシステムコールを識別可能にす る.BTS トレースを Alkanet の拡張機能として実現することで,被感染プロセス内で 動作するマルウェアの挙動をより高い精度で識別することが可能となる.これら 2 つ の提案手法により,これまで詳細な解析が必要であった動的解析妨害機能を持つマル ウェアを既存研究より低オーバヘッドでの挙動観測を可能にする.19
第
4
章
Alkanet
4.1
緒言
1 章で述べたように,本研究では下記の条件を満たす動的解析手法を実現する. (1) オーバヘッドが少なく,解析速度の低下を軽減できる. (2) 解析に耐性を持つマルウェアでも解析できる. (3) 他のプロセスへ感染するマルウェアでも解析できる. 本章では,以上の 3 点を満たすために,VMM を用いたマルウェア解析のためのシス テムコールトレーサ Alkanet [18] を提案する. Alkanet は,Windows で動作するマル ウェアを解析対象とし,典型的なアンチデバッグ機能やプロセス感染機能を持つマル ウェアでも短時間に解析可能とする.Alkanet では,軽量な VMM である BitVisor を ベースとして,マルウェアの可視範囲内に解析システム特有の特徴を出さず,高速に システムコールトレースを行う機能を実現している.これにより,アンチデバッグ機 能に対する耐性と観測オーバヘッドの低さを両立させている.実際に,典型的なアン チデバッグ手法に対する耐性評価を行い,Alkanet が高い耐性を持つことを確認した. また,典型的なプロセス感染型マルウェアではスレッドも被感染プロセスに挿入され ることに着目し,Alkanet ではシステムコールの発行者をスレッド単位で識別する機 能を実現している.さらに,パフォーマンス評価を行い,Alkanet が従来の動的解析 システムと比較して十分に高速であることも確認している.以下,本章では,Alkanet の構成とシステムコールトレースの詳細について述べ,各種評価結果について示す.4.2
Alkanet
の構成と概要
4.2.1
構成
Alkanet の全体構成を図 4.1 に示す.Alkanet は,2 台の PC を用いてマルウェアの 挙動観測と解析を行う.マルウェア観測用 PC 上では,マルウェアを動作させ,シス図 4.1 Alkanet の全体構成 [18]
テムコールトレースを行う.ロギング用 PC では,ログを収集し,解析を行う. Alkanet は, Intel VT を利用するバージョンの BitVisor [20] 内部に拡張機能として 実装している.準パススルー型の VMM である BitVisor は,実ハードウェアの多く を VM へ提供する.Intel VT 版 BitVisor は,ゲスト OS との通信用のインタフェー スに vmcall 命令を用いている. vmcall 命令は,VMM が動作していない状態で使用す ると,#UD(未定義オペコード)例外が発生する. したがって,Alkanet では,vmcall 実行時に VM へ #UD 例外を発生させることで,BitVisor が動作していることを隠蔽 する.
マルウェアの実行環境であるゲスト OS には,x86 版 Windows XP Service Pack 3 を用いている.Alkanet は,この環境で発行されるシステムコールをシステムコール ハンドラの入口と出口でフックし,Alkanet 内部のシステムコールアナライザに制御 を移し,その種類や引数などを取得・記録する.
4.2. Alkanet の構成と概要 21 Access を用いてロギング用 PC に転送される.このログ取得手法は,Alkanet による 送信処理が不要であるため,Alkanet に負荷をかけずにログを取得できる.ロギング 用 PC のログ解析ツールは,Alkanet から取得したログから,システムコールのグルー プ化や,各種 ID やファイルパスなどを用いたログ同士の関連付け,別プロセスに挿 入されたスレッドの追跡などを行う.
4.2.2
監視対象とするシステムコール
効率的にマルウェアの挙動を観測するためには,マルウェアが使用するシステムコー ルに絞って情報を取得する必要がある.例えば,ファイルやレジストリの改竄には, ファイルやレジストリを読み書きするシステムコールが必要である.また, DoS 攻撃 やスパムメールの送信を行う場合,ネットワークの操作を行うシステムコールの発行 が必要である.典型的なマルウェアの機能は,以下のような挙動で構成される. • ファイルのオープン,作成,読出し,書込み • レジストリの参照,設定 • 仮想メモリの読出し,書込み,確保,権限の変更 • ファイルマッピングの作成,オープン,ビューの作成 • ネットワークに対する送信,受信 • プロセスの作成,終了 • スレッドの作成,終了,停止,再開,コンテキスト変更 • ドライバのロード,アンロード • 処理時間の計測 • スリープ Alkanet では,上記の挙動に対応するシステムコールに限定して,情報を取得し,ロ グを取得する.これにより,より高速な動的解析を実現する.具体的に Windows XP でトレース対象とするシステムコールの例を表 4.1 に示す.4.2.3
取得する情報
Alkanet は,システムコールのフック時に以下の情報を取得する. • システムコール発行元の Cid と実行ファイル名 • システムコール番号表 4.1 Alkanet がログに記録するシステムコール [18]
挙動 フックするシステムコールの例
ファイル NtCreateFile, NtOpenFile, NtWriteFile, NtReadFile, NtSetInformationFile, NtDeleteFile
レジストリ NtCreateKey, NtOpenKey, NtQueryKey, NtSetInformationKey, NtDeleteKey, NtSetValueKey, NtQueryValueKey, NtDeleteValueKey
仮想メモリ NtWriteVirtualMemory, NtReadVirtualMemory, NtAllocateVirtualMemory, NtProtectVirtualMemory
ファイルマッピング NtCreateSection, NtOpenSection, NtMapViewOfSection ネットワーク NtDeviceIoControlFile, NtCreateFile, NtReadFile,
NtWriteFile
プロセス NtCreateProcess, NtCreateProcessEx, NtTerminateProcess スレッド NtCreateThread, NtSuspendThread, NtResumeThread,
NtTerminateThread, NtGetContextThread, NtSetContextThread ドライバ NtLoadDriver, NtUnloadDriver 時間 NtQueryPerformanceCounter スリープ NtDelayExecution • システムコールの引数と戻り値 Cid は,プロセス ID とスレッド ID の組であり,ログ取得時におけるシステムコー ル発行元の区別に用いられる.また,その実行ファイルの名前も取得する.さらに, システムコールが示す挙動を調査するために,システムコールの引数と戻り値も取得 する.
4.3
システムコールトレースの実装
システムコールトレースの実装には,下記の機能が必要である.以下,本節では, x86 版 Windows XP Service Pack 3 を対象とする各機能の実装について述べる.• システムコールのフック • システムコールの特定 • プロセスとスレッドの特定
4.3. システムコールトレースの実装 23
• 引数と戻り値の取得
4.3.1
システムコールのフック
Alkanet のシステムコールフックの流れを図 4.2 に示す.x86 版 Windows XP Service Pack 3 におけるシステムコールは,通常 sysenter 命令によってカーネルモードへ遷 移し,sysexit 命令でユーザモードへ遷移する.Alkanet は, sysenter 命令のジャンプ 先である KiFastCallEntry と,sysexit 命令を実行する KiSystemCallExit2 に,ハード ウェアブレイクポイントを設定することでフックを行う.これらのアドレスの取得に は,公開されているシンボル情報を用いる [38]. 具体的な Alkanet によるシステムコールフックの流れを以下に示す.本論文では, sysenter 命令実行時のフック (図中の③∼⑤),sysexit 命令実行時のフック (図中の⑦ ∼⑨) をそれぞれ sysenter フック,sysexit フックと呼称する. ① ユーザプログラムがシステムコールのスタブを呼出す. ② スタブは,システムコール番号の設定などを行った後,KiFastSystemCall を経 由して sysenter 命令を実行する. ③ KiFastCallEntry に設定されたブレイクポイントによりデバッグ例外が発生し, Alkanet に制御が移る. ④ Alkanet が発行元プロセスやスレッド,システムコールの情報など必要な情報を 取得する. ⑤ Windows に制御が戻り,KiFastCallEntry から実行が再開される. ⑥ システムコールサービスルーチンが実行される. ⑦ KiSystemCallExit2 に設定されたブレイクポイントにより再び Alkanet に制御が 移る. ⑧ Alkanet は,④で取得した情報に加え,システムコールの結果を取得する. ⑨ Windows に制御が戻り,KiSystemCallExit2 から実行が再開される. ⑩ KiSystemCallExit2 が sysexit 命令を実行する. ⑪ KiFastSystemCallRet とスタブを経由しつつ,ユーザプログラムに制御が戻る.
図 4.2 システムコールフックの流れ なお,ハードウェアブレイクポイントの設定に使用するデバッグレジスタは,デバッ グレジスタに対する mov 命令をフックすることで,ゲスト OS から隠蔽する.ハード ウェアブレイクポイントの使用の有無を確認するアンチデバッグ機能を持つマルウェ アについては 4.5 節で述べる.