こんにちは!日々のインフラ運用や開発、本当にお疲れ様です。
サーバールームやクラウドの管理画面を見ながら、「もし今、うちのサーバーがハッキングされたらどうしよう…」と冷や汗をかいた経験はありませんか?
サイバーセキュリティの世界では、サーバーが攻撃を受けたときに行う調査を「インシデントレスポンス」と呼びます。その中でも、一番スリリングで、一番生々しい証拠が残る場所……それが「メモリ(RAM)」の世界です。
今回は、新人のIT担当者や、「セキュリティって難しそうだな…」と感じている開発者の方に向けて、Linuxのメモリを採取・解析する技術について、身近な例えを交えながら一歩ずつ優しく解説していきますね!
—
1. そもそも「メモリフォレンジック」ってなに?(防犯カメラと記憶の例え)
突然ですが、あなたの自宅に泥棒が入ったと想像してみてください。
警察がやってきて最初に調べるのは何でしょうか? 指紋や足跡、そして部屋の様子ですよね。
これをデジタル世界(Linuxサーバー)に置き換えてみましょう。
サーバーの「ハードディスク(SSD)」は、いわば「家の中にしまってあるタンスや引き出し」です。ここに残るログやファイルは、時間が経っても消えにくい証拠(足跡)になります。
一方で、「メモリ(RAM)」はどうでしょう? メモリは、サーバーが「今、まさに動いていること」を処理するための超高速な作業机です。
電源を切ってしまうと、机の上にあった書類(=実行中のプログラムや、入力途中のパスワード、ネットワークの接続情報)はすべてシュレッダーにかけられたかのように綺麗に消えてなくなってしまいます。
つまり、メモリフォレンジックとは、「犯人がまさに悪さをしているその瞬間に、作業机の上をそっと写真に収めるようなもの」なんです。ハードディスクには残らない、メモリ上でしか活動しない「ファイルレスマルウェア」などの巧妙な痕跡を見つけるためには、このメモリの調査が不可欠なんですよ。
—
2. LiME(ライム)を使ったメモリダンプの基本と「現場の落とし穴」
では、実際にその「作業机の写真」をどうやって撮るのか?
Linuxの世界でよく使われるのが、LiME(Linux Memory Extractor)というツールです。
「よし、じゃあ早速インストールして動かしてみよう!」……と言いたいところですが、ここで現場のエンジニアが絶対に知っておかなければならない最大の注意点(落とし穴)があります。
⚠️ 注意:メモリ取得は「諸刃の剣」です
LiMEは「カーネルモジュール」という、Linuxの心臓部(OSの根っこ)に直接触れるプログラムとして動きます。
もし、調査しようとしているサーバーのOSのバージョンと、LiMEを動かすための「レシピ(コンパイル環境)」がほんの少しでもズレていると……どうなると思いますか?
そう、サーバーが突然「プツッ」とフリーズし、青い画面(Linuxの場合はパニック画面)になって、強制終了してしまうんです。これを「カーネルパニック」と呼びます。
証拠を集めるためにサーバーを止めてしまったら、本末転倒ですよね。
そのため、実務では以下の鉄則を守る必要があります。
- 本番環境でいきなりコンパイルしない: できれば同じ構成を用意した検証環境でビルド(準備)したものを使う。
- ライブレスポンスの限界を理解する: 証拠の改ざんリスクを最小限にするため、慎重に手順を進める。
—
実践:LiMEでメモリをダンプする手順
それでは、安全に配慮した上で、LiMEを使ってメモリをファイルとして吸い出す手順を見ていきましょう。
まずは、LiMEのソースコードをGitHub等から取得し、ビルドします(※ここでは手順のイメージを掴むためのサンプルコードです)。
# 1. 必要なビルドツール(コンパイラなど)をインストールします
sudo apt-get update
sudo apt-get install -y build-essential linux-headers-$(uname -r)
# 2. LiMEのソースコードをクローンします(公式リポジトリなどから)
git clone https://github.com/504ensicsLabs/LiME.git
cd LiME/src
# 3. カーネルモジュール(lime-$(uname -r).ko)をビルドします
make
ビルドが無事に完了すると、lime.koというファイル(これがメモリを抜き取るためのマジックアイテムです)が生成されます。
いよいよメモリをダンプ(ファイルに出力)します。
# 4. insmodコマンドを使って、モジュールをカーネルに組み込みます
# 「path」パラメータで、抜き取ったメモリをどこに保存するか、
# 「format」パラメータで、どの形式(raw形式など)で保存するかを指定します。
sudo insmod lime.ko "path=/tmp/memory_dump.lime format=raw"
# 5. ダンプが完了したら、速やかにモジュールをカーネルから取り除きます(安全第一!)
sudo rmmod lime
これで、/tmp/memory_dump.lime というファイルの中に、サーバーの脳内(メモリの全データ)が丸ごと保存されました!
このファイルは機密情報の塊ですので、外に漏れないよう厳重にUSBメモリ等へ退避させましょう。
—
3. Volatility(ボラティリティ)でカーネル構造体を読み解く
メモリの塊(ダンプファイル)を手に入れただけでは、ただの巨大なバイナリデータの羅列で、人間には何が書いているかさっぱり分かりません。
ここで登場するのが、メモリ解析の最強フレームワーク「Volatility(ボラティリティ)」です。
Volatilityを使うと、ごちゃ混ぜになったメモリの中から、「おっ、ここにネットワークの接続履歴があるぞ」「このプロセス怪しくないか?」と、OSの構造(カーネル構造体)を紐解いて綺麗に見せてくれます。
家の構造(カーネル構造体)に例えてみると……
Linuxのカーネルは、家全体の配管や柱の図面のようなものです。
「どの部屋(プロセス)に、誰が鍵を持っているか(権限)」という情報が、決まったルール(構造体)で整理されています。
攻撃者は、この図面をこっそり書き換えて、自分たちの不正なプログラムを「正当な家族のふり」をして住まわせようとします。
Volatilityは、その図面と照らし合わせて、「あれ? この部屋、図面には載っていない変な人間が住み着いているぞ!」と見つけ出すレントゲン写真のような役割を果たしてくれるのです。
—
Volatility 3を使った実践的な解析コマンド
それでは、先ほど取得したメモリダンプをVolatilityを使って解析してみましょう。最近は Python 3ベースの 「Volatility 3」 が主流になっています。
まずは、今どんなプロセス(動いているアプリ)がメモリ上に存在していたかをリストアップしてみます。
# メモリダンプファイルに対して、実行中のプロセス一覧を表示するプラグイン(pslist)を実行します
python3 vol.py -f /tmp/memory_dump.lime linux.pslist.PsList
実行すると、以下のようなイメージで結果が出力されます。
Offset Name PID PPID UID GID StartTime
------------------ ------------------ ------ ------ ------ ------ ----------
0xffff9a8001234000 systemd 1 0 0 0 202X-..
0xffff9a8005678000 sshd 1234 987 0 0 202X-..
0xffff9a8009abc000 nc.traditional 9999 1234 1000 1000 202X-..
おっと、ここで注目してください! nc.traditional という怪しいプロセス(Netcatという、通信によく使われるツール)が、PID 9999 で動いています。これがもし正当な業務に使われていなければ、攻撃者がバックドア(裏口)として仕掛けた証拠かもしれません。
さらに、この怪しいプロセスが「外部のどこへと通信しているか」を調べてみましょう。
# ネットワークの接続状況をリストアップするプラグイン(netstatなど、バージョンに応じたもの)を実行します
python3 vol.py -f /tmp/memory_dump.lime linux.netstat.NetStat
これにより、怪しいプロセスがどのIPアドレスの、どのポート番号と繋がっていたのかが手に取るように分かります。証拠固めには十分すぎますね!
—
4. まとめ:一歩ずつ、確実に対策を学んでいこう!
今回は、Linuxメモリフォレンジックの基本として、LiMEを用いたダンプ取得の注意点と、Volatilityによる解析の世界を覗いてみました。
「カーネルモジュール」「構造体」「ダンプ」など、最初は聞き慣れない言葉が多くて難しく感じたかもしれません。でも、焦る必要は全くありません。
セキュリティのスキルは、日々の少しずつ・確実な積み重ねで身につくものです。
まずは手元の検証環境で、LiMEをビルドしてみる、Volatilityを動かしてみるという小さな一歩から試してみてくださいね。
インシデントが起きたときに「自分にはメモリを回収して解析する引き出しがある!」という自信が、あなたのエンジニアライフを強力に守ってくれるはずです。
それでは、また次回のセキュリティ解説でお会いしましょう! 一歩ずつ、一緒に学んでいきましょうね。
コメント