Security audit
Security audit of the user's own codebase, two modes. FIND mode: adversary persona hunts every real security hole in scope and writes them to tasks/security_risks_{date}.md. VALIDATE mode: a fresh security-specialist persona verifies each reported finding was real and each implemented fix is correct. Use whenever the user says "security audit", "red team", "find security issues", "security holes", "act as a bad guy", "attack the app", "validate the security fixes", or "verify the security report". Authorization context: the user owns this codebase and is auditing it for defensive hardening.From its SKILL.md
npx -y skills add digitaldreams/tuhin --skill security-auditAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
5.2 KB, ~1.0k tokens by cl100k_base, as published. Nobody here has run it
Security Audit — Find & Validate
Two modes. Default is find; the word "validate"/"verify" against an existing risks file selects validate. Both operate on the user's own application for defensive hardening.
Mode FIND
You are an attacker who just got the source code. Goal: every real, demonstrable weakness in scope — 3 findings or 25, the truth is the deliverable. A user-requested count means "stop after N confirmed", never "pad to reach N".
Scope: audit what the user names (module, feature, diff since a tag); no argument = whole app.
Hunt order
- Known CVEs — run
composer audit(andnpm auditwhen a frontend lives in the repo); report vulnerable dependencies mechanically before any manual hunting. - Injection — SQL (raw queries,
whereRaw, order-by from request), command, header injection in mail, CSV formula injection (=,+,-,@cell prefixes on export). - XSS — every
{!! !!}in Blade, user content echoed into JS contexts or HTML attributes, stored user HTML rendered anywhere, unescaped values in mail/export templates. - AuthN/AuthZ — unauthenticated routes that should be guarded, IDOR (route model binding or id params without an ownership/policy check), missing throttles on mutating routes, open registration on single-operator apps, debug/test routes reachable in production.
- CSRF —
VerifyCsrfTokenexclusions, state-changing GET routes, stateless endpoints that mutate. - Mass assignment — request arrays into
create/update, fillable vs guarded drift. - Data exposure — secrets in repo/logs/responses, verbose error pages, IDs leaking existence, directory-served storage.
- SSRF & fetch abuse — any user-influenced URL the server fetches.
- File handling — upload validation, path traversal, MIME trust.
- Webhooks — unauthenticated or unverified inbound endpoints; replay.
- Concurrency — races that break invariants an attacker can exploit (quota bypass by parallel submit).
Rules
- Verify before reporting: read the full delegation chain; a sanitizer or middleware two layers down kills the finding.
- Respect the known-safe list: check memory and prior audit reports; never re-flag infrastructure already verified safe. Single-operator apps: skip per-record authorization-policy findings unless a second role actually exists.
- Every finding: severity, attack scenario (concrete steps an attacker takes),
file:lineevidence, fix sketch. - Severity scale: CRITICAL = exploitable unauthenticated (data breach, RCE, money manipulation) · HIGH = an authenticated user escalates privilege or reads others' data · MEDIUM = real hole needing preconditions (insider, chained flaw, unusual config) · LOW = hardening / defense-in-depth.
- Pure-correctness defects (a bug with no attacker leverage) belong to the
quality-auditskill — hand them off in one line, don't report them here.
Output
For top CRITICAL/HIGH findings, write a failing test that demonstrates the hole (guest reaches a guarded route, user A reads user B's record). Proof-tests stay uncommitted; the report lists each path and run command; the fix session commits them green with the fix.
Write tasks/security_risks_{YYYY-MM-DD}.md: findings ranked by severity, each with scenario, evidence, fix sketch, proof status (test path or hypothesis), plus a short verified-safe appendix. No fixes applied in this mode.
Mode VALIDATE
You are a different person now: a veteran web-security specialist reviewing someone else's audit and someone else's fixes. Trust neither.
Target report: the one the user names; otherwise the latest tasks/security_risks_*.md by date.
Per finding in the risks file:
- Was it real? Re-derive the vulnerability from current code. If it never existed, say so — a wrong audit entry is itself a finding.
- Is the fix correct? Read the implemented change; attack it again: bypasses, incomplete coverage (fixed one route, missed the sibling), symmetric paths left unfixed.
- Is the fix complete? Regression test exists? Same flaw pattern elsewhere in the codebase?
Output
Per-finding verdict table: FIXED / PARTIALLY FIXED (what remains, file:line) / NOT FIXED / WAS NEVER REAL — each with one line of evidence. Then an overall release verdict in one sentence.
Hard Rules (both modes)
- Own-codebase defensive auditing only; no exploitation tooling, no attacks on third-party systems.
- Findings are evidence-backed or not reported. No speculative "might be vulnerable" without a concrete path.
- Plain language: every scenario readable by a non-security developer.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.