メモリダンプについてのまとめ
このエントリで紹介したコマンドの一部は高確率でOSがクラッシュします.行う際は自己責任でお願いします.
マルウェア解析に使われるメモリダンプはどのように作成されるのかを調べたメモを書き残す.
結論として,Windowsはやり方が多い(設定をいじってからOSをクラッシュさせる,キーボードやスイッチから割り込みをかける,ツールを使う).Linuxはgrub(RHELのみ)の設定をいじる,ツールを使うことで取得できる.macについてはほとんど調べていないが,一部ツールは対応していた.いずれの方法でもOSがクラッシュした時と同等の影響がある.
注意点としてはメモリダンプツールとして公開されているプログラムの一部に現在は使えなさそうなものもあった.調べるだけでやる気が尽きたので,具体的な使い方までは網羅できていない.
疑問
近年のマルウェアは物理メモリにのみ存在し,電源が切れると一緒に本体も消えてしまうタイプがいる.高度なものになると,これに加えて自身をunlink
し,プロセス一覧から隠れる場合もあると聞いたことがある(専門ではないから,詳しくはわからない).
この場合,解析には感染したPCをネットワークから隔離した後すぐに電源を切らずに物理メモリの全内容をダンプする必要がある.
これについて,以下の点を疑問に思い,調べてみることにした.
- 一体どうやってダンプを取得するのか.
- OSがクラッシュした時にダンプ(Linuxではコアファイル)が作成されるが,普段仕事しているOSが動かないのに,誰がダンプを作成しているのか.
メモリダンプについて
種類
- 最小メモリダンプ
最重要な情報のみ保存(Stopメッセージ・パラメータ,停止したスレッドのカーネルモード呼び出しの履歴など).障害発生時に実行されていたスレッドが直接の原因でないエラーは発見できないことがある. - カーネルメモリダンプ
カーネルメモリのみの記録.ユーザプロセスの情報は記録しないため,カーネルで障害が起こっていない時は原因を究明できない. - 完全メモリダンプ
システムメモリの全内容を記録.メモリダンプを取るなら,これが推奨されている.当然ながら,メモリサイズ以上の大きさ(メモリサイズ+各種情報)になるため,ストレージの空きに注意.
今回は完全メモリダンプの取得に着目する.
フォーマット
メモリダンプのフォーマットは以下の通り.恐らく他にもあるが,ここでは解析ツールvolatility
でサポートしているものを挙げる.
- Raw linear sample (dd)
- Hibernation file (from Windows 7 and earlier)
- Crash dump file
- VirtualBox ELF64 core dump
- VMware saved state and snapshot files
- EWF format (E01)
- LiME (Linux Memory Extractor) format
- Mach-O file format
- QEMU virtual machine dumps
- Firewire
- HPAK (FDPro)
Windows
詳しいサイトが多数あるため,ここでは簡単に書く.詳しいことは参考サイトを確認すること.
どの方法でもブルースクリーンが発生するため,実験するときは重要なデータのセーブは必要.
Windows(7を想定)
- 基本的な方法
・OSクラッシュ時に作成されるようにする
・手動による作成
> NMIによる作成(キーボードなどが全く使えない時の最終手段)
> キーボードによる作成
詳しくは参考サイトを読むといいが,基本的な方法を簡単に書き残しておく.
1. スタートをクリック
2. 「コンピュータ」で右クリックし, 「プロパティ」を選択
3. 「システムのプロパティ」ウィンドウの詳細設定タブの一番下の「起動と回復」項目の「設定」をクリック
4. 「起動と回復」ウィンドウの「デバッグ情報の書き込み」でドロップダウンメニューから「完全メモリダンプ」を選択し,OKをクリック
5. 再起動
保存先は「デバッグ情報の書き込み」にある「ダンプファイル」で指定することができる.デフォルトは%SystemRoot%MEMORY.DMP
に保存される.
詳しくは
技術/Windows/メモリダンプ取得方法メモ - Glamenv-Septzen.net
https://blogs.technet.microsoft.com/askcorejp/2014/08/10/339/
を参照.
前者はXPなどにも使える方法が書いてあり,後者のMicrosoftサポートは2014年の記事であるから,Windows8.1(2013)まで有効だと思う.どちらも多くのやり方が書いてある.
最初にも述べたが,どちらにせよブルースクリーンになることは確定なので,データの保存は重要.
Linux
実装で/dev/mem
, /dev/kmem
から読みだしているプログラムはカーネルの2.6系まででしか動作が保証されていない.これ以降は/dev/(k)mem
でアクセスできるアドレスが制限されている.
2.6系という区切りで動作が保証されているのは,2003年に2.6から3.0へカーネルのメジャーバージョンアップがあったからのようだ.
「Security/Features - Ubuntu Wiki」には,Ubuntuの特色が書いてある.ここに/dev/mem protection
という項目がある.
現在のUbuntuでは/dev/(k)mem
からの完全メモリダンプ取得は望め無さそうだ.
この機構が適用されたのはBlackhat2009の発表(https://www.blackhat.com/presentations/bh-europe-09/Lineberry/BlackHat-Europe-2009-Lineberry-code-injection-via-dev-mem.pdf)にあるように,物理メモリにアクセスできるなら書き換えもできるよなってことのようだ.
/dev/(k)mem
を使っているツール群(ご利用は計画的に・・・)
実験した環境は4.5系だが,使うたびにOSがクラッシュした.こいつらの名前をきっと忘れない.
$ uname -r 4.5.0-1-ARCH
memdump
source: memdump 1.01-6, memdump_8c-source.html
$ sudo pacman -S memdump
でインストールできるやつ.
$ sudo memdump-kernel > test.dmp
でメモリダンプを作成できる.
ある程度ダンプできたところでクラッシュする.OSの実行しているコード部のコピーで競合かなんかが起きているのかな・・・
draugr
Google Code Archive - Long-term storage for Google Code Project Hosting.
pythonで実装されている.以上.
使えそうなやつ
/proc/kcore
から情報を取得するか,カーネルの機能を使うタイプが主流になっているようだ./proc/kcore
にはメモリ情報がELF形式で保存されている.64bitOSの場合,これのサイズが
$ ls -hl /proc/kcore -r-------- 1 root root 128T Apr 22 23:11 /proc/kcore
と非常に大きい.これは64bitで取り扱える最大サイズを指しているらしい.ここからどうやって取得するのかがまだもやっとしている.情報募集中.
以下のツール群は調べるだけでやる気が尽きて,実際に試していないから,各ドキュメントをよく読んで欲しい.
LiME(Linux Memory Extractor)
https://github.com/504ensicsLabs/LiME
volatility
で推奨されているメモリダンプ作成ツール.
Linuxのカーネルモジュールとして実装されている.
ネットワーク越しにダンプを作成することも可能なようだ.同じホスト上でダンプを作成するときはlocalhost
とするだけ.
Pmem
Rekall Memory Forensic Framework
ダンプ解析ツールrekall
が提供するメモリダンプツール.Linux, Windows, Macすべてで使えるできる凄腕.
モジュールとしてロードすることで使えるようだ.
Grub(RedHat系のみ)
grub.conf
に
crashkernel=auto
を書くと良いらしい.
kcore
, crach
, yum install kexec-tools
で検索.
その他
memfetch
[lcamtuf.coredump.cx]
/proc/<pid>/maps
から情報を取得している.メモリ全体というよりはプロセスごとのメモリを取得できる.
GDBなら,
$ gdb (gdb) attach <pid> (gdb) gcore <output>.dmp (gdb) detach (gdb) quit
で同じようなことができそう.gdbコマンドで得られるのはコアファイルでELF形式.
仮想マシン
Qemu, Xen,VMware,Virtualboxなど,仮想マシン上なら完全なメモリダンプを取得することができるから楽ってどっかに書いてあった.
メモリダンプ解析ツール
現在簡単に使えそうなツールは以下の通り.
volatility
The Volatility Foundation - Open Source Memory Forensics
Blackhat2007で発表されたツール.ダンプ解析で万能そう.
公式サイトには最もよく使われているツールと書いてある.本当かどうかは知らない.これを入れておけば困ることはなさそうだ.
メモリダンプ取得機能提供していないから,LiME
を使ってくれと公式のドキュメントに書いてある.しかし,ソースの中にgetkcore.c
とかいうプログラムがあったりする.これは/dev/kcore
から読み出す単純なプログラムなので,動きそう.提供しているじゃないかというツッコミは置いておく.
rakall
Rekall Memory Forensic Framework
前述のvolatility
から独立したプロジェクト.
これはメモリダンプ取得機能を提供している.Pmemはこいつが提供する機能の一つ.
特徴はメモリダンプに関することを全て行えること.
プラグインで機能拡張が容易に行える柔軟仕様だが,それ故プラグインが多すぎるのが悩みらしい.
当然ながら,ソースコードはvolatility
とかぶっている箇所が多い.
終わりに
様々なプログラムが乱立していて,混沌としていることがわかった.
ダンプを作成しているのは,カーネルっぽい.
メモリダンプ関係のプログラムを組むときにはカーネルについて調査すればもうちょい何か出てきそう.やる気が出たら実際にダンプを作成して,解析までやってみたい.Pmem
でダンプ取得して,volatility
で解析なんてひねくれるのも一興か.
/proc/kcore
の使い方や,実装のもっと深いところでの取得方法についてはまだ調べ尽くせていない.この疑問を解消する日が来るようやる気が出るまで忘れないようにしたい.
rekall
のtools/linux/lmap/log
やtools/osx/MacPmem/Common/logging.cpp
にはエラーレベルによるログの出力が実装されている.聞いたことはあったが,実際に見たのは初めてで感動した.今後の実装で使ってみたい.
参考サイト
/dev/kcoreが大きすぎる理由: /proc/kcore is 131072.0 GB / Newbie Corner / Arch Linux Forums
Linuxメモリダンプ作成: Linuxでのメモリダンプの取得 - higefoxの公開メモ
メモリダンプの種類,取得・圧縮: 完全メモリダンプを設定する方法
MSによるメモリダンプの作成手引:メモリ ダンプ ファイルを生成する方法について | Ask CORE
ダンプ取得ツール一覧: Top 8 Tools For Linux / Unix Memory Forensics Analysis