
物理メモリ取得のためのLinuxカーネルドライバ。予約メモリやメモリホールを含む任意の物理アドレスへの読み取りアクセスを可能にし、CR3情報と仮想アドレスから物理アドレスへの変換サービスを提供します。

Windows版のWinpmemと同様に、これは従来のメモリダンパではありません。Linpmemは、任意の物理アドレス(予約メモリやメモリホールを含む)から読み取るためのAPIを提供しますが、通常のメモリダンプにも使用できます。さらに、ドライバは物理メモリを読み取るためのさまざまなアクセスモード(バイト、ワード、ダブルワード、クワッドワード、バッファアクセスモード)を提供します。通常の標準的なケースでは、バッファアクセスモードが適切です。整列されたバイト/ワード/ダブルワード/クワッドワードの読み取りが必要な場合、Linpmemはそれを正確に行います。
現在のLinpmemの機能:
キャッシュ制御は、特殊な読み取りアクセスモードをサポートするために将来追加予定です。
少なくとも現時点では、Linpmemドライバは自分でコンパイルする必要があります。他のLinuxシステムでプリコンパイルされたLinpmemドライバをロードする方法は現在作業中ですが、まだ完了していません。とはいえ、Linpmemドライバのコンパイルは難しくなく、基本的には'make'を実行するだけです。
makeとCコンパイラが必要です。(gccを推奨しますが、clangでも動作するはずです。)
linux-headersがインストールされていることを確認してください(ターゲットのLinuxディストリビューションのパッケージマネージャーを使用)。パッケージ名はディストリビューションによって異なる場合があります。
インストールされているかどうかを確認する簡単な(ディストリビューションに依存しない)方法:
ls -l /usr/lib/modules/`uname -r`/
これで完了です。ステップ2に進めます。
外部システム: 現在、別のシステム用にドライバをコンパイルしたい場合(例えば、ターゲット上でコンパイルできないがメモリダンプを作成したい場合など)、そのシステムのLinuxディストリビューションのパッケージリポジトリから直接ヘッダーパッケージをダウンロードする必要があります。パッケージのバージョンが、外部システムで実行されているリリースおよびカーネルバージョンと完全に一致することを確認してください。外部システムが自己コンパイルされたカーネルを使用している場合は、そのカーネルのビルドディレクトリのコピーを入手する必要があります。その後、いずれかのディレクトリの場所をKDIR環境変数に設定します。
export KDIR=path/to/extracted/header/package/or/kernel/root
ドライバのコンパイルは簡単です。次のように入力するだけです:
make
これにより、現在の作業ディレクトリにlinpmem.koが生成されます。
precompiler.hを事前に確認し、リリース用かデバッグ用か(例:デバッグ出力あり)を選択するとよいでしょう。現時点では他にあまりプリコンパイラ設定はありません。
insmod path-to-linpmem.koでモジュールをロードし、rmmod path-to-linpmem.koでアンロードできます。(これにより、この起動中のみドライバがロードされます。)デバッグ用にコンパイルした場合は、dmesgも確認してください。
ロード後、ドライバと通信するにはデバイスを作成する必要があります:
mknod /dev/linpmem c 42 0
ドライバと通信できない場合は、dmesgログで'42'が実際に登録されたメジャー番号かどうかを確認します:
[12827.900168] linpmem: registered chrdev with major 42
通常、カーネルはこの番号を実際に割り当てようとします。
chownを使用してデバイスをユーザーに与えることもできます。これにより、常にrootコンソールを開いておく必要がなくなります。(または、rootコンソールで使い続けても構いません。)
ドライバとの対話方法を(詳細に)示し説明するサンプルコードがあります。ユーザー空間APIのリファレンスは./userspace_interface/linpmem_shared.hにもあります。
このコードは、ライブラリを使用せずにドライバと直接対話する方法を理解したい場合に重要です。簡単な機能テストとしても使用できます。
Linpmem用の(オプションの)基本的なコマンドラインインターフェースツール、pmem CLIツールがあります。こちらから入手できます:https://github.com/vobst/linpmem-cli。ソースコードに加えて、プリコンパイルされたCLIツールとプリコンパイルされた静的ライブラリおよびヘッダーもこちらにあります(署名付き)。注意:これは予備バージョンです。多くの追加機能や拡張が近日中に行われる予定ですので、更新を確認してください。
pmem CLIツールは、Linpmemのさまざまな機能を(比較的)安全かつ便利な方法でテストするために使用できます。Linpmemは、insmod/rmmodの代わりにこのツールでロードすることもでき、将来は追加オプションも提供されます。これにより、pmemがすぐに使用できる適切なデバイスを自動的に作成するという利点もあります。非常にポータブルで、どのLinuxシステムでも動作します(実際、Linux 2.6でもテスト済みです)。
$ ./pmem -h
Command-line client for the linpmem driver
Usage: pmem [OPTIONS] [COMMAND]
Commands:
insmod Load the linpmem driver
help Print this message or the help of the given subcommand(s)
Options:
-a, --address <ADDRESS> Address for physical read operations
-v, --virt-address <VIRT_ADDRESS> Translate address in target process' address space (default: current process)
-s, --size <SIZE> Size of buffer read operations
-m, --mode <MODE> Access mode for read operations [possible values: byte, word, dword, qword, buffer]
-p, --pid <PID> Target process for cr3 info and virtual-to-physical translations
--cr3 Query cr3 value of target process (default: current process)
--verbose Display debug output
-h, --help Print help (see more with '--help')
-V, --version Print version
CLIツールを自分でコンパイルしたい場合は、そのディレクトリに移動し、(CLIの)Readmeの指示に従ってビルドしてください。それ以外の場合は、プリビルドされたプログラムをダウンロードするだけで、任意のLinuxで動作するはずです。CLIツールでカーネルドライバをロードするには:
# pmem insmod path/to/linpmem.ko
pmemツールを使用してドライバをロードする利点は、自分でデバイスファイルを作成する必要がなく、次回のリリースではlinpmemデバイスの所有者を選択できるようになることです。
pmemコマンドラインインターフェースは、ドライバとインターフェースするためのAPIを公開する小さなRustライブラリの薄いラッパーにすぎません。より上級のユーザーはこのライブラリを使用することもできます。このライブラリは、https://github.com/vobst/linpmem-cliからコンパイルする際に、pmem CLIツールと共に自動的にコンパイルされます(静的ポータブルライブラリとして)が、こちらにもプリコンパイル版が含まれています(署名付き)。注意:これは予備バージョンです。近日中にさらに追加される予定です。
ユーザーモードライブラリを使用せず、独自にドライバと直接インターフェースしたい場合は、./userspace_interface/linpmem_shared.hにユーザー空間API/インターフェースとドキュメントがあります。また、demo/test.cにドライバを直接使用する方法を説明するサンプルコードも提供しています。
LinPyMem:Linpmemドライバ用のPythonラッパー。PyPIから入手可能。
まだ実装されていません。
システムがモジュールのロード時に次のエラーメッセージを報告する場合、セキュアブートが原因である可能性があります:
$ sudo insmod linpmem.ko
insmod: ERROR: could not insert module linpmem.ko: Operation not permitted
モジュールをロードする方法はいくつかあります。明白な方法は、UEFI設定でセキュアブートを無効にすることです。
ディストリビューションがサポートしている場合、よりエレガントな解決方法は、使用前にモジュールに署名することです。 これは以下の手順で行えます(Ubuntu 20.04でテスト済み)。
$ sudo apt install mokutil
$ openssl req -new -newkey rsa:4096 -keyout mok-signing.key -out mok-signing.crt -outform DER -days 365 -nodes -subj "/CN=Some descriptive name/"
$ sudo mokutil --import mok-signing.crt
$ /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 path/to/mok-singing/MOK.key path/to//MOK.cert path/to/linpmem.ko
その後、モジュールをロードできるようになります。
フォレンジック準備の観点からは、必要になる前に署名付きモジュールを準備しておくことをお勧めします。上記の手順中にシステムが2回再起動し、メモリ内の揮発性データのほとんどが失われるためです。
(問題が発生した場合は、報告してください。)
LinpmemおよびWinpmemは、私たちの先駆者である(現在は廃止された)REKALLプロジェクトの作業なしには存在しませんでした:https://github.com/google/rekall。
私たちのオープンソース貢献者: