こんにちは!セキュリティの世界へようこそ。日々の開発やインフラの管理、本当にお疲れ様です。
いきなりですが、あなたのパソコンの中には、たくさんのアプリ(メモ帳やブラウザなど)が同時に動いていますよね。実は、現代のオペレーティングシステム(OS)は、お互いのアプリが勝手にお隣さんの部屋(メモリ領域)を覗き見たり、勝手に物を置いたりできないように、厳重な「鍵」をかけて管理しています。
しかし、悪意ある攻撃者は、この堅いセキュリティの壁をすり抜けようと日々あの手この手を考えています。今回は、その代表的な手口である「メモリインジェクション」と、その痕跡を見破るためのプロの技について、身近な例えを交えながら一歩ずつ優しく紐解いていきましょう!
—
1. 家の鍵と泥棒に例える「メモリインジェクション」の正体
まずは、私たちのパソコンの中身を「大きなマンション」に例えてみましょう。
マンションには各部屋(プロセス)があり、住人(プログラム)が暮らしています。通常、Aの部屋の住人が、鍵もかけずにBの部屋に勝手に入り込んで、Bの部屋の冷蔵庫から勝手に飲み物を取ったり、冷蔵庫の中に変なものを置いたりすることはできません。管理人が厳しく見張っているからです。
しかし、攻撃者はどうやってこのセキュリティを突破するのでしょうか?
DLLインジェクションとリフレクティブローディング
ここで登場するのが、今回テーマにする2つの不法侵入の手口です。
- DLLインジェクション(合鍵を使った侵入)
Windowsの正規の仕組み(VirtualAllocExやWriteProcessMemoryといったAPI)を悪用し、「お隣の部屋に荷物を届けてください」と管理人に嘘をついて、他のアプリのメモリ空間(部屋)に自分のプログラムの断片(DLL)を無理やり配置する手法です。
- リフレクティブローディング(合鍵すら使わない密造)
もっと厄介なのがこれです。通常のアプリのルール(ファイルとしてディスクに保存されてから読み込まれる)を無視し、メモリの空間上で自分自身を組み立ててこっそり実行する手法です。ディスクに痕跡を残さないため、普通のアンチウイルスソフトでは尻尾を掴みにくいのが特徴です。
こうした攻撃者は、まるでマンションの住民になりすまして合鍵を作り、夜な夜なこっそりお隣さんの部屋で悪だくみをする泥棒のようなものです。では、私たち警備員(セキュリティ担当者)は、どうやってこの泥棒の足跡を見つければいいのでしょうか?
—
2. 泥棒の足跡を見つける「VADツリー」の秘密
ここで、メモリフォレンジック(メモリの健康診断)の出番です。
Windowsは、各アプリがメモリのどこを使っているのかを管理するために、VAD(Virtual Address Descriptor:仮想アドレス記述子)と呼ばれる「全部屋のフロアマップ兼台帳」を持っています。この台帳には、以下のような重要な情報が書かれています。
- このエリアは、どのファイル(プログラム)から読み込まれたものか?
- このエリアは、読み取り専用か? それとも書き込みや実行もできるのか?
正常な状態と異常な状態の違い
通常のアプリであれば、綺麗に整理されたファイルから正しくメモリが割り当てられます。しかし、先ほどの泥棒(インジェクション攻撃)が侵入したメモリ空間のVADを覗いてみると、あちこちに不自然な「歪み」が生じます。
1. 「ファイル名がないのに、実行できる場所(Execute)」がある
通常、プログラムを実行するには、ハードディスク上の正当なファイル(.exeや.dll)と紐づいているはずです。しかし、VADの台帳を確認したときに、「ファイル名が空っぽ(Unbacked)なのに、コードが実行できる状態」になっているメモリ領域があれば、それはもう怪しさ大爆発です。「どこからともなく湧き出た謎のプログラムが動いている」証拠になります。
2. メモリの保護属性の不自然な変化
通常、データを書き込む場所と、プログラムを実行する場所は厳格に分けられています(安全のため)。これを「W^X(Write XOR Execute)」の原則と呼びます。「書ける場所では実行させない、実行できる場所には書かせない」という鉄則です。
しかし、インジェクション攻撃では、まずメモリに悪意あるデータを書き込み(Write)、そのあとで「ここを実行していいよ(Execute)」に変更するため、一時的にセキュリティの安全網が破られます。
—
3. 実務で役立つ! Volatilityを使ったメモリ解析の基本
「じゃあ、実際にどうやってそのVADの異常を見つけるの?」という疑問が湧きますよね。ここからは、現場のインシデントレスポンスでよく使われるメモリ解析フレームワーク Volatility を使った、実践的な手順を覗いてみましょう。
難しく考えず、「メモリの健康診断レントゲン写真を見るコマンド」だと思ってくださいね。
ステップ1: 怪しいプロセスのVADツリーをリスト化する
まずは、怪しい動きをしているプロセス(例えば、名前が不自然なものや、メモリを異常に食っているもの)のVAD情報を一覧で取得します。
# ターゲットとなるプロセスのPID(プロセスID: 例では1234)を指定してVAD情報を出力する
vol.py -f memory.raw --profile=Win10x64_19041vadinfo -p 1234
このコマンドを実行すると、ターミナルにバーっと大量のメモリ領域の情報が流れてきます。
ステップ2: 不審な「Unbacked(ファイル紐づけなし)」領域を探す
出力された結果の中から、次のような特徴を持つ行を注意深く探します。
# VAD出力結果のイメージ抜粋
Start 00007ffc40000000 - End 00007ffc40020000
Tag: VadS
File: None <-- ★ここが「None」や空欄になっている!
Protection: PAGE_EXECUTE_READWRITE <-- ★「書き込み」も「実行」もできてしまう危険な状態!
お疲れ様です!まさにここが、先ほどお話しした「どこからともなく湧き出た謎のプログラムが、書き換え可能な状態で存在している」ポイントです。DLLインジェクションやリフレクティブローディングがまさにこのエリアで行われた可能性が非常に高いと言えます。
—
4. 一歩ずつ対策を学んでいきましょう!
メモリインジェクションの痕跡を見つける手法、いかがでしたでしょうか?
最初は難しい専門用語や見慣れないコマンドに圧倒されるかもしれませんが、セキュリティの仕事は「普段の正しい状態(お部屋のルール)」をしっかりと知った上で、「あれ、ここだけ何かおかしいぞ?」という違和感(ノイズ)に気づく感性を磨いていくことの連続です。
もし実務や学習の中で不審なメモリ領域を見つけたら、まずは慌てずにそのプロセスのメモリ全体をダンプ(保存)し、安全な環境でさらなる詳細解析(マルウェアの逆アセンブルなど)へと繋げていきましょう。
焦らず、一歩ずつ。あなたの安全なインフラ・アプリ開発ライフを、これからも応援しています!
コメント