npx claudepluginhub thejefflarson/soundcheck --plugin soundcheckThis skill uses the workspace's default tool permissions.
Protects against directory traversal attacks where an attacker uses `../` sequences,
Detects path traversal and Zip Slip vulnerabilities in JS/TS/Python/Go where user-controlled paths escape directories. Audit file uploads, archive extractions, static servers.
Audits Python code for path traversal (CWE-22/23) in file operations (os.path.join, pathlib), uploads/downloads, archive extraction (tarfile, zipfile), and file inclusion.
Detects path traversal vulnerabilities in PHP code including directory traversal, LFI/RFI, file uploads, symlink attacks, zip slip, and null byte injection.
Share bugs, ideas, or general feedback.
Protects against directory traversal attacks where an attacker uses ../ sequences,
absolute paths, or symlinks to access files outside the intended directory. Exploitation
leads to reading sensitive files (/etc/passwd, .env, private keys), overwriting
configuration, or achieving remote code execution via file write.
open(f"/uploads/{filename}") — user-supplied filename can contain ../../etc/passwdos.path.join(base, user_input) — join does NOT prevent absolute paths (/etc/passwd ignores base)filepath.Join(root, r.URL.Query().Get("file")) — Go join strips .. but doesn't verify result is under rootPaths.get(baseDir, userInput) — Java Path doesn't enforce containmentfs::read_to_string(format!("data/{}", user_input)) — format string allows traversalFlag the vulnerable code and explain the risk. Then suggest a fix that establishes these properties:
realpath,
Path.resolve(), toRealPath(), filepath.EvalSymlinks — the call that
collapses ../ and follows links. Only after this does the containment
check make sense.is_relative_to, startsWith equivalent). A mismatch means traversal or
symlink escape; reject rather than fall through. os.path.join and
filepath.Join alone do not satisfy this — they collapse some .. but
don't verify containment.open() call is a bug.Anchor — shape, not implementation:
root = canonical(ROOT_DIR)
target = canonical(root / user_filename) # resolves .., follows symlinks
require(target.starts_with(root)) # containment
open(target)
os.path.join and filepath.Join alone are NOT sufficient