現場のエンジニア諸君、今日も泥臭い戦い、お疲れ様。
「コンテナは隔離されているから安全」なんて言葉、インシデント現場では一番の禁句だ。今日は、メモリフォレンジックの最前線で我々が直面している「名前空間(Namespace)の罠」について話そうと思う。
コンテナのメモリは「どこ」にあるのか?
メモリフォレンジックの基本は、OSの物理メモリをダンプし、そこからプロセス構造体(EPROCESS等)を辿ることだ。しかし、コンテナ環境では話が違う。コンテナはホストOSのカーネルを共有しており、プロセスは「名前空間」によって隔離されている。
攻撃者がコンテナ内でカーネルエクスプロイトを実行し、権限昇格やエスケープを図った場合、ホストOSから見ればそのプロセスは「単なる一つのプロセス」に過ぎない。しかし、メモリ解析ツール(Volatilityなど)をそのまま流すと、PID名前空間の分離により、解析対象のプロセスが正しくマッピングされず、構造体の整合性が取れないという事態に陥る。
なぜ解析が失敗するのか
コンテナ内では PID 1 がコンテナのメインプロセスだが、ホスト側では例えば PID 54321 になっている。メモリ構造体の中にある namespace フィールドを跨いで解析できないツールを使うと、攻撃者の痕跡を見失う。これがフォレンジックにおける「盲点」だ。
攻撃シナリオ:メモリ常駐型マルウェアの潜伏
攻撃者は、コンテナのメモリ空間内で memfd_create を使い、ファイルシステムに痕跡を残さず実行する「ファイルレス・マルウェア」を好む。
# PoC概念:攻撃者はmemfd_createでファイルレス実行を試みる
import os
import ctypes
# 匿名メモリファイルを作成
fd = os.memfd_create("hidden_payload", 0)
# ここにシェルコードを書き込み、execveatで実行させる
# この時、ディスク上には何も残らないため、従来のログ監視はすり抜ける
このような攻撃を防ぐには、コンテナのランタイム制限と、メモリの「汚染」を検知する仕組みが不可欠だ。
防御のための実装:不変(Immutable)なコンテナ設計
攻撃を「検知」するだけでなく、「そもそもメモリ上に悪意あるコードを展開させない」という設計思想に切り替える必要がある。
1. セキュアなコンテナ設定(Runtime Security)
コンテナが memfd_create や ptrace を使用する権限を剥奪する。seccomp プロファイルを適用し、コンテナの特権を最小化せよ。
seccomp.json の設定例
{
"defaultAction": "SCMP_ACT_ERRNO",
"syscalls": [
{
"names": ["read", "write", "exit", "futex"],
"action": "SCMP_ACT_ALLOW"
}
// memfd_createをリストに入れないことで、メモリ上の実行を拒否する
]
}
2. アプリケーション層でのメモリ保護(PHPの例)
Webアプリ経由でメモリ操作を許さないために、php.ini で危険な関数の実行を制限することは必須だ。
; php.ini
; 攻撃者がバックドアを仕込む際に使われる関数を無効化する
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_multi_exec,parse_ini_file,show_source
実践:メモリフォレンジックの現場テクニック
もし侵害が発生し、フォレンジックを行うことになったら、まずはホストOSからコンテナの「名前空間オフセット」を特定する必要がある。
1. ホスト側でコンテナのプロセスIDを特定する
docker inspect で State.Pid を確認せよ。
2. Volatilityで解析する際のアドバイス
コンテナのメモリ解析には、単純な linux_pslist ではなく、名前空間を考慮した linux_find_file や、linux_check_creds を使用して、プロセスがどの nsproxy を参照しているかを追跡することだ。
後輩たちへの教訓
「ツールがエラーを吐くから解析できない」は、エンジニアの言い訳だ。カーネルの構造、名前空間の分離メカニズム、そしてシステムコールがどうメモリに影響を与えるかを知っていれば、ツールが吐き出す生データからでも攻撃者の足跡は追える。
コンテナはブラックボックスではない。君たちが管理する「メモリ」という名の戦場だ。OSのカーネルがどう動いているのか、その裏側にあるロジックを常に意識してほしい。
何かあれば、またいつでも聞きに来い。現場で会おう。
コメント