こんにちは!セキュリティの世界へようこそ。
普段は企業のネットワークを守るSOC(セキュリティオペレーションセンター)で、日々侵入してくる厄介なサイバー攻撃者と格闘しています。
「メモリフォレンジック」という言葉、聞いたことはありますか?なんだかSF映画に出てくるような、ちょっと難しそうな響きがしますよね。でも、安心してください。今回は、新人のIT担当者や開発者の方に向けて、このメモリフォレンジックの基本を身近な例えを交えながら、一歩ずつ優しく紐解いていきたいと思います。
難解な専門用語が出てきても、「こういうことね!」とスッと腑に落ちるように解説していきますので、ぜひ最後までリラックスして読んでいってくださいね。
—
1. メモリフォレンジックってなに?(家の鍵と泥棒に例えてみよう)
セキュリティ対策というと、ウイルス対策ソフトやファイアウォールといった「頑丈な玄関の鍵」を思い浮かべる方が多いと思います。もちろんそれらはとても大切です。
しかし、巧妙なサイバー攻撃者は、あの手この手でその鍵をこじ開けたり、巧妙に隠れて侵入してきたりします。もし、あなたの家(PC)の中にすでに泥棒が入り込んでいたら……?
ここで登場するのがメモリフォレンジックです。
メモリ(RAM)とは、パソコンが現在進行形で作業をしている「机の上」のような場所です。パソコンの電源を切ってしまうと、この机の上にあるものはすべて消えてしまいます。つまり、メモリフォレンジックとは、「犯人がまさに今、机の上で広げている悪巧みの証拠を、電源を切る前にそのまま写真に収めて捜査する技術」なのです。
ハードディスク(HDDやSSD)の調査が「タンスの引き出しをひっくり返して証拠を探すこと」だとすれば、メモリフォレンジックは「犯人が部屋にいる瞬間の足跡や動かしている証拠を掴むこと」と言えます。めちゃくちゃ臨場感がありますよね!
—
2. 解析の相棒「Volatility 3」の仕組みと準備
このメモリの調査(解析)で、世界中のセキュリティエンジニアが愛用しているのがVolatility 3(ボラティリティ・スリー)という強力なオープンソースのツールです。
昔のバージョン(Volatility 2)では、OSのバージョンごとに「シンボル(プロファイルのデータ)」を必死に探して合わせる必要があり、これが初心者泣かせの難所でした。しかし、最新のVolatility 3では、そのあたりが非常にスマートになり、現代のWindowsやLinuxの解析がグッとやりやすくなっています。
まずは、実務で使う基本的なセットアップの流れを見ていきましょう。Pythonの環境が整っていれば、インストールはあっという間です。
# 1. Pythonのパッケージ管理ツールを使ってVolatility 3をインストールします
pip install volatility3
# 2. インストールが成功したか、バージョンを確認してみましょう
python -m volatility3 -h
これだけで、あなたのパソコンは立派なフォレンジック・ラボに変身します!
—
3. 実践!メモリダンプから「怪しい影」を暴く基本フロー
それでは、実際に被害にあった(あるいは訓練用の)メモリのデータ(メモリダンプファイル、よく memdump.raw などと呼ばれます)を手に入れたと仮定して、標準的な解析の4ステップを一緒に進めていきましょう。
ステップ1:今、何が動いているか?(プロセスリストの確認)
まずは、メモリ上で動いていたプログラム(プロセス)の一覧をすべて洗い出します。これは、オフィスのフロアに「今、誰が残業しているか」を確認する名簿チェックのようなものです。
裏でこっそり動いているマルウェアは、大抵の場合、もっともらしい名前(例えば svchost.exe や explorer.exe など、Windowsの正規のシステム名)に化けています。
以下のコマンドを実行してみましょう。
# Windowsのメモリダンプからプロセスの一覧を表示するコマンド
python -m volatility3 -f memdump.raw windows.pslist
このコマンドを実行すると、たくさんのプロセスID(PID)や親プロセスID(PPID)がずらっと表示されます。ここで見るべきポイントは、「親が違うのに同じ名前のプロセスがあるぞ?」とか、「見慣れない怪しい名前の実行ファイルが動いているぞ?」という違和感です。
ステップ2:ネットワークの繋がりを見る(ネットスタット)
怪しいプログラムが見つかったら、次は「そいつが外の悪者とこっそり通信していないか」を確認します。泥棒が盗んだデータをどこかに送信している現場を押さえるわけです。
おなじみの netstat のような機能が、Volatilityにも用意されています。
# メモリ上からネットワークの接続状況(IPアドレスやポート)を抽出する
python -m volatility3 -f memdump.raw windows.netstat
「あれ?この見覚えのないプロセスが、見知らぬ海外のIPアドレスと繋がっている……!」といった決定的な証拠がここで見つかることがあります。インシデントレスポンスの現場で、この瞬間はなかなかにアドレナリンが出ます。
ステップ3:ロード済みモジュール(DLL)の確認
巧妙なマルウェアは、OSの正規のプログラムの隙間に自分を忍び込ませたり(インジェクション)、怪しい部品(DLLファイル)を読み込ませたりします。
「どのプログラムが、どの部品を読み込んでいるか」を暴くのが次のステップです。
# プロセスが読み込んでいるDLLなどのモジュール一覧を表示する
python -m volatility3 -f memdump.raw windows.dlllist --pid 1234
(※ --pid 1234 の部分は、ステップ1で怪しいと睨んだプロセスのPIDに書き換えてくださいね)
正規のアプリケーションが読み込むはずのない変なパスからDLLを読み込んでいたら、それはもう「黒」である確率がグッと跳ね上がります。
—
4. まとめ:一歩ずつ、確実に対応していこう
いかがでしたでしょうか?
「メモリフォレンジック」や「Volatility 3」という言葉を聞いたときは難しく感じたかもしれませんが、やっていることは「机の上の状態を写真(メモリダンプ)に撮り、名簿(pslist)や通信記録(netstat)と照らし合わせて不審者を見つける」という、非常に理にかなった捜査活動です。
セキュリティの現場では、いきなり完璧な判断を下すことは誰もできません。まずは今日ご紹介した基本のコマンドを実際に手を動かして試してみることから、小さな一歩を踏み出してみてください。
インシデントが起きたとき、慌てず冷静に「証拠を保全し、紐解く」ことができるエンジニアを目指して、一緒に少しずつ学んでいきましょう!それではまた次の記事でお会いしましょう。
コメント