拾い物のコンパス

まともに書いたメモ

メモリダンプについてのまとめ

このエントリで紹介したコマンドの一部は高確率で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