Please do not open a public issue for security problems. Report privately via GitHub Security Advisories ("Report a vulnerability" on the repo's Security tab), or email the maintainers listed on the Strix Advanced Tools organization. We aim to acknowledge within 72 hours.
Strix MetaVault is a local, offline tool. It:
- has no network access — it never opens a socket;
- spawns no shell — every external tool (
7z,exiftool) is called with an argument list, so command injection is impossible; - uses no dynamic code — no
eval/exec/pickle/marshal/yaml; - never modifies your originals — all work happens on copies in a private temp dir.
The externally-influenced inputs are the files you feed it (parsed by ExifTool, qpdf, and the OOXML rewriter) and the optional 7-Zip / ExifTool binaries it locates.
Encryption is deliberately delegated to 7-Zip's AES-256 (.7z): 7-Zip derives the
key with an SHA-256-based KDF (2^19 rounds), uses a random per-archive salt and IV, and
encrypts the archive header (-mhe=on) so file/folder names are hidden. No crypto is
implemented in this project — hand-rolling a cipher is the classic way to introduce a
vulnerability, so the dangerous work is left to a mature, audited component.
- Passwords are generated with Python's
secretsand shown once; never written to disk or logs, redacted from any surfaced tool output, and passed to 7-Zip as a single-pargument (with a--end-of-options guard). - Custom (user-supplied) passwords are now rated by
password_strength(); those below the hard floor (8 chars, ≥2 character classes) are refused, and weak ones require explicit confirmation.
- ExifTool config RCE mitigation — ExifTool is run with
-config <empty>inside a private temp dir so a stray.ExifTool_config(Perl) cannot execute. - Zip-bomb guard — the OOXML rewriter enforces total/member/entry-count/ratio limits before decompressing.
- Symlink safety — symlinks in selected folders are skipped (never followed), and secure-delete never writes through a link.
- PATH-hijack protection — helper binaries are resolved from an env override, then
trusted directories, and only last from
PATH; every candidate is validated as an absolute regular file. - Timeouts + password redaction — every external call has a timeout; surfaced output has the password redacted and the argument list is never logged.
- Path-traversal defenses — OOXML member names with traversal/absolute paths are
rejected; the caller-supplied output name and extension are both validated
(basename-only, no separators/
..) so the archive can never be written outside the chosen output folder; output paths are verified to stay within the target folder. - Embedded-media scrubbing — the OOXML rewriter recurses the OPC package and strips
EXIF/GPS/XMP (JPEG) and text/time/eXIf chunks (PNG) from embedded images under
word|xl|ppt/media/*, and deletescustomXml/*data stores (removing their relationships to keep the document valid), so a GPS-tagged photo or SharePoint GUID inside a document no longer leaks.
tests/test_core.py— 44 end-to-end tests (8 security-specific: argument injection, symlink skipping, zip-bomb rejection, ExifTool config disable, password redaction, entropy floor, member-name validation, output-extension validation), plus embedded-media EXIF/GPS + customXml scrubbing coverage. Requires 7-Zip + ExifTool.tests/test_password_strength.py— pure-function tests for the custom-password gate and the output-extension validator (no external tools).
- Archive password visible in the process table on shared machines. 7-Zip's
archive-creation command (
7z a) accepts the password only as a command-line argument (-p<pwd>) — it has no stdin or password-file input — so while an archive is being created the password is briefly present in the process argument list. On a single-user desktop (this tool's primary target) that argument list is only visible to your own account and to the local Administrator, so the exposure is negligible. On a shared / multi-user host, however, another logged-in user could observe it for the duration of the archiving call. We therefore recommend not running Strix MetaVault on machines shared with untrusted users, and treating any password used there as compromised. (The-pargument is passed as a single token after a--end-of-options guard, so it is never shell-parsed or word-split.) - Recommended install location. Install per-user (e.g. under your own
%LocalAppData%on Windows, or your home directory on Linux) or in an admin-only location that other non-admin users cannot read/write. Avoid world-writable directories so neither the app binaries nor thetools\helpers can be swapped by another user, and so the private temp working area stays under your account. - Python cannot reliably wipe a string from memory; on SSD/flash, overwrite of temp files is not guaranteed due to wear-leveling.
- Legacy
.doc/.xls/.ppt(OLE) and OOXMLrsididentifiers may not be fully removed; for critical cases verify withexiftool -a -G1 -s <file>.