Security Review (defensive hardening audit)
A last-mile hardening pass over the project's code and configuration. It reads and reasons; it never attacks. Read STACK.md and CLAUDE.md first for deployment context (hosting, framework, where headers are set). (Check for and open these with your Read/Glob tools, not shell commands — OS portability.)
STRICT LIMITS — read before running
This is a DEFENSIVE CONFIGURATION REVIEW, NOT a penetration test. Never attempt to exploit, inject, fuzz, brute-force, or bypass anything. No live probing of third-party or production systems.
You only read source and config and propose changes. You do not perform offensive actions.
Mandatory disclaimer — include this verbatim in every report you produce:
Ceci est une revue de bonnes pratiques automatisée, non-intrusive. Ne remplace pas un audit de sécurité professionnel / test d'intrusion réglementé.
Delegate first (portable)
If a security-reviewer agent is available in the install, hand the code to it for vulnerability-level review and fold its findings into this report. If it's absent, the checklist below stands on its own. The scored report is always produced by this skill — delegation only enriches it.
The checklist
Inspect config files (e.g. vercel.json, netlify.toml, nginx/Caddy config, middleware, framework headers) and relevant code. For each item: present, misconfigured, or missing.
- Security headers
Content-Security-Policy — present? Flag unsafe-inline / unsafe-eval in script-src.
Strict-Transport-Security — present? includeSubDomains? preload?
X-Frame-Options (or CSP frame-ancestors), X-Content-Type-Options: nosniff, Referrer-Policy, Permissions-Policy.
- CORS — flag
Access-Control-Allow-Origin: * (wildcard), especially with credentials. Recommend an explicit allowlist.
- TLS — obsolete protocols (TLS < 1.2), and missing HTTP→HTTPS redirect.
- Exposure — reachable
.git/, .env, backups (.bak, ~, .old), source maps in prod, other sensitive files; infra metadata leaked in headers (Server, X-Powered-By, version banners).
- Forms — submission endpoints with no anti-abuse (honeypot / captcha / rate-limit).
- Cache — sensitive responses without
Cache-Control: no-store; overly permissive caching of authenticated content.
- SRI — third-party
<script>/<link> from a CDN without integrity.
- security.txt — present at
/.well-known/security.txt?
Scoring (indicative, out of 100)
Start at 100, deduct per finding by severity, add bonus for strong practices already in place, then clamp to [0, 100] (the floor).
| Severity |
Deduction |
Typical |
| Critique |
−20 |
wildcard CORS with credentials, .env/.git exposed, no TLS |
| Haute |
−8 |
no CSP, no HSTS, unsafe-inline script-src |
| Moyenne |
−4 |
missing X-Content-Type-Options/Referrer-Policy/Permissions-Policy, no HTTP→HTTPS redirect |
| Basse |
−1 |
missing security.txt, verbose Server header |
| Bonus |
+1 to +2 each |
strong practices already present (nonce-based CSP, HSTS preload, SRI everywhere) |
Label the score as indicative, never as a certification. Give each finding an estimated effort (e.g. trivial — one config line, low, medium — needs infra change).
Report format
Deliver a clear report (and save to SECURITY-REVIEW.md at project root if the user wants a record). Structure:
- Disclaimer (verbatim, above) and the indicative score /100 with the tally that produced it.
- Findings, ordered by severity. Each: Finding → Risk → Recommendation, with severity and estimated effort.
- Already in place — the strong practices you found, so the report credits real work, not just gaps.
Fixes
For configuration fixes (headers in vercel.json, CORS allowlist, redirect rules, cache directives, adding security.txt/SRI): propose the diff, explain it, and apply only after the human approves. Never silently rewrite security config. For code-level issues (form anti-abuse, exposed routes), describe the change and let the human or feature-build implement it.
Before calling it done
The disclaimer is present, every finding has risk + recommendation + effort, the score's math is shown, and no offensive action was taken. If you strayed into probing or exploitation, you've broken the skill's contract — stop and report only what you read.
1---2name: security-review3description: End-of-development defensive hardening audit for a web project — scored, with fixes. Runs a defensive configuration checklist (security headers, CORS, TLS, file exposure, form protection, cache/SRI/security.txt), scores the result out of 100 by severity, and proposes config diffs to apply after human review. Use when hardening before launch, or when the user asks "is this secure to ship", "security audit", "hardening review", "check the headers/CORS/TLS". This is a NON-INTRUSIVE configuration review, not a penetration test.4---56# Security Review (defensive hardening audit)78A last-mile hardening pass over the project's **code and configuration**. It reads and reasons; it never attacks. Read `STACK.md` and `CLAUDE.md` first for deployment context (hosting, framework, where headers are set). (Check for and open these with your Read/Glob tools, not shell commands — OS portability.)910## STRICT LIMITS — read before running1112- This is a **DEFENSIVE CONFIGURATION REVIEW, NOT a penetration test.** Never attempt to exploit, inject, fuzz, brute-force, or bypass anything. No live probing of third-party or production systems.13- You only **read** source and config and **propose** changes. You do not perform offensive actions.14- **Mandatory disclaimer** — include this verbatim in every report you produce:1516 > **Ceci est une revue de bonnes pratiques automatisée, non-intrusive. Ne remplace pas un audit de sécurité professionnel / test d'intrusion réglementé.**1718## Delegate first (portable)1920If a `security-reviewer` agent is available in the install, hand the code to it for vulnerability-level review and fold its findings into this report. If it's absent, the checklist below stands on its own. **The scored report is always produced by this skill** — delegation only enriches it.2122## The checklist2324Inspect config files (e.g. `vercel.json`, `netlify.toml`, nginx/Caddy config, middleware, framework headers) and relevant code. For each item: present, misconfigured, or missing.2526- **Security headers**27 - `Content-Security-Policy` — present? **Flag `unsafe-inline` / `unsafe-eval`** in script-src.28 - `Strict-Transport-Security` — present? includeSubDomains? **preload?**29 - `X-Frame-Options` (or CSP `frame-ancestors`), `X-Content-Type-Options: nosniff`, `Referrer-Policy`, `Permissions-Policy`.30- **CORS** — **flag `Access-Control-Allow-Origin: *`** (wildcard), especially with credentials. Recommend an explicit allowlist.31- **TLS** — obsolete protocols (TLS < 1.2), and missing HTTP→HTTPS redirect.32- **Exposure** — reachable `.git/`, `.env`, backups (`.bak`, `~`, `.old`), source maps in prod, other sensitive files; infra metadata leaked in headers (`Server`, `X-Powered-By`, version banners).33- **Forms** — submission endpoints with no anti-abuse (honeypot / captcha / rate-limit).34- **Cache** — sensitive responses without `Cache-Control: no-store`; overly permissive caching of authenticated content.35- **SRI** — third-party `<script>`/`<link>` from a CDN without `integrity`.36- **security.txt** — present at `/.well-known/security.txt`?3738## Scoring (indicative, out of 100)3940Start at **100**, deduct per finding by severity, add bonus for strong practices already in place, then clamp to **[0, 100]** (the floor).4142| Severity | Deduction | Typical |43|---|---|---|44| **Critique** | −20 | wildcard CORS with credentials, `.env`/`.git` exposed, no TLS |45| **Haute** | −8 | no CSP, no HSTS, `unsafe-inline` script-src |46| **Moyenne** | −4 | missing `X-Content-Type-Options`/`Referrer-Policy`/`Permissions-Policy`, no HTTP→HTTPS redirect |47| **Basse** | −1 | missing `security.txt`, verbose `Server` header |48| **Bonus** | +1 to +2 each | strong practices already present (nonce-based CSP, HSTS preload, SRI everywhere) |4950Label the score as indicative, never as a certification. Give each finding an **estimated effort** (e.g. *trivial — one config line*, *low*, *medium — needs infra change*).5152## Report format5354Deliver a clear report (and save to `SECURITY-REVIEW.md` at project root if the user wants a record). Structure:55561. **Disclaimer** (verbatim, above) and the indicative **score /100** with the tally that produced it.572. **Findings**, ordered by severity. Each: **Finding → Risk → Recommendation**, with severity and estimated effort.583. **Already in place** — the strong practices you found, so the report credits real work, not just gaps.5960## Fixes6162For **configuration** fixes (headers in `vercel.json`, CORS allowlist, redirect rules, cache directives, adding `security.txt`/SRI): **propose the diff, explain it, and apply only after the human approves.** Never silently rewrite security config. For code-level issues (form anti-abuse, exposed routes), describe the change and let the human or `feature-build` implement it.6364## Before calling it done6566The disclaimer is present, every finding has risk + recommendation + effort, the score's math is shown, and no offensive action was taken. If you strayed into probing or exploitation, you've broken the skill's contract — stop and report only what you read.