
Volatility 3 porté vers Rust. Même sortie, beaucoup plus rapide.
Un portage du framework de forensique mémoire Volatility 3 de Python vers Rust. Il lit les mêmes images mémoire, exécute les mêmes plugins avec les mêmes options et affiche la même sortie, octet pour octet, nettement plus rapidement.
Ce projet est un portage de Volatility 3 et constitue donc une « Addition » au sens de la Volatility Software License 1.0 ; il est par conséquent publié sous cette même licence. Le texte intégral se trouve dans LICENSE et en ligne à l'adresse https://www.volatilityfoundation.org/license/vsl-v1.0. Chaque fichier source conserve la mention indiquant de quoi il est dérivé.
Ce projet n'est ni affilié à la Volatility Foundation ni approuvé par elle. Le nom Volatility n'est utilisé que pour indiquer de quoi ce projet est le portage.
Rust 1.85 ou plus récent, puis :
cargo build --release
Le binaire se trouve à target/release/vol-rs. Rien d'optionnel n'est nécessaire. La décompression de symboles, RC4, DES, AES, la correspondance YARA, l'écriture PNG et les archives tar sont tous intégrés, là où la version Python fait appel à pycryptodomex, yara-python et pillow. Les instructions sont décodées par capstone 5.0.6, la même bibliothèque que la version Python utilise pour les mêmes colonnes, compilée plutôt qu'installée en parallèle.
./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
Toutes les options de la version Python sont également prises en charge ici, avec les mêmes noms et les mêmes valeurs par défaut, y compris -o, -r, -s, -c, -e, --filters, --hide-columns, --save-config, --stackers et --single-swap-locations. Les options propres à chaque plugin correspondent également, comme le montrent les pages d'aide : les 197 sont identiques à celles de la version Python, caractère pour caractère.
Les packs de symboles se placent dans $XDG_DATA_HOME/vol-rs/symbols, ou dans ~/.local/share/vol-rs/symbols lorsque cette variable n'est pas définie. Un pack situé ailleurs est indiqué avec --symbol-dirs ou via la variable d'environnement VOLRS_SYMBOL_PATH. Un noyau Windows qu'aucun pack ne décrit est recherché sur le serveur de symboles Microsoft, et la base de données trouvée est convertie en fichier de symboles et conservée, de sorte que la récupération n'a lieu qu'une fois. La base de données elle-même est mise en cache sous ~/.cache/vol-rs et le fichier de symboles est écrit à côté des packs.
Les deux versions ont été exécutées sur les mêmes captures et comparées, y compris l'encadrement des en-têtes et les sauts de ligne finaux :
| Capture | Plugins exécutés | Identiques |
|---|---|---|
| Windows 11 24H2, build 26100, vidage mémoire de 4,3 Go | 113 | 105 |
| Ubuntu 22.04, noyau 6.5.0-41, instantané VMware de 4,3 Go | 69 | 61 |
| Windows 10 19041, vidage mémoire de 2,0 Go | 114 | 112 |
| Windows XP, capture brute de 512 Mo | 114 | 113 |
| Linux 3.2, capture brute de 512 Mo | 60 | 60 |
Les huit plugins qui prennent un motif ou une règle en ont reçu un, identique des deux côtés, plutôt que d'être omis. Trois des différences ainsi trouvées étaient des défauts de ce portage et sont corrigées.
| Autre vérification | Résultat |
|---|---|
| Fichiers écrits par les plugins d'extraction | 24 441 comparés, tous égaux |
| Pages d'aide des plugins | 197 sur 197 identiques |
| Moteurs de rendu | csv, json, jsonl, quick et pretty comparés sur plusieurs plugins, tous identiques |
Les instructions sont décodées par la même bibliothèque que celle utilisée par la version Python, compilée en version 5.0.6, qui est la version à laquelle la référence a été épinglée pour ces comparaisons. La version 5.0.7 décode une forme d'instruction supplémentaire, ce qui modifie l'orthographe d'environ deux pour cent des lignes de windows.mbrscan sur la capture Windows 10, et rien d'autre.
Les symboles Windows pour les captures utilisées ici proviennent des packs de symboles publiés par la Volatility Foundation, lus par les deux outils, à l'exception du noyau Windows 11 24H2, qu'aucun pack ne décrit et dont la description est construite à partir de la base de données publiée par Microsoft. Pour une capture Windows 10 19045 antérieure, la description que ce portage construit de cette manière correspondait exactement à celle que la version Python construit à partir de la même base de données, sur l'ensemble des 16 types de base, 293 énumérations, 1 653 structures et 40 007 symboles.
Les dix écarts les plus importants sur chaque capture. Chaque chiffre, et chaque plugin comparé, figure dans BENCHMARKS.md.
| Plugin | Rust | Python | Plus rapide |
|---|---|---|---|
windows.malfind.Malfind | 0,494 s | 392 s | x793 |
windows.malware.suspicious_threads.SuspiciousThreads | 0,621 s | 488 s | x786 |
windows.malware.malfind.Malfind | 0,569 s | 393 s | x691 |
windows.suspicious_threads.SuspiciousThreads | 0,739 s | 461 s | x624 |
windows.hollowprocesses.HollowProcesses | 0,646 s | 326 s | x504 |
windows.malware.hollowprocesses.HollowProcesses | 0,661 s | 322 s | x487 |
layerwriter.LayerWriter | 0,044 s | 17,4 s | x395 |
configwriter.ConfigWriter | 0,046 s | 16,7 s | x363 |
windows.vadinfo.VadInfo | 1,36 s | 488 s | x358 |
windows.verinfo.VerInfo | 0,541 s | 159 s | x294 |
| Plugin | Rust | Python | Plus rapide |
|---|---|---|---|
linux.sockstat.Sockstat | 6.36 s | 2030 s | x319 |
timeliner.Timeliner | 9.56 s | 1070 s | x112 |
linux.lsmod.Lsmod | 0.282 s | 29.0 s | x103 |
linux.psscan.PsScan | 1.09 s | 111 s | x102 |
linux.mountinfo.MountInfo | 0.697 s | 70.3 s | x101 |
yarascan.YaraScan | 0.909 s | 79.6 s | x88 |
linux.malware.netfilter.Netfilter | 0.6 s | 49.9 s | x83 |
linux.ptrace.Ptrace | 0.253 s | 20.4 s | x81 |
linux.pstree.PsTree | 0.213 s | 16.2 s | x76 |
linux.ip.Link | 0.22 s | 16.4 s | x74 |
| Plugin | Rust | Python | Plus rapide |
|---|---|---|---|
windows.malware.suspicious_threads.SuspiciousThreads | 0.677 s | 346 s | x511 |
windows.suspicious_threads.SuspiciousThreads | 0.677 s | 343 s | x507 |
windows.malfind.Malfind | 0.734 s | 320 s | x436 |
windows.hollowprocesses.HollowProcesses | 0.565 s | 244 s | x432 |
windows.malware.malfind.Malfind | 0.73 s | 313 s | x429 |
windows.vadinfo.VadInfo | 0.983 s | 412 s | x419 |
windows.malware.hollowprocesses.HollowProcesses | 0.648 s | 240 s | x370 |
configwriter.ConfigWriter | 0.043 s | 14.5 s | x337 |
layerwriter.LayerWriter | 0.039 s | 11.9 s | x304 |
windows.registry.hivelist.HiveList | 0.038 s | 7.54 s | x198 |
| Plugin | Rust | Python | Plus rapide |
|---|---|---|---|
windows.suspicious_threads.SuspiciousThreads | 0.184 s | 34.5 s | x188 |
windows.malware.suspicious_threads.SuspiciousThreads | 0.2 s | 33.2 s | x166 |
windows.malware.hollowprocesses.HollowProcesses | 0.209 s | 31.0 s | x148 |
windows.vadinfo.VadInfo | 0.263 s | 38.5 s | x146 |
windows.hollowprocesses.HollowProcesses | 0.207 s | 28.1 s | x136 |
windows.mftscan.ResidentData | 0.205 s | 27.6 s | x135 |
windows.malfind.Malfind | 0.203 s | 26.3 s | x130 |
windows.mftscan.MFTScan | 0.393 s | 48.2 s | x123 |
windows.malware.malfind.Malfind | 0.24 s | 28.2 s | x118 |
windows.verinfo.VerInfo | 0.215 s | 25.1 s | x117 |