
Volatility 3 portato in Rust. Stesso output, molto più veloce.
Un port del framework di memory forensics Volatility 3 da Python a Rust. Legge le stesse immagini di memoria, esegue gli stessi plugin con le stesse opzioni e stampa lo stesso output, byte per byte, un bel po' più velocemente.
Questo progetto è un port di Volatility 3 ed è quindi un'"Addition" ai sensi della Volatility Software License 1.0, per cui è pubblicato sotto quella stessa licenza. Il testo completo è in LICENSE e online su https://www.volatilityfoundation.org/license/vsl-v1.0. Ogni file sorgente mantiene l'avviso che registra da cosa è stato derivato.
Questo progetto non è affiliato né approvato dalla Volatility Foundation. Il nome Volatility è usato solo per indicare di cosa è un port.
Rust 1.85 o successivo, poi:
cargo build --release
Il binario si trova in target/release/vol-rs. Non serve nulla di opzionale. La decompressione dei simboli, RC4, DES, AES, la corrispondenza YARA, la scrittura PNG e gli archivi tar sono tutti integrati, mentre la versione Python ricorre a pycryptodomex, yara-python e pillow. Le istruzioni vengono decodificate da capstone 5.0.6, la stessa libreria utilizzata dalla versione Python per le stesse colonne, compilata all'interno anziché installata a fianco.
./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
Ogni opzione accettata dalla versione Python è accettata anche qui, con gli stessi nomi e gli stessi valori predefiniti, inclusi -o, -r, -s, -c, -e, --filters, --hide-columns, --save-config, --stackers e --single-swap-locations. Anche le opzioni specifiche di ciascun plugin corrispondono, come mostrano le pagine di aiuto: tutte e 197 sono identiche a quelle della versione Python, carattere per carattere.
I pacchetti di simboli vanno in $XDG_DATA_HOME/vol-rs/symbols, oppure in ~/.local/share/vol-rs/symbols quando tale variabile non è impostata. Un pacchetto situato altrove viene indicato con --symbol-dirs o tramite la variabile d'ambiente VOLRS_SYMBOL_PATH. Un kernel Windows che nessun pacchetto descrive viene cercato sul server dei simboli Microsoft, e il database trovato viene convertito in un file di simboli e conservato, così il recupero avviene una sola volta. Il database stesso viene memorizzato nella cache sotto ~/.cache/vol-rs e il file di simboli viene scritto accanto ai pacchetti.
Entrambe le versioni sono state eseguite sulle stesse acquisizioni e confrontate, inclusi l'intestazione e le newline finali:
| Acquisizione | Plugin eseguiti | Identici |
|---|---|---|
| Windows 11 24H2, build 26100, crash dump da 4,3 GB | 113 | 105 |
| Ubuntu 22.04, kernel 6.5.0-41, snapshot VMware da 4,3 GB | 69 | 61 |
| Windows 10 19041, crash dump da 2,0 GB | 114 | 112 |
| Windows XP, acquisizione raw da 512 MB | 114 | 113 |
| Linux 3.2, acquisizione raw da 512 MB | 60 | 60 |
Agli otto plugin che richiedono un pattern o una regola ne è stato fornito uno, identico su entrambe le versioni, anziché essere esclusi. Tre delle differenze così rilevate erano difetti di questo port e sono state corrette.
| Altra verifica | Risultato |
|---|---|
| File scritti dai plugin di estrazione | 24.441 confrontati, tutti uguali |
| Pagine di aiuto dei plugin | 197 su 197 identiche |
| Renderer | csv, json, jsonl, quick e pretty confrontati su diversi plugin, tutti identici |
Le istruzioni vengono decodificate dalla stessa libreria usata dalla versione Python, compilata alla versione 5.0.6, che è la versione a cui il riferimento è stato fissato per questi confronti. La versione 5.0.7 decodifica una forma di istruzione in più, il che cambia la scrittura di circa il due percento delle righe di windows.mbrscan sull'acquisizione Windows 10 e nient'altro.
I simboli Windows per le acquisizioni usate qui provengono dai pacchetti di simboli pubblicati dalla Volatility Foundation, letti da entrambi gli strumenti, tranne il kernel Windows 11 24H2, che nessun pacchetto descrive e la cui descrizione è costruita dal database pubblicato da Microsoft. Per un'acquisizione precedente di Windows 10 19045, la descrizione che questo port costruisce in tal modo corrispondeva esattamente a quella costruita dalla versione Python dallo stesso database, su tutti i 16 tipi di base, 293 enumerazioni, 1.653 strutture e 40.007 simboli.
Le dieci differenze più ampie su ciascuna acquisizione. Ogni cifra, e ogni plugin confrontato, è in BENCHMARKS.md.
| Plugin | Rust | Python | Più veloce |
|---|---|---|---|
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 | Più veloce |
|---|---|---|---|
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 | Più veloce |
|---|---|---|---|
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 | Più veloce |
|---|---|---|---|
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 |