メモリの中は「宝の山」?泥棒が隠した痕跡を見つけるヒープ解析の秘密
こんにちは!インシデントレスポンスの現場で、日々「見えない敵」と追いかけっこをしているアナリストです。
さて、皆さんはパソコンの「メモリ」を何に例えますか?よく「机の上」に例えられますよね。作業するために必要な書類を広げている場所です。でも、もしその机の上に、「泥棒がこっそり隠した合鍵の設計図」がバラバラに置かれていたらどうでしょう?
今日は、そんな「メモリ上の散らかった断片」を拾い集めて、攻撃者の正体を暴く「ヒープ解析」という少しマニアックで、でも最高に面白い世界へご案内します。
—
1. 「ヒープ」って一体なに?——机の上の「一時保管ボックス」
プログラミングの世界で、プログラムが動いている最中に「あ、今これくらいのサイズが必要だな」と、その場しのぎで借りるメモリ領域を「ヒープ」と呼びます。
家で例えるなら、「急な来客のためにとりあえず荷物を詰め込んだクローゼット」のようなものです。整理整頓されていればいいのですが、攻撃者はここを悪用します。自分たちが動かすための「悪意あるコード(ペイロード)」を、このクローゼットの奥深くにバラバラに隠すんです。
2. なぜ攻撃者はヒープに隠すのか?
攻撃者がなぜわざわざヒープに隠すのか。それは、「ファイルとして保存すると、ウイルス対策ソフトに見つかってしまうから」です。
メモリの中は、PCを再起動すれば消えてしまう「儚い場所」です。だからこそ、攻撃者はここにデータを断片化して隠し、実行する直前にパズルのように組み立てます。僕たちフォレンジック担当者は、この「バラバラになったパズルのピース」を解析して、攻撃の全体像を復元するわけです。
—
3. 泥棒の痕跡を見つける「ヒープ解析」の基本
実際にメモリからデータを復元する際、僕たちがよく使うのは Volatility というツールです。これは「メモリのタイムマシン」のようなもので、過去のメモリ状態を切り取って解析できます。
ヒープ解析で一番大切なのは、「メタデータ」を探すことです。
データがメモリに確保されるとき、実はそのデータのすぐ近くに「このデータはどこから始まって、どれくらいのサイズがあるよ」という「タグ(ヘッダー)」が付いています。これこそが、泥棒が落とした「メモ書き」です。
実践:断片化されたデータを探すイメージ
例えば、C言語でメモリを確保する際のイメージはこんな感じです。
// メモリをヒープ領域から確保する例
void* secret_data = malloc(1024); // 1024バイトのクローゼットを確保
if (secret_data != NULL) {
// ここに攻撃者が悪意あるコードを隠す
// strcpy(secret_data, "悪意あるペイロードの断片...");
}
この malloc が呼ばれたとき、OSは「どこに確保したか」を管理するヘッダーを作ります。解析者は、このヘッダーを追跡することで、本来見えないはずの secret_data の中身を特定します。
—
4. 僕たちが現場で行っている「復元」の泥臭い手順
では、実際に怪しいプロセスを見つけたとき、どうやって解析を進めるか。基本的なステップは以下の通りです。
1. プロセスの特定: まずは vol.py windows.pslist で動いている怪しいプログラムを見つける。
2. ヒープの抽出: vol.py windows.memmap --pid <PID> --dump で、そのプログラムが使っているメモリ全体を書き出す。
3. パターンマッチング: 書き出したファイルの中から、攻撃者が使いそうな特定の文字列(例:http:// や powershell など)を strings コマンドで抽出する。
4. 構造の再構築: ヒープのヘッダー情報を読み解き、断片化されたデータを繋ぎ合わせる。
現場で役立つヒント:文字列検索のコマンド例
まずは、メモリダンプの中から怪しいキーワードを浮き上がらせるのが基本です。
# ヒープ領域のダンプから、怪しいコマンド文字列を探す
strings process_memory.dmp | grep -E "powershell|base64|http" > suspicious_hits.txt
# 抽出したキーワード周辺のバイナリをバイナリエディタで確認する
# ここから「どんなコードが実行されようとしていたか」を推測します
—
5. 最後に:防御側の心得
「ヒープ解析なんて難しそう…」と思いましたか?大丈夫です。最初から全てを理解する必要はありません。
大切なのは、「メモリは永遠ではないが、嘘をつかない」ということを知っておくことです。開発者の皆さんがコードを書くとき、malloc で確保したメモリを使い終わったら必ず free して綺麗に片付ける癖をつけるだけでも、実は攻撃者が情報を隠す「隙間」を減らす立派な防御になるんですよ。
インシデントは予期せぬ瞬間に起きますが、こうして「メモリの裏側」を知ることで、皆さんのPCやサーバーはぐっと強固になります。
また次回の記事では、さらに踏み込んだ「メモリ上の難読化されたコードの解読術」についてお話ししますね。一歩ずつ、一緒に学んでいきましょう!
コメント