システムツールが攻撃者に「欺かれる」とき
午前2時、監視システムが赤色のアラートを発しました。重要なデータベースサーバーが突然、500Mbpsものアウトバウンドトラフィックを送信し始めたのです。top、ps -aux、netstatを使ってログインして確認しましたが、すべてが不自然なほどクリーンでした。CPUを消費しているプロセスもなく、不審なアクティブな接続も見当たりません。
詳細な調査の結果、問題がうっすらと見えてきました。サーバーがルートキット(Rootkit)に感染していたのです。マルウェアがカーネル(Kernel)の制御権を掌握すると、システムコマンドの実行結果を改ざんします。この時、ターミナルに表示されているものは、あらかじめ仕組まれた「演劇」に過ぎません。
潜伏する攻撃者を暴くには、Memory Forensics(メモリフォレンジック)が唯一の道です。RAMは嘘をつきません。すべてのプロセス、ネットワーク接続、実行コードの断片は、そこに痕跡を残します。そして、Volatility Frameworkこそが、それらの痕跡を精査するための最も強力な顕微鏡なのです。
3つのインシデント調査手法:どの武器を選ぶべきか?
サーバーへの侵入が疑われる場合、通常は3つのインシデント調査手法があります:
1. Live Analysis(ライブ解析)
サーバー上で直接 lsof や ps を使用します。この方法は迅速ですが、ルートキットがファイルやプロセスを隠蔽している可能性があるため、極めてリスクが高いです。これは泥棒本人に向かって「あなたは家の中にいますか?」と尋ねているようなものです。
2. Disk Forensics(ディスクフォレンジック)
この手法は、実行ファイルや削除された古いログを見つけるのに役立ちます。しかし、RAM上にのみ存在し、サーバーの再起動とともに消滅する「Fileless Malware(ファイルレスマルウェア)」に対しては、完全に無力です。
3. Memory Forensics(VolatilityによるRAM解析)
これはRAMの全データを取得してオフラインで解析する方法です。隠しプロセス、正規のプロセスに注入(inject)されたマルウェア、さらには暗号化キーまで特定できます。時間はかかりますが、巧妙な攻撃を暴くための唯一の方法です。
実践:Volatility 3によるマルウェアハンティングの手順
Volatility 3は、旧バージョンのように手動でプロファイルを作成する必要がないモダンなアーキテクチャを採用しており、現在の標準となっています。以下は、私が普段適用している実際のワークフローです。
ステップ1:AVMLによるメモリダンプの取得
感染しているサーバーにVolatilityをインストールしてはいけません。Microsoftの AVML を使用してRAMをキャプチャします。このツールは非常に軽量で、複雑なカーネルモジュールのビルドも不要です。
# ターゲットサーバーにAVMLを直接ダウンロード
wget https://github.com/microsoft/avml/releases/download/v0.13.0/avml
chmod +x avml
# RAMをファイルにダンプ(例:サーバーが16GBのRAMを搭載している場合、ダンプファイルも同等のサイズになります)
sudo ./avml memory.dmp
その後、SCPや外付けドライブを使用して、memory.dmp ファイルを専用の解析用マシンに転送します。
ステップ2:解析環境の構築
解析用マシン(LinuxまたはmacOS)で、Python 3を準備します:
git clone https://github.com/volatilityfoundation/volatility3.git
cd volatility3
pip3 install -r requirements.txt
ステップ3:隠しプロセスの摘発(プロセス解析)
linux.pslist コマンドは、カーネルのリストに従ってプロセスを列挙するだけです。ルートキットを見つけるには、linux.psscan を使用します。このプラグインはメモリ全体をスキャンしてプロセスの構造を探し出し、OSの管理リストから外されたものまで特定します。
# 隠しプロセスまたは終了したプロセスを検索
python3 vol.py -f memory.dmp linux.psscan
不審な兆候: kworker のようなシステム名に似ているが、親プロセスID(PPID)がシェルや無関係なプロセスを指しているものに注意してください。
ステップ4:潜在的なネットワーク接続の追跡
サーバー上の netstat に何も表示されない場合でも、Volatilityの netstat プラグインを使えば真実が見えてきます。
python3 vol.py -f memory.dmp linux.netstat
未知のIPや、4444、8080、1337などの「機密性の高い」ポートへの ESTABLISHED 接続に注目してください。nginx から海外の未知のIPへの接続があれば、それは重大なレッドフラグです。
ステップ5:メモリインジェクション手法の検出
多くのマルウェアは、単独のファイルとして実行されるのではなく、sshd のような信頼できるプロセスにコードを注入します。malfind プラグインは、RWX(Read-Write-Execute)権限を持つメモリ領域を探します。これはシェルコードの典型的な特徴です。
python3 vol.py -f memory.dmp linux.malfind
\xeb や \x31 という16進数で始まるコードが見つかった場合、それはほぼ間違いなく攻撃者からの命令を待っているシェルコードです。
シンボルテーブルに関する重要な注意点
Linuxの解析は、カーネルが頻繁に変更されるため、Windowsよりも困難です。Volatility 3が特定のカーネルバージョンのメモリ構造を理解するには、Symbol Table(JSON形式)が必要です。
ツールがダンプファイルを認識しない場合は、ターゲットサーバーで uname -r を実行してください。その後、各ディストリビューション(Ubuntu、CentOSなど)のリポジトリから対応する debug symbols パッケージを探してダウンロードし、Volatility用のシンボルセットを作成する必要があります。
デジタルフォレンジックは、特にシステム障害が発生しているときにはプレッシャーのかかる知恵比べとなります。しかし、Volatilityがあれば、もう推測に頼る必要はありません。どんなに巧妙な侵入行為であっても、最終的にはメモリフォレンジックの光の下でその姿を現すことになるのです。

