Repository navigation
v3.0.0 — Working analysis runs, Volatility 3 2.26+ plugins, kernel symbol options
Every analysis run since 2.0.0 aborted when the first plugin launched; this release fixes that and was validated end to end on real dumps (MemLabs Lab 0 CTF image, Volatility 3 test-data Windows 10 and Debian 7 samples).
Breaking
- Volatility 3 2.26.2+ is required (current plugin names). Output files
hashdump.txt/lsadump.txtare nowregistry_hashdump.txt/registry_lsadump.txt. - An existing output directory that is group/world-writable or not owned by you (including
-o /tmp) is refused. - Exit status is 1 when no plugin succeeds.
- Text report status column:
OK/WARN→SUCCESS/WARNING/FAILED/MISSING. --dump-registrywrites its index toregistry_dump_index.txt;registry_hivelist.txtis the plugin output again.
Added
- Windows:
windows.cmdscanandwindows.consoles(console command history and output) — 32 Windows plugins. --symbols DIRand--isf-url URLpass kernel symbols to everyvolcall (-s/-u), OS auto-detection included, so Linux/macOS dumps work without copying ISF files into Volatility's directories.--isf-urltakeshttps://orfile://only (a local--symbolsdirectory is the tamper-proof option: Volatility retries a failed TLS verification unverified). Both are recorded in the text and JSON reports.make update-tldsrefreshes the IANA TLD list used for domain IOCs;make installinstalls it to$(BINDIR)/../share/volatility-toolkit/.
Fixed
- Plugins started in parallel on a cold Volatility cache (first Windows run with
--os, which downloads the kernel PDB, or--isf-urlwithout auto-detection) could read each other's half-written cache files and fail withJSONDecodeError(seen onlinux.lsmod). The first plugin now runs alone and fills the cache. --dump-registryoverwrote thewindows.registry.hivelistplugin output (registry_hivelist.txt) with its own index. When hive extraction stops early (paged-out hive on a Windows 10 dump), the hive list and its report line count were lost. The dump index now goes toregistry_dump_index.txt.strings/ipv4.txtkept invalid addresses and pieces of OIDs and version strings (931.331.331.353,1.3.6.1from1.3.6.1.4.1.311): 510 of 779 entries on a Windows 7 CTF image. Only whole dotted quads (trailing dots allowed) with octets up to 255 and no leading zeros are kept;address.portforms such as10.0.0.5.443are not matched.strings/domains.txtwas mostly file names and .NET type names on real dumps. A name must now end in a lower-case IANA TLD (share/volatility-toolkit/tlds.txt, internationalisedxn--TLDs included). For TLDs that double as file extensions (.sh,.py,.zip…), file-like names (run.sh,libfoo-2.0.so) are dropped and hosts (c2.evil.sh) kept: 18,778 → 810 entries on a Windows 7 CTF image, 370,609 → 81,370 on Windows 10, 47,674 → 9,327 on Debian 7. Upper-case host names are no longer matched.- Analysis aborted when the first plugin launched:
(( i++ ))evaluates to 0, whichset -etreats as failure. The same pattern inhuman_size()aborted runs on macOS withoutnumfmt. Use pre-increment. -j 08(zero-padded) made the scheduler spin forever without launching a plugin (octal parse error inside(( ))). Values are now parsed as base 10.- Ctrl-C / SIGTERM no longer resumes the scheduler loop or leaves orphaned
volprocesses: INT/TERM exit, andvolruns as a direct child so cleanup can kill it. OS auto-detection,strings,--dump-filesand--dump-registryalso stop at once (they used to run to completion, up to 3×60s for detection). - Every plugin was reported as WARN/"warning": vol's progress bar went to
.err. vol now runs with-q, and status comes from its exit code. - Freed worker slots could idle until a slow plugin finished (
wait -nignores jobs that already exited). Replaced with a 1s poll. - Colors printed as literal
\033[...]text in--helpand status lines on a TTY. chmod 700was applied to pre-existing output directories (-o /tmpas root stripped the sticky bit). Replaced byumask 077: new directories are 700 and every output file is 600, including inside an existing directory (hashdump/lsadump output is no longer group-readable under umask 002).- An existing output directory that is not owned by the user, or is group/world-writable, is refused: another user could pre-create output files or symlinks and receive the hashdump/lsadump results.
- The system-directory blocklist never matched top-level paths:
-o /etc,-o /,-o /usr,-o /tmp/../etcwere accepted (the path was built as//etc). - A backslash in the dump's file name corrupted the recorded MD5/SHA256 (GNU tools prefix the hash with
\) and made the JSON invalid. Hashes are computed from stdin and validated as hex. .comdomains were dropped fromstrings/domains.txt(comwas in the file-extension blocklist).- Interactive prompts aborted the run on EOF instead of treating it as "no".
- zsh completion file filter used brace syntax, which never matches in a glob; bash completion offered no dump files without
extglob, and inserted names with spaces unescaped.
Changed
- Plugin names updated for Volatility 3 2.26.2+; the old aliases are past their removal dates:
windows.malware.malfind,windows.registry.hashdump,windows.registry.lsadump,linux.malware.*(malfind, check_syscall, check_idt, check_modules, check_creds, check_afinfo, tty_check, keyboard_notifiers). Output files:hashdump.txt→registry_hashdump.txt,lsadump.txt→registry_lsadump.txt; malware plugins keep their old names. - Linux/macOS docs: prebuilt ISFs from Abyss-W4tcher/volatility3-symbols (banner lookup or
--remote-isf-url), and~/.cache/volatility3/symbols/instead of the install directory. - Docs updated for current plugin names and options (YARA, hashdump extras, removed
mac.timecounter, no Volatility 2imageinfo). - Report statuses:
SUCCESS/WARNING(exit 0 with stderr) /FAILED/MISSING. JSON adds per-pluginexit_codeandduration_seconds. - Checksums fall back to
md5/shasum -a 256(stock macOS), with a warning if a hash cannot be computed. - Exit status is 1 when no plugin succeeds (wrong
--os, missing kernel symbols); reports are still written. VOL_DETECT_TIMEOUTis validated; a warning is shown when notimeout/gtimeoutexists to enforce it.- Windows
--extract-stringsalso extracts UTF-16LE strings (GNUstrings -e l). - Output-dir blocklist no longer rejects
/var/*and/run/*subtrees (/var/tmp, macOS$TMPDIR,/run/media/$USERevidence drives). VOL3_CMDacceptsvol.py; droppedpython/python3, which could never work without a script argument.NO_COLORfollows no-color.org: only a non-empty value disables color.- Explicit bash 4.0+ check with a clear error (macOS
/bin/bashis 3.2). make installsupportsDESTDIRand installs bash completion to$(PREFIX)/share/bash-completion/completions(replaces the legacy/etc/bash_completion.d) and zsh completion to$(PREFIX)/share/zsh/site-functions.make uninstallremoves only the files it installed (no morerm -rf $(DOCDIR)).VOL_DETECT_TIMEOUTdocumented in--helpand the README.
CI
actions/checkoutbumped to v7.0.1 (pinned SHA); CI steps callmake lint/make check/make test;permissions: contents: readand job timeouts.make lintnow covers the tests, the bash completion andscripts/ci-local.sh.- macOS job installs Homebrew bash (the script needs bash 4+).
- New
make ci(scripts/ci-local.sh) mirrors CI locally. - Tests: the grep-for-
chmodstub was replaced by end-to-end runs against a fakevol(scheduler, exit codes, reports, JSON validity, file modes, top-level-orejection, IOC extraction, auto-detection, SIGTERM during plugins and detection).