
Volatility 3 を Rust に移植。同じ出力で、はるかに高速。
Volatility 3メモリフォレンジックフレームワークのPythonからRustへの移植版です。同じメモリイメージを読み取り、同じオプションで同じプラグインを実行し、同じ出力をバイト単位で、はるかに高速に出力します。
このプロジェクトはVolatility 3の移植版であり、Volatility Software License 1.0に基づく「Addition」として、同じライセンスの下で公開されています。全文はLICENSEおよびhttps://www.volatilityfoundation.org/license/vsl-v1.0 にあります。各ソースファイルには、その由来を記録した通知が保持されています。
このプロジェクトはVolatility Foundationとは提携しておらず、その承認も受けていません。Volatilityという名称は、これが何の移植版であるかを示すためにのみ使用されています。
Rust 1.85以降が必要です。その後:
cargo build --release
バイナリはtarget/release/vol-rsに生成されます。オプションの依存関係は不要です。シンボル解凍、RC4、DES、AES、YARAマッチング、x86逆アセンブリ、PNG書き込み、tarアーカイブはすべて組み込まれており、Python版がpycryptodomex、yara-python、capstone、pillowに依存している部分を置き換えています。
./target/release/vol-rs -f memory.raw windows.pslist.PsList
./target/release/vol-rs -f memory.lime linux.bash.Bash
./target/release/vol-rs -f memory.raw -r csv windows.netscan.NetScan
./target/release/vol-rs windows.malfind.Malfind --help
./target/release/vol-rs --list-plugins
Python版が受け付けるすべてのオプションは、同じ名前と同じデフォルト値でここでも使用できます。-o、-r、-s、-c、-e、--filters、--hide-columns、--save-config、--stackers、--single-swap-locationsを含みます。各プラグイン固有のオプションも同様に一致しており、ヘルプページに表示されています。全197個がPython版と文字単位で同一です。
シンボルパックは$XDG_DATA_HOME/vol-rs/symbols、またはその変数が設定されていない場合は~/.local/share/vol-rs/symbolsに配置します。別の場所にあるパックは--symbol-dirsまたはVOLRS_SYMBOL_PATH環境変数で指定します。WindowsシンボルはMicrosoftシンボルサーバーからオンデマンドで取得され、~/.cache/vol-rsにキャッシュされます。
両方のバージョンを同じキャプチャに対して実行し、ヘッダーフレーミングと末尾の改行を含めて差分を比較しました:
| チェック | 結果 |
|---|---|
| 引数なしのWindowsプラグイン | 100個中99個が同一 |
| 引数なしのLinuxプラグイン | 57個中56個が同一 |
| 引数を取る実行 | 43個中43個が同一 |
| 抽出プラグインが書き込んだファイル |
一致しなかった8ファイルは、以下の「既知の相違点」に記載されている2つのケースです。7つはPython版がダンプできないと報告した後にディスクに残す部分ファイルで、この移植版はこれを作成しません。残り1つはtarballで、内容は一致しますが、タイムスタンプが各実行時刻を記録しています。
これらの数から欠けている2つのプラグインは、Python版がテストマシンで完了できないものです。windows.memmap.Memmapは780万行後にOOMキラーによって強制終了され、linux.pscallstack.PsCallStackも終了前に強制終了されます。どちらの場合も、Python版が先に書き込んだすべての行が正確に再現されています。
引数なしで実行されるすべてのプラグインについて、Windowsスイープはここでは273秒(Pythonは5723秒)、Linuxスイープは68秒(Pythonは3130秒)です。
各キャプチャで、引数なしで実行されるすべてのプラグインのうち、差が最も大きい10個:
BENCHMARKS.mdに残りが記載されています: 両キャプチャの全プラグイン、引数を取る実行、および数値の測定に使用したマシンについて。
一致させることができないいくつかの点があり、それぞれ意図的なものです:
linux.pagecache.RecoverFsは、書き込むtarball内のすべてのファイルにプラグインの実行時刻をスタンプするため、2回の実行で一致しません。Pythonの実行同士でも一致しません。テーブルは一致し、展開後のツリーも一致します。--save-configとtimeliner --record-configは、イメージを説明するすべての設定を記録しますが、Python版がインポートしたコンポーネントが十分に新しいかどうかをチェックする部分は記録しません。この移植版には記録すべきそのようなチェックがないためです。linux.mountinfo --mount-formatはPythonのsetを結合するため、2回のPython実行間で列の順序が変わります。この移植版は、マウントオプションを最初に、ファイルシステムオプションをその後ろに、カーネルが保持する順序でリストします。frameworkinfoとisfinfoはイメージではなくツールを説明するため、この移植版自身のレイヤー、プラグイン、シンボルファイルを報告します。windows.dumpfilesは、Python版が読み取れないことを発見する前に作成する部分ファイルを残しません。テーブルは一致しますが、ディレクトリはそれらのファイルの分だけ異なります。--helpでキャッシュディレクトリを指定する行は、この移植版自身のキャッシュを指定します。以下はすべて移植済みでビルドも通りますが、実際の証拠に対してまだ実行されていません:
Volatility 3はVolatility Foundationとその貢献者による成果です。これは彼らの設計、プラグインセット、出力形式の移植版であり、その成果がオープンであるために存在しています。
| 1,747個を比較、両ツールが書き込んだすべてのファイルが一致 |
| プラグインのヘルプページ | 197個中197個が同一 |
| プラグイン | Rust | Python | 高速化 |
|---|
windows.malware.suspicious_threads.SuspiciousThreads | 0.47 s | 281.6 s | x599 |
windows.suspicious_threads.SuspiciousThreads | 0.50 s | 259.1 s | x518 |
windows.malware.hollowprocesses.HollowProcesses | 0.52 s | 257.9 s | x496 |
windows.suspended_threads.SuspendedThreads | 0.090 s | 42.0 s | x467 |
windows.malware.malfind.Malfind | 0.52 s | 236.5 s | x455 |
windows.hollowprocesses.HollowProcesses | 0.59 s | 263.0 s | x446 |
windows.debugregisters.DebugRegisters | 0.090 s | 37.0 s | x411 |
windows.malfind.Malfind | 0.65 s | 239.7 s | x369 |
windows.vadinfo.VadInfo | 0.99 s | 329.7 s | x333 |
windows.verinfo.VerInfo | 0.99 s | 150.7 s | x152 |
| プラグイン | Rust | Python | 高速化 |
|---|
linux.library_list.LibraryList | 1.99 s | 788.7 s | x396 |
linux.kallsyms.Kallsyms | 2.41 s | 161.6 s | x67 |
linux.netfilter.Netfilter | 0.89 s | 56.3 s | x63 |
linux.lsof.Lsof | 0.89 s | 55.6 s | x62 |
linux.sockstat.Sockstat | 1.60 s | 97.2 s | x61 |
linux.check_idt.Check_idt | 0.82 s | 49.7 s | x61 |
linux.malware.netfilter.Netfilter | 1.07 s | 62.0 s | x58 |
linux.pagecache.Files | 1.67 s | 93.4 s | x56 |
linux.kthreads.Kthreads | 0.87 s | 47.2 s | x54 |
linux.proc.Maps | 2.53 s | 135.4 s | x54 |