Security Audit — adversarial, evidence-grounded

SkillSecurity

Lets your agent run a security audit Claude skill that hunts vulnerabilities and reports confirmed findings.

Available today. Use it from your connected AI after setup.

Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.

Then ask your AI: use the Security Audit — adversarial, evidence-grounded skill

About this skill

Structured, adversarial, multi-phase security audit of a codebase, recon → coverage-led hunting → finder≠validator validation → machine-readable findings → target-neutral report

What this skill tells your AI

The instructions your AI receives, as published by alinaqi/maggy in skills/security-audit/SKILL.md and read by ahel’s review.

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-review for adversarial validation, cpg-analysis (Joern/CodeQL) for static taint/data-flow, agent-teams / polyphony for isolated parallel hunters, and security for the vuln classes.

Principles (read first)

  • Evidence over intuition. A finding is confirmed only when you can name the file:line of the boundary that fails and a concrete attack that crosses it.
  • Finder ≠ validator. Whoever proposes a candidate must not confirm it. A different agent (or a council-review model) tries to disprove it.
  • Impact-driven severity. Rate 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.
  • Coverage is tracked, not assumed. Every input surface / trust boundary is a ledger unit with a status; a coverage critic hunts the gaps.
  • No theater. Do not pad the report with generic "consider using HTTPS" advice. Report only boundary failures you can stand behind.

Phases

1. Reconnaissance → architecture.md + coverage-ledger.json

Map 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}).

2. Coverage-led hunting

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):

ClassLook for
InjectionSQL/NoSQL/OS/LDAP/template; unparameterized queries, shell=True, eval
AuthN / AuthZmissing checks, IDOR, broken tenant isolation, JWT/session flaws
Secretskeys in code/history/logs, client-exposed VITE_/NEXT_PUBLIC_ secrets
SSRF / egressuser-controlled URLs, metadata endpoints, unvalidated redirects
Deserializationpickle/yaml.load/Marshal on untrusted input
Path / filetraversal, arbitrary write, zip-slip, unsafe temp files
LLM / promptprompt injection, tool-abuse, unbounded fan-out, data exfil via output
Supply chaintyposquats, unpinned deps, postinstall scripts, CI token scope
Cloud / IaCover-broad IAM, public buckets, exposed admin, secrets in env
Client-sideXSS, DOM sinks, CSP gaps, sensitive data in localStorage
Resource / DoSunbounded loops/allocations, regex catastrophic backtracking
Data isolationcross-tenant reads, missing RLS, PII in logs/caches
Memory (native)overflow, UAF, integer wrap (for C/C++/unsafe Rust targets)

3. Adversarial validation (finder ≠ validator)

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.

4. Structured output → findings.json

Emit 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.json

The 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.

5. Record verification

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.

6. Target-neutral report → REPORT.md

Write 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.

Anti-patterns

  • Confirming a finding you found yourself without an independent disprove attempt.
  • Severity inflation ("uses md5" rated critical with no reachable attack).
  • Grep-only hunting on a data-flow bug — use cpg-analysis.
  • A report that lists advice instead of reachable, evidence-backed findings.
  • Running audited target code outside a sandbox. Read and analyze; never execute untrusted target code to "see what it does".

How it fits the harness

  • Slots into the base Definition of Done for security-critical changes as the "prove it's safe" gate, above the preventive security skill.
  • Reuses council-review (adversarial validation), cpg-analysis (static taint), agent-teams / polyphony (isolated parallel hunters).
  • Iterations are additive: a second run over the same ledger typically surfaces more, so re-run before a major release rather than trusting one pass.

Signals

GitHub stars
707
Forks
57
Last commit
Sep 2026
Hacker News mentions
1
Advanced
Catalog kind
skill
Key
security-audit-alinaqi
Source
github.com/alinaqi/maggy