こんにちは!日々、サイバー空間の最前線で「デジタル指紋」を追いかけているSOCアナリストです。
普段、私たちはパソコンやサーバーを使って仕事をしていますが、もしも「目に見えない泥棒」がシステムの中に潜んでいたら……と想像したことはありますか?しかも、その泥棒が「家の設計図(OSの基幹部分)」を書き換えて、自分の姿を透明にしていたとしたら、普通に玄関から入って点検しても見つけることはできません。
今回は、そんな高度な隠れんぼを仕掛けてくる「Linuxルートキット」を、メモリフォレンジックの王道ツールVolatility 3を使って暴き出す方法を解説します。
「メモリフォレンジック?」「カーネルモジュール?」と難しく感じるかもしれませんが、大丈夫です。家の鍵や防犯カメラの仕組みに例えながら、一歩ずつ一緒に学んでいきましょう!
—
1. メモリフォレンジックは「一瞬の証拠」を捉えるX線写真
まず、今回の主役である「メモリフォレンジック」についてお話しします。
コンピュータの「メモリ(RAM)」は、よく机の上に例えられます。ハードディスクが「本棚(保存場所)」なら、メモリは「今まさに開いて作業している書類」です。
泥棒(ウイルスや攻撃者)がシステムに侵入して活動しているとき、その足跡は必ずメモリの上に残ります。しかし、泥棒が賢い場合、自分の活動記録を消したり、OS(家の管理人)を騙して「自分はここにいないよ」と嘘をつかせたりします。
これを専門用語でカーネル空間の隠蔽と呼びます。
この「管理人の嘘」を見抜き、机の上の状況を丸ごと写真に撮って(メモリダンプ)、後からじっくりと「本当は何が起きていたのか」を解析するのが、Volatility 3を使った調査の手法です。
—
2. 調査の準備:家の設計図「ISFファイル」を手に入れる
Volatility 3でLinuxのメモリを解析する際、最初につまずきやすいのが「ISF(Intermediate Symbol Format)」というファイルの準備です。
これは例えるなら、「その家(OS)の正確な設計図」です。
Linuxは、バージョンによって部屋の間取り(データの配置)が微妙に異なります。設計図がないと、Volatility 3は「どこに秘密の隠し扉があるか」を正しく判断できません。
ISFファイルを生成する手順
通常、解析対象と同じバージョンのLinuxで、以下のツールを使って設計図を作成します。
# dwarf2jsonというツールを使って、カーネルの情報をJSON形式(設計図)に変換します
# 1. 必要なツールをインストール
go install github.com/volatilityfoundation/dwarf2json@latest
# 2. 解析対象のシステムから「vmlinux(カーネル本体)」と「System.map」を用意します
# これらは家の「構造指示書」のようなものです
./dwarf2json linux --system-map /boot/System.map-$(uname -r) /usr/lib/debug/boot/vmlinux-$(uname -r) > my_linux_blueprint.json
# 3. 出来上がったJSONファイルを、Volatility 3の所定のフォルダ(symbols/linux)に配置します
この「設計図(ISF)」さえあれば、Volatility 3は迷うことなく、メモリという迷宮の中を探索できるようになります。
—
3. 実践!隠されたプロセスをあぶり出す
泥棒(攻撃者)がよく使う手口に、「プロセス一覧から自分の名前を消す」というものがあります。
Windowsでいうタスクマネージャー、Linuxでいうpsコマンドに嘘をつかせるのです。
「公式名簿」と「実際の部屋」を突き合わせる
Volatility 3には、2つの強力なコマンドがあります。
1. linux.pslist: OSの管理人が持っている「公式の入居者リスト」を表示します。
2. linux.psscan: メモリの隅々まで直接ライトを当てて、「実際にそこにいる人」を探します。
もし、「psscanには出ているのに、pslistには載っていない人」がいたら……。それこそが、管理人を騙して潜伏している泥棒です!
# 1. まずは公式リスト(pslist)を確認
python3 vol.py -f memory_dump.raw linux.pslist
# 2. 次に、メモリをスキャンして実態(psscan)を確認
python3 vol.py -f memory_dump.raw linux.psscan
# この2つの結果を比較して、片方にしか存在しない怪しいPID(ID番号)を見つけ出します!
—
4. カーネルモジュール(LKM)の不正なフックを特定する
最も厄介なのは、「Linuxカーネルモジュール(LKM)」を悪用した攻撃です。
これは、家の管理人の「耳」や「目」そのものを改造して、特定の音を聞こえなくしたり、特定の人物を見えなくしたりする改造手術のようなものです。
これを「フック(Hooking)」と呼びますが、Volatility 3はこの改造の跡も見逃しません。
linux.check_modules で改造の跡を探す
通常、カーネルの重要な機能(ファイルを読み書きする、通信するなど)は、決まった手順で行われます。しかし、ルートキットが導入されると、その手順の途中で「泥棒のプログラム」へ寄り道するように書き換えられてしまいます。
# カーネルモジュールが不正に書き換えられていないかチェックします
python3 vol.py -f memory_dump.raw linux.check_modules
このコマンドを実行して、標準的な場所以外のメモリ領域を指し示している関数が見つかったら、それは「泥棒が仕掛けた罠(フック)」である可能性が非常に高いです。
—
5. まとめ:防犯の第一歩は「正常な状態」を知ること
いかがでしたでしょうか?
メモリフォレンジックは、一見すると黒い画面に文字が並ぶだけの地味な作業に見えますが、その実態は「泥棒との知恵比べ」です。
今回学んだポイントを整理しましょう:
1. メモリダンプは、システムのある瞬間の「証拠写真」。
2. ISF(設計図)がないと、解析ツールは正しく動けない。
3. pslistとpsscanの比較で、隠れている泥棒を見つけ出す。
4. フックの確認で、OSの中枢が改造されていないかを暴く。
セキュリティの現場では、100%の防御は難しいと言われています。だからこそ、「もし入られても、必ず見つけ出せる」という調査能力(レジリエンス)を磨くことが、あなたの大切なシステムを守る強力な武器になります。
まずは、自分の管理しているシステムの「設計図(ISF)」を試しに作ってみることから始めてみてはいかがでしょうか?
一歩ずつ、一緒にセキュリティの階段を登っていきましょう!
コメント