「マルウェア解析の素晴らしい集中講座です。」
—Dino Dai Zovi, 独立セキュリティコンサルタント
「現代のマルウェアがもたらす特有の課題を理解するために必要なすべての重要なスキルを詳細にカバーした、最も包括的なマルウェア解析ガイドです。」
— Chris Eagle, コンピュータサイエンス講師, 海軍大学院
「マルウェア解析の実践的な入門書です。Windowsマルウェアを解析したいすべての人にお勧めします。」
— Ilfak Guilfanov,IDA Proの創設者
「マルウェア解析の素晴らしい入門書です。すべての章に詳細な技術説明と実際のマルウェアに即座に触れられる実習課題が含まれています。」
— Sebastian Porst, Googleソフトウェアエンジニア
「すべてのスキルレベルの読者にリバースエンジニアリングを提供します。技術的に豊かでアクセスしやすく、実習課題を通じてリバースエンジニアリングの芸術と科学を深く理解できるように導きます。初心者にも専門家にも強くお勧めします。」
— Danny Quist, PhD, Offensive Computing創設者
「唯一のマルウェア本を読むなら、またはマルウェア解析の世界に飛び込みたいなら、これが手に入れるべき本です。」
— Patrick Engbretson, ダコタ州立大学のIA教授, 『The Basics of Hacking and Pen Testing』の著者
「ソフトウェアセキュリティや侵入検知システムの高度な大学院レベルのコース教材に素晴らしい追加です。特に実習課題は、リバースエンジニアリング、解析、悪意あるソフトウェアの理解方法を学生に教えるのに役立ちます。」
— Sal Stolfo, コロンビア大学教授
これはマルウェアについての本です。この本で紹介されているリンクやソフトウェアは悪意のあるものです。未知のコードを実行したり信頼できないURLを訪れたりする際は、十分に注意してください。
マルウェア解析のために安全な仮想環境を作成するヒントについては、第2章を参照してください。軽率な行動は避け、環境をしっかりと保護しましょう。
実践的マルウェア解析
悪意のあるソフトウェアを分析するための実践ガイド
マイケル・シコースキー、アンドリュー・ホニッグ著
サンフランシスコより
「実践マルウェア解析」。著作権 © 2012 マイケル・シコースキーおよびアンドリュー・ホニッグFor information on book distributors or translations, please contact No Starch Press, Inc. directly。
すべての権利を保有します。本書の一部または全部を、電子的、機械的手段を問わず、複製、伝送することはできません。これには、コピー、録音、情報の保存や検索システムを含みます。ただし、著作権者および出版社の事前の書面による許可がある場合は除きます。
16 15 14 13 12 1 2 3 4 5 6 7 8 9
ISBN-10: 1-59327-290-1
ISBN-13: 978-1-59327-290-6
出版社: William Pollock
制作編集者: Alison Law
表紙イラスト: Hugh D’Andrade
内部デザイン: Octopod Studios
開発編集者: William Pollock と Tyler Ortman
技術レビュアー: Stephen Lawler
コピーエディター: Marilyn Smith
組版者: Riley Hoffman
校正者: Irene Barnard
索引作成者: Nancy Guenther
書籍の販売元や翻訳に関する情報については、No Starch Press, Inc. に直接お問い合わせください:
No Starch Press, Inc.
38 Ringold Street, San Francisco, CA 94103
電話: 415.863.9900; ファックス: 415.863.9950; info@nostarch.com; www.nostarch.com
米国議会図書館の出版データ
この本のカタログ記録は米国議会図書館から入手できます。
No Starch PressおよびNo Starch Pressのロゴは、No Starch Press, Inc.の登録商標です。本書に記載されているその他の製品および会社名は、それぞれの所有者の商標である可能性があります。商標名のすべての使用箇所に商標記号を付ける代わりに、編集目的でのみ名前を使用し、商標権を侵害する意図はありません。
本書の情報は「現状のまま」提供されており、保証はありません。本書の準備にあたり細心の注意を払いましたが、著者およびNo Starch Press, Inc.は、本書に含まれる情報に起因または関連して直接的または間接的に生じたとされるいかなる損失や損害についても、いかなる責任も負いません。
著者について
リチャード・ベイトリックによる序文
謝辞
イントロダクション
第0章: マルウェア分析の入門
第1部: 基本分析
第1章: 基本的な静的技術
第2章: 仮想マシンでのマルウェア分析
第3章: 基本的な動的分析
第2部: 高度な静的分析
第4章: x86逆アセンブルの速習
第5章: IDA Pro
第6章: アセンブリでCコードの構造を認識する
第7章: 悪意のあるWindowsプログラムの分析
第3部: 高度な動的分析
第8章: デバッグ
第9章: OllyDbg
第10章: WinDbgを用いたカーネルデバッグ
第4部: マルウェアの機能
第11章: マルウェアの挙動
第12章: 秘密裏にマルウェアを起動する方法
第13章: データのエンコード
第14章: マルウェアに特化したネットワークシグネチャ
第5部: リバースエンジニアリング対策
第15章: 逆アセンブル対策
第16章: デバッグ対策
第17章: 仮想マシン対策
第18章: パッカーとアンパッキング
第6部: 特別トピック
第19章: シェルコード解析
第20章: C++解析
第21章: 64ビットマルウェア
付録A: 重要なWindows関数
付録B: マルウェア解析ツール
付録C: 実習問題の解答
索引
著者について
テクニカルレビュアーについて
寄稿者について
リチャード・ベイトリックによる序文
謝辞
個別の感謝
イントロダクション
マルウェア解析とは?
前提条件
実践的なハンズオン学習
本書の内容
0
マルウェア分析の入門
マルウェア解析の目的
マルウェア解析の技術
基本的な静的解析
基本的な動的解析
高度な静的解析
高度な動的解析
マルウェアの種類
マルウェア解析の一般的なルール
1
基本的な静的技術
ウイルス対策スキャン: 役立つ最初のステップ
ハッシュ化:マルウェアの指紋
文字列の検出
パッキングおよび難読化されたマルウェア
ファイルのパッキング
PEiDによるパッカーの検出
ポータブル実行ファイル形式
リンクされたライブラリおよび関数
静的リンク、ランタイムリンク、および動的リンク
Dependency Walker を使用して動的にリンクされた関数の探索
インポートされた関数
エクスポートされた関数
実践的な静的解析
PotentialKeylogger.exe:アンパックされた実行ファイル
PackedProgram.exe:行き詰まり
PE ファイルのヘッダーとセクション
PEview を使った PE ファイルの検査
Resource Hacker でリソースセクションを表示
その他の PE ファイルツールの使用
PE ヘッダーの概要
結論
演習
2
仮想マシンでのマルウェア分析
仮想マシンの構造
マルウェア分析用マシンの作成
VMware の設定
マルウェア分析用マシンの使用
マルウェアをインターネットに接続する
周辺機器の接続と切断
スナップショットの取得
仮想マシンからのファイル転送
マルウェア分析における VMware 使用のリスク
記録/再生:コンピュータを逆方向に動かす
結論
3
基本的な動的分析
サンドボックス:簡易的アプローチ
マルウェアサンドボックスの使用
サンドボックスの欠点
マルウェアの実行
Process Monitor を使った監視
Procmon の表示
Procmon でのフィルタリング
Process Explorer でのプロセス表示
Process Explorer の表示
検証オプションの使用
文字列の比較
Dependency Walker の使用
悪意のある文書の分析
Regshot を使ったレジストリスナップショットの比較
ネットワークの偽装
ApateDNSの使用
Netcatによる監視
Wiresharkによるパケットスニッフィング
INetSimの使用
基本的な動的ツールの実践
結論
演習
4
X86逆アセンブリのクラッシュコース
抽象化のレベル
リバースエンジニアリング
x86アーキテクチャ
主記憶装置
命令
オペコードとエンディアンネス
オペランド
レジスタ
簡単な命令
スタック
条件文
分岐
Rep命令
Cのメインメソッドとオフセット
詳細情報: Intel x86アーキテクチャマニュアル
結論
5
IDA PRO
実行可能ファイルの読み込み
IDA Proのインターフェース
逆アセンブリウィンドウモード
分析に役立つウィンドウ
デフォルトビューに戻る
IDA Proのナビゲーション
検索
クロスリファレンスの使用
コードのクロスリファレンス
データのクロスリファレンス
関数の分析
グラフオプションの使用
逆アセンブルの強化
場所の名前変更
コメント
オペランドのフォーマット
名前付き定数の使用
コードとデータの再定義
プラグインによるIDAの拡張
IDCスクリプトの使用
IDAPythonの使用
商用プラグインの使用
結論
実習
6
アセンブリでCコード構造を認識する
グローバル変数とローカル変数
算術演算の逆アセンブル
if文の認識
IDA Proを用いた関数のグラフィカルな分析
ネストされたif文の認識
ループの認識
forループの検出
whileループの検出
関数呼び出し規約の理解
cdecl
stdcall
fastcall
プッシュ対ムーブ
switch文の分析
Ifスタイル
ジャンプテーブル
配列の逆アセンブル
構造体の識別
リンクリストのトラバーサルの分析
結論
実習
7
悪意のあるWindowsプログラムの分析
Windows API
型とハンガリアン記法
ハンドル
ファイルシステム関数
特殊ファイル
Windowsレジストリ
レジストリのルートキー
レジストリエディタ
自動的に実行されるプログラム
一般的なレジストリ関数
実際のレジストリ コードの分析
.regファイルを使用したレジストリスクリプト
ネットワーキングAPI
Berkeley互換ソケット
ネットワーキングのサーバーとクライアント側
WinINet API
実行中のマルウェアの追跡
DLL
プロセス
スレッド
Mutexを使用したプロセス間の調整
サービス
コンポーネントオブジェクトモデル
例外:問題が発生したとき
カーネルモードとユーザーモード
ネイティブAPI
結論
演習
8
デバッグ
ソースレベルとアセンブリレベルのデバッガー
カーネルモードとユーザーモードのデバッグ
デバッガーの使用
シングルステップ実行
ステップオーバーとステップイント
ブレークポイントでの実行停止
例外
ファーストチャンス例外とセカンドチャンス例外
一般的な例外
デバッガーでの実行修正
実践でのプログラム実行の修正
結論
9
OLLYDBG
マルウェアのロード
実行ファイルのオープン
実行中のプロセスにアタッチ
OllyDbgインターフェース
メモリマップ
リベース
スレッドとスタックの表示
コードの実行
ブレークポイント
ソフトウェアブレークポイント
条件付きブレークポイント
ハードウェアブレークポイント
メモリブレークポイント
DLLの読み込み
トレース
標準バックトレース
コールスタック
ラントレース
ポイズンアイビーのトレース
例外処理
パッチ適用
シェルコードの解析
支援機能
プラグイン
OllyDump
デバッガーの隠蔽
コマンドライン
ブックマーク
スクリプトデバッグ
結論
演習
10
WINDBG を使用したカーネルのデバッグ
ドライバーとカーネルコード
カーネルデバッグのセットアップ
WinDbgの使用
メモリからの読み取り
算術演算子の使用
ブレークポイントの設定
モジュールのリスト化
マイクロソフトのシンボル
シンボルの検索
構造体情報の表示
Windowsシンボルの設定
実践的なカーネルデバッグ
ユーザースペースコードの確認
カーネルモードコードの確認
ドライバーオブジェクトの検索
ルートキット
実践的なルートキット分析
割り込み
ドライバーの読み込み
Windows Vista、Windows 7、およびx64バージョンのカーネル問題
結論
演習
11
マルウェアの挙動
ダウンローダーとランチャー
バックドア
リバースシェル
RATs(リモートアクセスツール)
ボットネット
RATsとボットネットの比較
資格情報の窃取
GINAインターセプション
ハッシュダンピング
キーストロークのロギング
永続化メカニズム
Windowsレジストリ
トロイの木馬化されたシステムバイナリ
DLLロードオーダーハイジャック
特権昇格
SeDebugPrivilegeの使用
痕跡を隠す—ユーザーモードルートキット
IATフッキング
インラインフッキング
結論
演習
12
隠れたマルウェアの起動
ランチャー
プロセスインジェクション
DLLインジェクション
直接インジェクション
プロセス置換
フックインジェクション
ローカルフックとリモートフック
フックを使用したキーロガー
SetWindowsHookExの使用
スレッドターゲティング
デトアーズ
APCインジェクション
ユーザースペースからのAPCインジェクション
カーネルスペースからのAPCインジェクション
結論
演習
13
データエンコーディング
エンコーディングアルゴリズムの分析の目的
単純な暗号
シーザー暗号
XOR
その他の単純なエンコーディングスキーム
Base64
一般的な暗号アルゴリズム
文字列とインポートの認識
暗号定数の検索
高エントロピーコンテンツの検索
カスタムエンコーディング
カスタムエンコーディングの特定
攻撃者にとってのカスタムエンコーディングの利点
デコード
セルフデコード
デコード関数の手動プログラミング
汎用復号のためのインスツルメンテーションの使用
結論
演習
14
マルウェアに焦点を当てたネットワーク署名
ネットワーク対策
マルウェアを自然な環境で観察する
悪意のある活動の兆候
OPSEC = 操作セキュリティ
攻撃者を安全にオンラインで調査する
間接戦術
IPアドレスとドメイン情報の取得
コンテンツベースのネットワーク対策
Snortを使用した侵入検知
詳細な検査
動的分析と静的分析技術の組み合わせ
過剰分析の危険性
目立たずに隠れる
周囲のコードの理解
ネットワークコードの発見
ネットワークコンテンツのソースを知る
ハードコーディングされたデータ vs. エフェメラルデータ
エンコーディングステップの特定と活用
署名の作成
解析ルーチンの分析
複数の要素をターゲットにする
攻撃者の視点を理解する
結論
演習
15
逆アセンブル防止
逆アセンブル防止の理解
逆アセンブルアルゴリズムの攻略
リニア逆アセンブル
フロー指向の逆アセンブル
逆アセンブル防止の技術
同じターゲットを持つジャンプ命令
定数条件を持つジャンプ命令
不可能な逆アセンブル
IDA Proで命令をNOP化する
フロー制御の隠蔽
関数ポインタの問題
IDA Proで不足しているコードのクロスリファレンスを追加する
リターンポインタの悪用
構造化例外ハンドラの誤用
スタックフレーム解析の妨害
スタックフレーム解析の妨害
結論
演習
16
デバッグ防止
Windowsデバッガー検出
Windowsデバッガー検出
Windows APIの使用
構造体の手動チェック
システム残留物のチェック
デバッガーの挙動の識別
INTスキャン
コードチェックサムの実行
タイミングチェック
デバッガー機能の妨害
TLSコールバックの使用
例外の使用
割り込みの挿入
デバッガーの脆弱性
PEヘッダの脆弱性
出力デバッグ文字列の脆弱性
結論
演習
17
仮想マシン対策技術
VMwareのアーティファクト
VMwareのアーティファクト
VMwareアーティファクト検索の回避
メモリアーティファクトのチェック
脆弱な命令
Red Pill Anti-VMテクニックの使用
No Pillテクニックの使用
I/O通信ポートのクエリ
str命令の使用
Anti-VM x86命令
IDA ProでのAnti-VMのハイライト
ScoopyNGの使用
設定の調整
仮想マシンからの脱出
結論
演習
18
パッカーズとアンパッキング
パッカーの解剖
アンパッキングスタブ
実行ファイルの読み込み
インポートの解決
テールジャンプ
アンパッキングの図解
パックされたプログラムの識別
パックされたプログラムの指標
エントロピー計算
アンパッキングのオプション
自動アンパッキング
手動アンパッキング
Import Reconstructorを使用したインポートテーブルの再構築
OEPの特定
手動でのインポートテーブルの修復
一般的なパッカーのためのヒントとトリック
UPX
PECompact
ASPack
Petite
WinUpack
Themida
完全にアンパックせずに分析
パックされたDLLM
結論
演習
19
シェルコード解析
解析のためのシェルコードの読み込み
位置に依存しないコード
実行場所の特定
call/popの使用
fnstenvの使用
手動でのシンボル解決
メモリ内のkernel32.dllの特定
PEエクスポートデータの解析
ハッシュされたエクスポート名の使用
完全なHello Worldの例
シェルコードのエンコーディング
NOPスレッド
シェルコードの発見
結論
演習
20
C++解析
オブジェクト指向プログラミング
thisポインタ
オーバーロードとマングリング
継承と関数のオーバーライド
仮想関数と非仮想関数
Vテーブルの使用
Vテーブルの認識
オブジェクトの作成と破壊
結論
演習
21
64ビットマルウェア
なぜ64ビットマルウェアか?
x64アーキテクチャの違い
x64呼び出し規約とスタックの使用の違い
64ビット例外処理
Windows 64ビット上の32ビットWindows
64ビットのマルウェア機能のヒント
結論
演習
A
重要なWindows関数
B
マルウェア解析ツール
C
演習向けのソリューション
Lab 1-1
Lab 1-2
Lab 1-3
Lab 1-4
Lab 3-1
Lab 3-2
Lab 3-3
Lab 3-4
Lab 5-1
Lab 6-1
Lab 6-2
Lab 6-3
Lab 6-4
Lab 7-1
Lab 7-2
Lab 7-3
Lab 9-1
Lab 9-2
Lab 9-3
Lab 10-1
Lab 10-2
Lab 10-3
Lab 11-1
Lab 11-2
Lab 11-3
Lab 12-1
Lab 12-2
Lab 12-3
Lab 12-4
Lab 13-1
Lab 13-2
Lab 13-3
Lab 14-1
Lab 14-2
Lab 14-3
Lab 15-1
Lab 15-2
Lab 15-3
Lab 16-1
Lab 16-2
Lab 16-3
Lab 17-1
Lab 17-2
Lab 17-3
Lab 18-1
Lab 18-2
Lab 18-3
Lab 18-4
Lab 18-5
Lab 19-1
Lab 19-2
Lab 19-3
Lab 20-1
Lab 20-2
Lab 20-3
Lab 21-1
Lab 21-2
索引
マイケル・シコースキは、Mandiantのコンピューターセキュリティコンサルタントです。彼はインシデント対応調査を支援するために悪意のあるソフトウェアを逆コンパイルし、連邦政府のクライアントに対して専門的な研究開発のセキュリティソリューションを提供しています。Mikeはマルウェア分析の一連のコースを作成し、FBIやBlack Hatなど、さまざまな聴衆にこれらを教えています。彼はMITリンカーン研究所からMandiantに移り、そこではパッシブネットワークマッピングとペネトレーションテストの研究を行っていました。また、MikeはNSAの3年間のシステムおよびネットワーク学際プログラム(SNIP)の卒業生でもあります。NSA在籍中に、彼は逆コンパイル技術の研究に貢献し、ネットワーク分析の分野で複数の発明賞を受賞しました。
アンドリュー・ホニグは国防総省の情報保証の専門家です。彼は、国家暗号学学校でソフトウェア分析、リバースエンジニアリング、Windowsシステムプログラミングのコースを教えており、認定情報システムセキュリティ専門家です。アンディは、VMwareの仮想化製品に関する複数のゼロデイ脆弱性を公に発見したことで知られており、カーネル内の悪意あるソフトウェアを含む革新的な悪意あるソフトウェアを検出するツールを開発しました。悪意あるソフトウェアと無害なソフトウェアの両方の分析と理解の専門家であり、コンピュータセキュリティ業界で10年以上のアナリスト経験があります。
スティーブン・ローラーは、小規模なコンピュータソフトウェアおよびセキュリティコンサルティング会社の創設者兼社長です。スティーブンは情報セキュリティ分野で7年以上にわたり積極的に活動しており、主にリバースエンジニアリング、マルウェア解析、脆弱性研究に従事しています。彼はマンディアントのマルウェア解析チームのメンバーであり、複数のフォーチュン100企業に影響を及ぼした高プロファイルなコンピュータ侵入事件の対応を支援しました。以前は、マンテック・インターナショナルのセキュリティ&ミッションアシュアランス(SMA)部門で勤務し、ソフトウェア保証活動の一環として多くのゼロデイ脆弱性やソフトウェアエクスプロイト手法を発見しました。コンピュータセキュリティとは無関係だった以前の職歴では、米海軍のSMMTTプログラムのソナーシミュレータコンポーネントの主任開発者を務めていました。
ニック・ハーバーは、Mandiant社のマルウェアアナリストであり、リバースエンジニアリングの分野で経験豊富なベテランです。彼の情報セキュリティにおける13年のキャリアは、国防総省コンピューターフォレンジック研究所でのコンピューターフォレンジック試験官および研究者として始まりました。過去6年間、NickはMandiantに所属し、主にマルウェア分析に注力してきました。彼は、リバースエンジニアリング防止技術の分野で研究を行っており、PE-Scramblerなどのパッカーやコード難読化ツールをいくつか作成しています。彼はBlack HatやDefconで何度もリバースエンジニアリング防止技術やアンチフォレンジック技術に関する発表を行ってきました。また、Black Hatの高度なマルウェア分析コースの主要開発者および講師でもあります。
リンジー・ラックは、Mandiantのテクニカルディレクターであり、情報セキュリティ分野で12年以上の経験を持ち、マルウェアのリバースエンジニアリング、ネットワーク防御、およびセキュリティオペレーションを専門としています。彼は、セキュリティオペレーションセンターの設立と運営に貢献し、ネットワーク防御の研究を主導し、安全なホスティングソリューションを開発しました。以前は、National Information Assurance Research Laboratory、大統領行政府(EOP)、Cable and Wireless、および米軍で勤務していました。スタンフォード大学でコンピュータサイエンスの学士号を取得しているほか、海軍大学院で情報保証を専門とするコンピュータサイエンスの修士号も取得しています。
ジェロルド "ジェイ" スミスは、Mandiantの主任コンサルタントであり、マルウェアのリバースエンジニアリングおよびフォレンジック分析を専門としています。この役職では、フォーチュン500企業を含む多様なクライアントを支援する多くのインシデント対応に貢献してきました。Mandiantに参加する前は、NSA(国家安全保障局)に勤務していましたが、その詳細について話すことは許されていません。ジェイは、カリフォルニア大学バークレー校で電気工学とコンピューターサイエンスの学士号を取得し、ジョンズ・ホプキンス大学でコンピューターサイエンスの修士号を取得しています。
デジタルセキュリティの分野の中でも、マルウェア、防御ツール、オペレーティングシステムに関わる領域ほど非対称性が顕著なものは少ないでしょう。
2011年の夏、私はネバダ州ラスベガスで開催されたブラックハットカンファレンスで、ピーテル(マッジ)ザトコの基調講演に参加しました。彼の講演では、現代のソフトウェアの非対称性が紹介されました。マッジは9,000個のマルウェアバイナリを分析し、サンプルセットの平均コード行数(LOC)が125行であると説明しました。
マッジのサンプルには「単純な」または「平凡な」マルウェアしか含まれていないと主張するかもしれません。では、真に「武器化」されたマルウェア、例えば(息を止めて)Stuxnetはどうでしょうか?ラリー・L・コンスタンティンによれば、Stuxnetは約15,000行のコードを含み、125行の平均的なマルウェアサンプルの120倍のサイズです。Stuxnetは高度に専門化され、標的に特化していたため、平均より大きなサイズだったのでしょう。
マルウェアの世界を少し離れて、私が使用しているテキストエディタ(GNOMEテキストエディタのgedit)は、gedit.cに295行のコードが含まれており、gedit.cは128個のソースファイル(さらに3つのディレクトリ)中の1つに過ぎません。
1.http://www.informit.com/articles/article.aspx?p=1686289
GNOME GITリポジトリのgeditソースコードにおいて、128のファイルと3つのディレクトリをすべてカウントすると、合計で70,484行のコード(LOC)があります。正当なアプリケーションのLOCとマルウェアの比率は500対1を超えています。テキストエディタのような比較的単純なツールと比べると、平均的なマルウェアは非常に効率的です。
Mudgeの125 LOCという数字は私には少し低く感じられました。なぜなら、「マルウェア」の定義はさまざまで、多くの悪意のあるアプリケーションは複数の機能やインフラ要素を含む「スイート」として存在するからです。このようなマルウェアを捉えるために、Zeusトロイの木馬のソース要素(.cpp、.obj、.hなど)をカウントし、253,774 LOCを得ました。Mudgeの平均的なサンプルと比較すると、この比率は2,000対1を超えます。
次に、MudgeはマルウェアのLOCを、それを防ぐためのセキュリティ製品のLOCと比較しました。彼は現代の防御製品に見られるLOCを1,000万と見積もりました。計算を簡単にするために、少なくとも1,250万行のコードを持つ製品があると仮定し、攻撃のLOCと防御のLOCの比率を100,000対1としました。つまり、攻撃側の1 LOCに対して、防御側は100,000 LOCのコードを書くことになります
また、MudgeはマルウェアのLOCを、それが標的とするオペレーティングシステムのLOCと比較しました。アナリストは、Windows XPは4500万行のコードで構築されていると見積もっており、Windows 7に何行のコードが使われているかは不明です。Mudgeは現代のオペレーティングシステムのコード量を1億5000万行と見積もっていましたが、計算を簡単にするために1億2500万行に修正すると、ターゲットのオペレーティングシステムのサイズとそれを攻撃するマルウェアのサイズの比率は100万対1になります。
LOCカウント演習から得られた視点をまとめましょう:
120:1 スタックスネットと一般的なマルウェア
500:1 シンプルなテキストエディタと一般的なマルウェア
2,000:1 マルウェアスイートと一般的なマルウェア
100,000:1 防御ツールと一般的なマルウェア
1,000,000: ターゲットとなるオペレーティングシステムと一般的なマルウェア
防御者の観点から見ると、防御ツールや対象のオペレーティングシステムの比率と平均的なマルウェアサンプルの数の関係はかなり厳しいものに見えます。マルウェアスイートのサイズを平均サイズに置き換えても、防御者の状況が大きく改善されるわけではなさそうです。防御者(およびそのベンダー)は、数千行のコードを作成するために多大な労力を費やしているのに、それがずる賢い侵入者によって少ない行数で粉砕されてしまうようです。
防御者はどうすればいいのでしょうか?答えは、数で劣勢に立たされている指導者が使う戦術を参考にすることです。つまり、「障害」を「機会」として再定義するのです。防御ツールや対象オペレーティングシステムのサイズを気にするのはやめましょう。それらについてできることはあまりありません。マルウェアサンプルが(相対的に見て)小さいことを喜びましょう。
2.http://git.gnome.org/browse/gedit/tree/gedit?id=3.3.1
ソースコードレベルで防御ツールがどのように機能するかを理解しようとすることを想像してみてください。その12.5百万行のコード(LOC)に向き合うのは大変な作業です。一部の研究者はこのようなペットプロジェクトに取り組んでいます。驚くべき例として、Tavis Ormandyによる「Sophail: A Critical Analysis of Sophos Antivirus」を読んでみてください。この分析は2011年にBlack Hat Las Vegasでも発表されました。このような巨大な分析は例外であり、一般的ではありません。
数百万行(あるいは数十万行、数万行)のコードを気にする代わりに、1000行以下の領域に集中しましょう。ここには世界のマルウェアの重要な部分が見つかります。防御者としての主な目標は、マルウェアが何をするか、それがどのように環境に現れるか、そしてそれにどう対処するかを判断することです。適切なサイズのサンプルとスキルを持っていれば、これらの質問に答え、企業のリスクを減らすことができます。
マルウェアの作者がサンプルを提供する準備ができているなら、この本の著者たちはスキルを提供する準備ができています。『Practical Malware Analysis』は、すべてのマルウェアアナリストが手元に置くべき本だと思います。初心者であれば、戦いに参加するために必要な入門的な実践的な資料を読むことができます。中級者であれば、次のレベルに進むための内容が見つかります。上級エンジニアであれば、さらに高みを目指すための貴重な情報が見つかり、メンターする際には「この優れたマニュアルを読んで」と言えるでしょう。
『Practical Malware Analysis』は実際には二冊の本が一つになっています。まず、現代のマルウェアを分析する方法を読者に示すテキストです。この理由だけで本を購入しても大いに役立ちます。しかし、著者たちはさらに一歩進んで実質的に第二の本を書きました。この追加の本は「Applied Malware Analysis」と呼ばれるべきもので、各章の終わりと付録Cに掲載された演習、短い回答、詳細な調査が含まれています。また、著者たちは例として使用するすべてのマルウェアを自ら作成しており、学習のための豊かで安全な環境を提供しています。
デジタル防御者が直面する一見不利な状況に絶望する代わりに、現在のマルウェアの形に感謝しましょう。『Practical Malware Analysis』のような本を手にすれば、企業やクライアントの侵入をより良く検知し対応するための優位性を持つことができます。著者たちはこの分野の専門家であり、前線から抽出されたアドバイスが提供されています。理論的な研究室で考え出されたものではありません。この本を楽しんで読み、リバースエンジニアリングして詳細に調べたマルウェアの一つ一つが、相手の暗黒技術を知識の光にさらすことで相手のコストを上げることを知ってください。
リチャード・ベイトリッチ(@taosecurity)
Mandiantの最高セキュリティ責任者およびTaoSecurityの創設者
バージニア州マナサスパーク
2012年1月2日
3. http://dl.packetstormsecurity.net/papers/virus/Sophail.pdf
リンジー・ラック、ニック・ハーバー、ジェロルド “ジェイ” スミスには、それぞれの専門分野での章の執筆に貢献していただきましたことを感謝いたします。
また、技術レビュアーのスティーブン・ローラーには、50以上のラボとすべての章を単独でレビューしていただき、感謝の意を表します。セス・サマーセット、ウィリアム・バレンシン、スティーブン・デイビスには、この本のためにコードを提供していただき、ありがとうございます。
特別な感謝を、No Starch Pressの皆さんに捧げます。アリソン、ビル、トラビス、タイラー、そしてNo Starch Pressの他の皆さんと共に仕事ができたことを嬉しく思います。
Mike:この本をレベッカに捧げます。こんなにも支えてくれて愛してくれる人がいるおかげで、この本を完成させることができました。
Andy:最高の家族でいてくれるモリー、クレア、そしてエロイーズに感謝します。
電話が鳴り、ネットワークチームからあなたがハッキングされ、顧客の機密情報がネットワークから盗まれていると告げられます。あなたは調査を開始し、関与しているホストを特定するためにログを確認します。ホストをウイルス対策ソフトでスキャンし、幸運にもTROJ.snapAKというトロイの木馬が検出されます。ファイルを削除してクリーンアップを試み、ネットワークキャプチャを使用して他のマシンが感染していないことを確認するための侵入検知システム(IDS)のシグネチャを作成します。その後、攻撃者が侵入に使用したと考えられる穴を修正し、再発を防止します。
しかし、数日後にネットワークチームが再び現れ、機密データが再びネットワークから盗まれていると告げられます。これは同じ攻撃のように見えますが、どうすれば良いのか分かりません。明らかに、IDSシグネチャは失敗し、さらに多くのマシンが感染しており、ウイルス対策ソフトも脅威を隔離するための十分な保護を提供していません。上層部は何が起こったのか説明を求めており、あなたが答えられるのはマルウェアがTROJ.snapAKだったということだけです。最も重要な質問に答えられず、ちょっと情けない状態です。
正確にTROJ.snapAKが何をするのかをどのように特定し、その脅威を排除するのでしょうか? より効果的なネットワークシグネチャをどのように作成しますか? 他のマシンがこのマルウェアに感染しているかどうかをどのように確認しますか? マルウェアパッケージ全体を削除したことをどうやって確認しますか? マルウェアが何をするのかについて管理者の質問にどう答えますか?
自分のネットワークを保護できないため、高額な外部コンサルタントを雇う必要があると上司に伝えるしかありません。それは仕事を守るための最良の方法ではありません。
しかし、幸いなことに、あなたは『実践マルウェア分析』のコピーを手に入れる賢明さを持っていました。この本で学ぶスキルは、これらの難しい質問に答える方法を教え、ネットワークをマルウェアから守る方法を示してくれます。
悪意のあるソフトウェア、つまりマルウェアは、多くのコンピュータ侵入やセキュリティインシデントに関与しています。ユーザー、コンピュータ、またはネットワークに害を与える行為をするソフトウェアはすべてマルウェアと見なされます。これには、ウイルス、トロイの木馬、ワーム、ルートキット、スケアウェア、スパイウェアなどが含まれます。これらの様々なマルウェアは、それぞれ異なることを行いますが(本書を通じて詳しく説明します)、マルウェア分析者として、私たちはマルウェアを分析するための基本的なツールや技術を持っています。
マルウェア分析とは、マルウェアを分解してその動作、識別方法、対策や排除方法を理解する技術です。マルウェア分析を行うために超一流のハッカーである必要はありません。
世の中には何百万もの悪意のあるプログラムが存在し、毎日新しいものが発見されています。そのため、コンピュータセキュリティインシデントに対応する人々にとってマルウェア分析は非常に重要です。また、マルウェア分析の専門家が不足しているため、熟練したマルウェア分析者の需要は非常に高いです。
ただし、本書はマルウェアの発見方法についてのものではありません。私たちの焦点は、一度発見されたマルウェアの分析方法にあります。私たちは、今日最も一般的に使用されているオペレーティングシステムであるWindows上で見つかったマルウェアに焦点を当てていますが、ここで学ぶスキルは、他のオペレーティングシステムのマルウェアを分析する際にも役立ちます。また、最も一般的であり、かつ遭遇するのが最も困難なファイルである実行可能ファイルに焦点を当てています。同時に、悪意のあるスクリプトやJavaプログラムの議論は避けています。その代わりに、バックドア、隠れたマルウェア、ルートキットなどの高度な脅威を解剖するための方法に深く踏み込んでいます。
どのような背景やマルウェア分析の経験があるかに関わらず、この本には有益な情報が見つかるでしょう。
第1章から第3章では、セキュリティやプログラミングの経験がない人でも使用できる基本的なマルウェア分析技術について説明しています。第4章から第14章では、中級者向けの内容を扱っており、ほとんどの悪意あるプログラムを分析するために必要な主要なツールやスキルを身につけることができます。これらの章は、ある程度のプログラミングの知識を必要とします。第15章から第19章では、より高度な内容が取り扱われており、アンチ逆アセンブルやアンチデバッグ、パッキング技術を利用した非常に高度な悪意あるプログラムを分析するための戦略や技術が説明されています。これらは熟練したマルウェア分析者にとっても有用です。
この本では、様々なマルウェア分析技術をどのように、そしていつ使用するかを教えます。特定の技術を使用するタイミングを理解することは、その技術自体を知っていることと同じくらい重要です。なぜなら、間違った状況で間違った技術を使用すると、時間を無駄にするだけでなく、フラストレーションを引き起こす可能性があるからです。すべてのツールをカバーするわけではありません。ツールは常に変化するため、重要なのはコアスキルだからです。また、本書では現実的なマルウェアのサンプルを使用しており、これらは以下のウェブサイトからダウンロードできます(http://www.practicalmalwareanalysis.com/ または http://www.nostarch.com/malware.htm)。これにより、実際のマルウェアを分析する際に遭遇するであろう種類のものに触れることができます。
私たちは、プロフェッショナルなリバースエンジニアリングおよびマルウェア解析のクラスを教える豊富な経験から、生徒が学んでいるスキルを実践できるときに最も効果的に学習できることを学びました。講義の質が重要であるのと同様に、ラボの質も重要であり、ラボがなければマルウェアの解析を学ぶことはほぼ不可能です。
そのため、ほとんどの章の終わりには、その章で学んだスキルを実践するためのラボ演習を設けています。これらのラボは、現実世界のマルウェアで最も一般的な行動を示すように設計されたリアルなマルウェアで挑戦させます。ラボは、章で教えた概念を強化しつつ、関連のない情報で圧倒されないように設計されています。各ラボには、1つ以上のマルウェアファイル(http://www.practicalmalwareanalysis.com/ または http://www.nostarch.com/malware.htm からダウンロード可能)、ラボを進めるためのガイドとなる質問、質問への短い回答、マルウェアの詳細な解析が含まれています。
ラボは、現実的なマルウェア解析のシナリオをシミュレートすることを目的としています。そのため、マルウェアの機能に関する洞察を提供しない一般的なファイル名を使用しています。実際のマルウェアと同様に、何の情報もない状態から始め、学んだスキルを使って手がかりを集め、マルウェアの動作を解明する必要があります。
各ラボに要する時間は、あなたの経験に依存します。自分でラボを完了しようとするか、詳細な解析に沿って実践でさまざまな技術がどのように使用されているかを見ることができます。
ほとんどの章には3つのラボがあります。最初のラボは一般的に最も簡単で、ほとんどの読者が完了できるでしょう。2番目のラボは中程度の難易度で、ほとんどの読者は解答からの助けを必要とします。3番目のラボは難易度が高く、最も熟練した読者のみが解答の助けなしに完了できるでしょう。
『Practical Malware Analysis』は、比較的単純な悪意のあるプログラムから情報を得るための簡単な方法から始まり、最も高度な悪意のあるプログラムに対処するためのより複雑な技術へと進んでいきます。各章の内容は次の通りです:
マルウェアの分析方法について詳しく説明する前に、いくつかの用語の定義、一般的なマルウェアの種類、マルウェア分析の基本的なアプローチを紹介する必要があります。ウイルス、トロイの木馬、ワーム、ルートキット、スケアウェア、スパイウェアなど、ユーザー、コンピュータ、またはネットワークに害を及ぼすソフトウェアはすべてマルウェアと見なすことができます。マルウェアはさまざまな形態で現れますが、マルウェアを分析するための一般的な技術が使用されます。どの技術を使用するかは、目的に応じて選択されます。
マルウェア分析の目的は通常、ネットワーク侵入に対応するための情報を提供することです。典型的な目標は、正確に何が起こったのかを特定し、感染したすべてのマシンとファイルを見つけ出すことです。疑わしいマルウェアを分析する際の目標は、特定の疑わしいバイナリが何を行うことができるのか、ネットワーク上でどのように検出するのか、そしてその被害をどのように測定および抑制するのかを特定することです。
多くの場合、マルウェア分析を行う際には、マルウェアの実行ファイルだけが手元にあり、それは人間が読めるものではありません。それを理解するためには、様々なツールやトリックを使い、それぞれが少量の情報を明らかにします。全体像を把握するためには、様々なツールを使用する必要があります。
マルウェア分析には基本的に静的分析と動的分析の2つのアプローチがあります。静的分析はマルウェアを実行せずに調べる方法です。動的分析はマルウェアを実行して調べる方法です。これらの技術はさらに基本的なものと高度なものに分類されます。
基本的な静的分析は、実行ファイルの実際の命令を表示せずに調べることを指します。基本的な静的分析は、ファイルが悪意のあるものであるかどうかを確認し、その機能に関する情報を提供し、場合によっては単純なネットワークシグネチャを作成するための情報を提供することができます。基本的な静的分析は簡単で迅速に行えることが多いですが、高度なマルウェアには効果が低く、重要な動作を見逃すことがあります。
基本的な動的解析技術には、マルウェアを実行してその動作をシステム上で観察し、感染を除去したり、有効なシグネチャを生成したりすることが含まれます。ただし、マルウェアを安全に実行する前に、システムやネットワークに損害を与えずにマルウェアを調査できる環境を整える必要があります。基本的な静的解析技術と同様に、基本的な動的解析技術も深いプログラミング知識を持たない多くの人々が使用できますが、すべてのマルウェアに対して効果的ではなく、重要な機能を見逃す可能性があります。
高度な静的解析とは、実行ファイルを逆アセンブラにロードし、プログラムの命令を確認することで、そのプログラムが何をしているかを明らかにすることです。これらの命令はCPUによって実行されるため、高度な静的解析はプログラムが正確に何をしているのかを教えてくれます。しかし、高度な静的解析は基本的な静的解析に比べて学習曲線が急で、逆アセンブリ、コード構造、およびWindowsオペレーティングシステムの概念に関する専門知識を必要とします。これらの知識は本書で学ぶことができます。
高度な動的解析では、デバッガを使用して実行中の悪意のある実行ファイルの内部状態を調べます。高度な動的解析技術は、実行ファイルから詳細な情報を抽出するための別の方法を提供します。これらの技術は、他の方法では収集が困難な情報を取得しようとする際に特に有用です。本書では、高度な静的解析と組み合わせて高度な動的解析を使用する方法を示し、疑わしいマルウェアを完全に解析する方法を教えます。
マルウェア解析を行う際には、マルウェアが何をしようとしているのかについて推測し、それを確認することで解析を迅速に進めることができます。当然ながら、マルウェアが通常行うことを知っていれば、より良い推測ができます。そこで、ほとんどのマルウェアが分類されるカテゴリを以下に示します。
マルウェア解析の探求を静的解析から始めます。静的解析は通常、マルウェアの研究の最初のステップです。静的解析とは、プログラムのコードや構造を分析してその機能を特定するプロセスを指します。この段階では、プログラム自体は実行されません。これに対し、動的解析を行う際には実際にプログラムを実行します。動的解析については第3章で学びます。
この章では、実行ファイルから有用な情報を抽出するためのさまざまな方法について説明します。この章で取り上げる技術は以下の通りです。
DLL | Description |
---|---|
Kernel32.dll | これは、メモリ、ファイル、ハードウェアのアクセスと操作など、コア機能を含む非常に一般的なDLLです。 |
Advapi32.dll | このDLLは、サービスマネージャやレジストリなど、Windowsのコアコンポーネントへのアクセスを提供します。 |
User32.dll | このDLLには、ボタン、スクロールバーなどのすべてのユーザーインターフェイスコンポーネント、およびユーザーアクションに応答するためのコンポーネントが含まれています。 |
Gdi32.dll | このDLLには、グラフィックの表示と操作のための機能が含まれています。 |
Ntdll.dll | このDLLはWindowsカーネルへのインターフェースです。実行ファイルは通常、このファイルを直接インポートしませんが、Kernel32.dllによって間接的にインポートされることがよくあります。実行ファイルがこのファイルをインポートしている場合、それは通常のプログラムでは利用できない機能を使用することを意図しています。タスクの非表示やプロセスの操作などの一部のタスクは、このインターフェースを使用します。 |
WSock32.dll and Ws2_32.dll | これらはネットワーキングDLLです。これらのDLLのいずれかにアクセスするプログラムは、ネットワークに接続するか、ネットワーク関連のタスクを実行する可能性が高いです。 |
Wininet.dll | このDLLには、FTP、HTTP、およびNTPなどのプロトコルを実装する高レベルのネットワーキング機能が含まれています。 |
不慣れなWindows関数を評価する際に、いくつかの命名規則に注意すると役立ちます。これらの規則は頻繁に登場し、それを認識しないと混乱するかもしれません。例えば、CreateWindowExのように、関数名にExの接尾辞が付いていることがあります。Microsoftが関数を更新し、新しい関数が古いものと互換性がない場合でも、Microsoftは古い関数を引き続きサポートします。新しい関数には、古い関数と同じ名前が付けられ、Exの接尾辞が追加されます。関数が二度大幅に更新された場合、その名前にはExの接尾辞が二つ付きます。
パラメータとして文字列を取る多くの関数には、CreateDirectoryWのように、名前の最後にAまたはWが付いています。この文字は関数のドキュメントには現れず、単にその関数が文字列パラメータを受け取り、ASCII文字列用のバージョンとワイド文字列用のバージョンの二種類があることを示しています。Microsoftのドキュメントで関数を検索する際には、末尾のAまたはWを取り除くことを忘れないでください。