Structured, adversarial, multi-phase security audit of a codebase — recon → coverage-led hunting → finder≠validator validation → machine-readable findings → target-neutral report
A full audit, not a checklist. It runs in phases, keeps a coverage ledger so
nothing is skipped silently, and — the core discipline — the agent that finds a
candidate is never the one that confirms it. Severity is likelihood × impact,
not deviation from a style rule. Output is machine-readable and reproducible.
Methodology inspired by Cloudflare's public security-audit-skill, rebuilt to reuse maggy's own pieces:
council-reviewfor adversarial validation,cpg-analysis(Joern/CodeQL) for static taint/data-flow,agent-teams/polyphonyfor isolated parallel hunters, andsecurityfor the vuln classes.
confirmed only when you can name the
file:line of the boundary that fails and a concrete attack that crosses it.council-review model) tries to disprove it.likelihood × impact, not "differs from best
practice". A hardcoded key in a test fixture is not critical; an auth bypass on
a tenant boundary is.architecture.md + coverage-ledger.jsonMap the target before hunting. Identify: entry points (HTTP routes, CLI, queue
consumers, webhooks), trust boundaries (authn/authz, tenant isolation, privilege
transitions), input surfaces (params, headers, files, env, deserialization),
secret handling, external calls (SSRF surface), and data stores. Write a short
architecture.md, then enumerate every surface as a unit in
coverage-ledger.json ({id, surface, boundary, status: pending}).
For each ledger unit, hunt the relevant classes. Prefer isolated sub-agents
(via agent-teams / polyphony) so one hunter's context does not bias another,
and lean on cpg-analysis for data-flow/taint where a graph beats grep. Mark each
unit hunted; a coverage critic pass re-reads the ledger and reopens units
that were skimmed. Classes to cover (depth in security + cpg-analysis):
| Class | Look for |
|---|---|
| Injection | SQL/NoSQL/OS/LDAP/template; unparameterized queries, shell=True, eval |
| AuthN / AuthZ | missing checks, IDOR, broken tenant isolation, JWT/session flaws |
| Secrets | keys in code/history/logs, client-exposed VITE_/NEXT_PUBLIC_ secrets |
| SSRF / egress | user-controlled URLs, metadata endpoints, unvalidated redirects |
| Deserialization | pickle/yaml.load/Marshal on untrusted input |
| Path / file | traversal, arbitrary write, zip-slip, unsafe temp files |
| LLM / prompt | prompt injection, tool-abuse, unbounded fan-out, data exfil via output |
| Supply chain | typosquats, unpinned deps, postinstall scripts, CI token scope |
| Cloud / IaC | over-broad IAM, public buckets, exposed admin, secrets in env |
| Client-side | XSS, DOM sinks, CSP gaps, sensitive data in localStorage |
| Resource / DoS | unbounded loops/allocations, regex catastrophic backtracking |
| Data isolation | cross-tenant reads, missing RLS, PII in logs/caches |
| Memory (native) | overflow, UAF, integer wrap (for C/C++/unsafe Rust targets) |
For each unique candidate, a different reviewer attempts to disprove it:
is the tainted input actually reachable? is there a guard upstream? is the sink
real? Route this through council-review (multiple models vote) for anything
rated high/critical. Assign a verdict: confirmed, needs_validation, or
rejected.
findings.jsonEmit findings.json conforming to report-schema.json (shipped in this skill).
Validate it before reporting:
python3 "$(cat ~/.claude/.bootstrap-dir)/skills/security-audit/validate_findings.py" findings.jsonThe validator enforces the rules that keep the audit honest: unique ids, valid
enums, and that every confirmed finding has a file:line location, an attack
scenario, and a validated_by that differs from found_by.
A fresh agent re-opens each confirmed finding and checks the cited file:line
still supports the claim (code may have moved). A material mismatch drops it
back to needs_validation.
REPORT.mdWrite REPORT.md (executive summary + confirmed findings by severity),
FINDINGS-DETAIL.md (per-finding evidence + remediation), and
NEEDS-VALIDATION.md (candidates that could not be confirmed). Neutral tone: no
vendor names, no editorializing, just boundary → attack → impact → fix.
cpg-analysis.base Definition of Done for security-critical changes as the
"prove it's safe" gate, above the preventive security skill.council-review (adversarial validation), cpg-analysis (static taint),
agent-teams / polyphony (isolated parallel hunters).alinaqi/maggy
55aabe2
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.