
LinuxおよびAndroidデバイスから揮発性メモリを取得するためのカーネルモジュールで、フォレンジック的に健全なキャプチャをディスクまたはネットワーク経由で生成します。
Linux および Android などの Linux ベースデバイスから揮発性メモリを取得するためのローダブルカーネルモジュール (LKM) です。LiME は、取得中にユーザー空間とカーネル空間のプロセス間の相互作用を最小限に抑えるため、Linux メモリ取得用に設計された他のツールよりもフォレンジック的に健全なメモリキャプチャを生成します。
LiME の使用方法と内部構造に関する詳細なドキュメントは、プロジェクトの "docs" ディレクトリにあります。
LiME は insmod コマンドを使用してモジュールをロードし、実行に必要な引数を渡します。
insmod ./lime-$(uname -r).ko "path=<outfile | tcp:<port>>
format=<raw|padded|lime>
[digest=<digest>]
[dio=<0|1>]
[compress=<0|1>]
[localhostonly=<0|1>]
[timeout=<ms>]"
path (必須):
outfile ~ ローカルシステムに書き込むファイル名
tcp:port ~ 通信を行うネットワークポート
format (必須):
padded ~ 物理アドレス 0 から始まるすべての非 System RAM 範囲を 0 で埋めます
lime ~ 各範囲の前にアドレス空間情報を含む固定サイズのヘッダーを付加します
raw ~ すべての System RAM 範囲を連結します
(警告: ダンプされたメモリの元の位置が失われる可能性が高く、
そのためほとんどのフォレンジックツールでの解析が不可能になります。
この形式は上級ユーザー以外には推奨されません)
digest (任意):
RAM をハッシュし、そのサムを含むサイドカーファイルを提供します。
サイドカーファイル名は出力パスにダイジェストアルゴリズムを
追加したものです (例: ram.lime.sha256)。
カーネルバージョン 2.6.11 以降をサポートします。利用可能な
ダイジェストオプションは以下を参照してください。
注: ダイジェストを有効にすると、取得中のコードの複雑さが増し、
追加のメモリを上書きします。整合性の検証が必要な場合にのみ使用してください。
compress (任意):
1 ~ 出力を zlib で圧縮します
0 ~ 圧縮しません (デフォルト)
カーネルで CONFIG_ZLIB_DEFLATE が有効な場合のみ利用可能です。
注: 圧縮を有効にすると、追加のカーネルメモリ (~24 KB) が割り当てられ、
取得中のコードの複雑さが増し、ターゲットシステムのメモリをより多く乱します。
速度またはサイズの利点が必要な場合にのみ使用してください。
dio (任意):
1 ~ Direct IO の有効化を試みます
0 ~ Direct IO を試みません (デフォルト)
localhostonly (任意):
1 ~ tcp を localhost のみでリッスンするように制限します
0 ~ すべてのインターフェースにバインドします (デフォルト)
timeout (任意):
1000 ~ ページの読み取り/書き込みに許容される最大ミリ秒数
(デフォルト、1 秒)。ページがタイムアウトを超えた場合、
そのメモリ範囲の残りはスキップされます。
0 ~ タイムアウトを無効にし、低速領域も取得します。
この機能はカーネル >= 2.6.35 でのみ利用可能です。
ファイルへのメモリ取得:
insmod ./lime-$(uname -r).ko "path=/tmp/ram.lime format=lime"
ネットワーク経由でのメモリ取得:
insmod ./lime-$(uname -r).ko "path=tcp:4444 format=lime"
次に、受信側のマシンで:
nc <target-ip> 4444 > ram.lime
adb を使用して LiME をロードし、ネットワーク経由でメモリを取得します:
adb push lime.ko /sdcard/lime.ko
adb forward tcp:4444 tcp:4444
adb shell
su
insmod /sdcard/lime.ko "path=tcp:4444 format=lime"
ホストマシンで、netcat を使用してメモリダンプをキャプチャします:
nc localhost 4444 > ram.lime
SD カードへの取得:
insmod /sdcard/lime.ko "path=/sdcard/ram.lime format=lime"
LiME は、カーネルの crypto ライブラリで利用可能な任意のダイジェストアルゴリズムをサポートします。TCP 経由でダンプするときにダイジェストファイルを収集するには、2 つの別々の接続が必要です。
nc localhost 4444 > ram.lime
nc localhost 4444 > ram.sha1
参考までに、サポートされているダイジェストのリストを以下に示します。
crc32c
md4, md5
sha1, sha224, sha256, sha384, sha512
wp512, wp384, wp256
rmd128, rmd160, rmd256, rmd320
sha3-224, sha3-256, sha3-384, sha3-512
圧縮により、メモリキャプチャの取得にかかる時間を大幅に短縮できます。最小限のメモリオーバーヘッド (~24 KB) で、非圧縮転送の 4 倍の速度向上を達成できます。
RAM ファイルは zlib 形式になります。これは gzip や zip 形式とは異なります。その理由は、カーネルに組み込まれている deflate ライブラリがそれらをサポートしていないためです。
解凍するには、pigz または zlib 互換のライブラリを使用できます。
nc localhost 4444 | unpigz > ram.lime
圧縮されるのは RAM ファイルのみであることに注意してください。ダイジェストファイルは圧縮されず、ハッシュ値は非圧縮データと一致します。
LiME は 2012 年の Shmoocon で Joe Sylve によって最初に発表されました。
Youtube~ Android Mind Reading: Memory Acquisition and Analysis with DMD and Volatility