auto-fix
[experimental] Auto-remediate verified findings by generating patches and optionally creating a PR
[stable] Verify findings with Joern plus code review and update the shared findings artifact
> /plugin marketplace add allsmog/vuln-scout > /plugin install vuln-scout@vuln-scout
How it fires
How this command gets triggered: by you, by Claude, or both.
/verifyContext preview
What this command does when you run it.
[stable] Verify findings with Joern plus code review and update the shared findings artifact
name: verify description: "[stable] Verify findings with Joern plus code review and update the shared findings artifact" argument-hint: "<file:line> [--type sql-injection|command-injection|xss|path-traversal|ssrf|reentrancy|integer-overflow] [--all-critical] [--from file] [--no-cache] [--json]" allowed-tools: - Bash - Read - Write - Grep - Glob - TodoWrite - Task
Verify whether a reported item is a real vulnerability, a false positive, or still unresolved.
Pattern matches and sink heuristics produce leads. Verification decides whether those leads stay `hotspot`, become `finding`, or close as `false_positive`.
/vuln-scout:verify routes/login.ts:34 --type sql-injection
/vuln-scout:verify --all-critical
/vuln-scout:verify --from .claude/findings.json
First-party Joern verification is implemented for:
Solidity verification is Slither-owned. Joern should return `verdict: na_cpg` for Solidity findings instead of trying to build a Solidity CPG.
If the target language is not supported for the requested verifier:
Cache CPGs by target hash plus language so repeated verification does not restart from scratch.
TARGET_HASH=$(git ls-files -z . | xargs -0 shasum | shasum | awk '{print $1}')
LANGUAGE=<detected-language>
CPG_FILE=".joern/${TARGET_HASH}-${LANGUAGE}.cpg"
if [ ! -f "$CPG_FILE" ] || [ "$NO_CACHE" = "true" ]; then
mkdir -p .joern
joern-parse . --output "$CPG_FILE"
fi| Type | Script | |------|--------| | `sql-injection` | `verify-sqli.sc` | | `command-injection` | `verify-cmdi.sc` | | `xss` | `verify-xss.sc` | | `path-traversal` | `verify-path.sc` | | `ssrf` | `verify-ssrf.sc` | | other / mixed | `verify-generic.sc` |
Single verification:
joern --script "${CLAUDE_PLUGIN_ROOT}/scripts/joern/verify-${VULN_TYPE}.sc" \
--params cpgFile="$CPG_FILE",file="$FILE",line="$LINE"Batch verification:
joern --script "${CLAUDE_PLUGIN_ROOT}/scripts/joern/batch-verify.sc" \
--params cpgFile="$CPG_FILE",findingsFile=".claude/findings.json"Joern output should resolve to one of:
Use the `false-positive-verifier` as a cold reviewer. Do NOT pass prior chain-of-thought; pass only:
Review contract for the orchestration loop:
Workflow: 1. Run Joern and collect the initial verification result. 2. Invoke `false-positive-verifier` with only the evidence bundle. 3. If the reviewer returns `CHANGES_REQUESTED`, revise the candidate, downgrade it to `hotspot`, or leave it as `needs_review`, then invoke a NEW cold reviewer. 4. Stop after 3 rounds maximum. 5. If the finding is still not settled after round 3, keep the final artifact verdict as `needs_review` and add `[REVIEWER NOTE: unresolved]` to `.claude/review-ledger.json`.
Persist each verification review round in `.claude/review-ledger.json`:
Use `vuln-scout/references/findings.schema.json` as the contract.
Verification updates must preserve:
Verification updates may change:
Recommended rules:
Alongside `.claude/findings.json`, update `.claude/review-ledger.json` with the cold-review history for each verified item. The ledger is the machine-readable contract for:
When a finding remains unresolved, include `[REVIEWER NOTE: unresolved]` in `notes`.
Example verified entry:
{
"id": "VSCOUT-001",
"stable_key": "semgrep:sql-injection:routes/login.ts:34",
"kind": "finding",
"severity": "critical",
"type": "sql-injection",
"title": "SQL injection in login handler",
"file": "routes/login.ts",
"line": 34,
"verdict": "verified",
"confidence": "verified",
"source_tool": "joern",
"message": "User-controlled input reaches db.query without parameterization.",
"evidence": [
{
"type": "data-flow",
"label": "req.body.email to db.query",
"path": "routes/login.ts",
"line": 34,
"excerpt": "db.query(`SELECT ... ${email}`)"
}
]
}When `--json` is passed:
AI-powered whitebox penetration testing plugin for Claude Code. 9 languages, 22 skills, 7 autonomous agents. STRIDE threat modeling, OWASP 2025 coverage, polyglot monorepo support.
Repo: allsmog/vuln-scout
[experimental] Auto-remediate verified findings by generating patches and optionally creating a PR
[experimental] Create a custom Semgrep detection rule from a confirmed vulnerability pattern
[stable] Compare security posture between two git refs to find new/fixed vulnerabilities and track regression
[stable] End-to-end security audit with hotspot-aware framework pivots, shared findings.json schema, and CI-friendly workflow flags
[beta] Audit a decompiled Android target — scans jadx_out/sources + apktool_out together and merges findings