Best for
- Use when asked for a security review, security audit, vulnerability assessment, or pre-merge security check (安全审查/安全评审/漏洞排查) — covers auth, input, secrets, API, data, concurrency, container, third-party, and dependency…
johnqtcg/awesome-skills/skills/security-review/SKILL.md
Use it for engineering tasks; the detail page covers purpose, installation, and practical steps.
Decision brief
Find exploitable risks early, provide concrete fixes, and keep recommendations practical for engineering delivery.
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/johnqtcg/awesome-skills --skill "skills/security-review"Inspect the Agent Skill "security-review" from https://github.com/johnqtcg/awesome-skills/blob/d933bc88237f7a18a7ecf01e5d97a745b083df0f/skills/security-review/SKILL.md at commit d933bc88237f7a18a7ecf01e5d97a745b083df0f. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
Prioritize exploitable risk over style issues.
Before starting, classify review depth based on change scope:
The following process is mandatory for Standard and Deep reviews. Lite reviews follow the subset noted above.
When code uses driver/framework objects with non-obvious lifecycle rules (for example godror, sql extensions, SDK clients):
After first-pass findings, run a dedicated second pass to disprove your own conclusion:
Permission review
No configured static risk pattern was detected
This is not proof of safety. Runtime behavior, indirect dependencies, and hidden external systems are outside the static scan.
Evidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 95/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 30 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
Find exploitable risks early, provide concrete fixes, and keep recommendations practical for engineering delivery.
| If you need to… | Go to |
|---|---|
| Choose review depth (Lite / Standard / Deep) | §Review Depth Selection |
| Run a fast scan (skip Gate B/C/E) | Lite depth → Load references/scenario-checklists.md only |
| Run a full review with all gates (Go) | Standard/Deep → Load references/go-secure-coding.md + references/scenario-checklists.md |
| Review Node.js / TypeScript code | Load references/lang-nodejs.md + references/scenario-checklists.md |
| Review Java / Spring code | Load references/lang-java.md + references/scenario-checklists.md |
| Review Python / FastAPI / Django code | Load references/lang-python.md + references/scenario-checklists.md |
| Calibrate severity (P0–P3) or confidence | Load references/severity-calibration.md |
| Suppress a false positive correctly | §False-Positive Suppression Rules |
| Send any request / run a scanner against a live target | §Active Verification Authorization Gate (default deny) |
Not found in repo.Each finding must include one confidence label:
confirmed: vulnerable path proven by code and/or reproducible execution.likely: strong evidence with one missing runtime assumption.suspected: weak evidence requiring additional data.Do not report P0/P1 without confirmed or explicit justification.
Before publishing a finding, check suppression conditions:
If suppressed:
Open questions / assumptionssuppressed (not a finding)P0 Critical: immediate compromise (RCE, auth bypass, key exfiltration, payment tampering).P1 High: strong exploit path (injection, IDOR, sensitive data leak, broken authz).P2 Medium: meaningful defense gap likely to become exploitable.P3 Low: hardening improvement.Use this unless the team provides stricter policy:
P0: mitigation immediately, full fix within 24h.P1: fix within 3 business days.P2: fix within 14 calendar days.P3: backlog with planned milestone.If SLA differs, state the project policy explicitly.
When previous review artifacts exist, compare current findings with baseline and output:
new: not present in baselineregressed: existed before and severity/confidence worsenedunchanged: still present without material changeresolved: removed since baselineIf no baseline exists, state Baseline not found.
Before starting, classify review depth based on change scope:
| Signal | Depth | Process |
|---|---|---|
| Changed files ≤ 3 AND no trust-boundary / auth / crypto / payment paths touched | Lite | Steps 1-4, Gate A, Gate D (triage only), suppression filter, findings, Gate F |
| Changed files 4-15 OR any security-sensitive path touched | Standard | Full 15-step process |
| Changed files > 15 OR new service / new external integration / auth redesign | Deep | Full 15-step process + extended call-graph tracing beyond immediate callers |
Trigger signals that force Standard or Deep regardless of file count:
go.mod / go.sum dependency changesinternal/auth/, internal/crypto/, pkg/security/, or equivalentWhen Lite is selected, record: Review depth: Lite (N files changed, no security-sensitive paths). Gates B/C/E skipped per scope policy.
If Lite triage finds all of: 10 Gate D domains N/A, 11 scenario checklists N/A, clean
secret sweep, and no constructor/acquisition calls in Gate A — output a condensed report
instead of the full Output Contract: review depth + rationale, the line
Fast Pass: all domains N/A, all scenarios N/A, no findings., a JSON summary with
pass: true and zero counts, and the Gate F list (may be empty). All four are mandatory.
This avoids verbose N/A tables for benign changes while preserving audit traceability.
The following process is mandatory for Standard and Deep reviews. Lite reviews follow the subset noted above.
Gate A: constructor-release pairing audit.Gate B: resource inventory scan (acquire/release pairs at trust boundaries, any stack).Gate C: third-party lifecycle contract verification.Gate D: 10-domain coverage against the detected stack.Gate E: second-pass falsification review.Gate F: uncovered risk list.If any mandatory gate cannot be executed, record it under Uncovered Risk List and downgrade confidence where applicable.
To control review cost and avoid unnecessary depth, execute in two phases:
Phase 1 (triage): classify each of the 10 domains as Applicable or N/A from changed files + adjacent call paths.Phase 2 (deep review): run detailed checks and domain-specific tooling only for Applicable domains.Rules:
N/A is allowed only with a one-line reason tied to code evidence.N/A if there is any trigger signal (relevant imports, touched config, related middleware, DB/crypto/TLS paths, dependency changes).Applicable domains with findings.Anti-pattern: marking a domain N/A when imports or adjacent call paths contain trigger signals (e.g., database/sql imported → Domain 2 must be Applicable).
→ Worked N/A judgments with rationales: references/authorization-and-policy.md §6.
Gates A and B are one question at two scopes, not two scans: A runs on the diff at every depth, B widens it to the full resource taxonomy at Standard/Deep. Scan once, report once.
Scope: changed code and immediately related call paths.
New*, Open*, Acquire*, Begin*, Dial*, Listen*, Create*, WithCancel/WithTimeout/WithDeadline.Close, Release, Rollback/Commit, Stop, Cancel, or explicit ownership transfer documented in code.P2 when an attacker can drive the leak repeatedly, P3 behind an authenticated/rate-limited path, and reliability-only on a bounded one-shot path. Never grade it on the missing Close() alone — see severity-calibration.md §Governing Rule.Extends Gate A's pairing table across Domain 2's full lifecycle half: DB
rows/statements/transactions/sessions, connections, files, HTTP response bodies, listeners,
background tasks/goroutines, timers, cancel functions, pipes. Only the release idiom differs by
stack — Go defer x.Close()/defer cancel(), Node finally/stream cleanup and
client.release(), Java try-with-resources, Python with.
Adds the four path-shape checks a call-site scan cannot see: released on both success and error paths; no deferred release inside a loop; background tasks have a bounded lifecycle; every timeout paired with its cancel.
Reference:
references/go-secure-coding.md§ Gate B has the full Go inventory table and anti-patterns; the matchinglang-*.mdDomain 2 row carries the per-stack equivalents.
When code uses driver/framework objects with non-obvious lifecycle rules (for example godror, sql extensions, SDK clients):
suspected and list under Uncovered Risk List.These names and numbers are stack-independent — "Domain 7" means the same thing in Go, Node, Java, and Python. Score all ten for every review:
Execution: D1 triage (Applicable/N/A) → D2 deep review on applicable domains only.
Output: each domain PASS/FAIL/N/A with one-line evidence. Any FAIL with an exploitable path
becomes a finding. A domain with no idiom in your stack is still judged against its canonical
question — never omitted.
References: canonical definitions and the per-stack rules in
references/authorization-and-policy.md§2; per-stack evidence ingo-secure-coding.mdor the matchinglang-*.md. Auth/authz and input validation are Scenario Checklists 1-2, not domains.
After first-pass findings, run a dedicated second pass to disprove your own conclusion:
Output requirement:
Second-pass falsification completed: yes/no.Always output unresolved coverage gaps to avoid false completeness.
Each item must include:
Classify each finding's origin relative to the current code change:
introduced: defect resides in code added or modified by this change. Must fix before merge.pre-existing: defect found in unchanged code that came into scope via call paths.
Default: file a follow-up issue and do not block merge — a change should not be held
hostage to unrelated debt. This default is a recommendation to the owning team, not a
security clearance, and it is void (recommend blocking + escalate) when the finding is
P0 or an actively-exploited P1, when this change widens the attack surface on it, when
this merge is the release vehicle that ships it, or when the defect sits in the same
file/function being modified. Never present "pre-existing" as a reason the risk is
acceptable. → references/authorization-and-policy.md §5.uncertain: diff boundaries are ambiguous. Use git blame to resolve; treat as introduced if unresolvable.Add **Origin:** to each finding's output. Use diff hunks as primary classification signal.
These are structured examples of review mistakes this skill is designed to prevent. Each shows a wrong approach and the correct alternative.
Wrong: Reporting P3 — function has 200 lines, hard to review for security as a security finding.
Correct: Code complexity is a code quality issue. Only report security findings when there is an exploitable or defense-gap path. If complexity obscures a real vulnerability, report the vulnerability itself with evidence.
Wrong: P1 — math/rand used in pkg/display/shuffle.go:12 for randomizing quiz question order without checking if the output is security-relevant.
Correct: Suppressed — math/rand usage is for display ordering of quiz questions; output is not attacker-exploitable and does not protect a security boundary (Suppression Rule 2).
Wrong: Report says "all gates passed" but go test -race was not run because test suite was unavailable.
Correct: Record under Uncovered Risk List: "Gate D7 (Concurrency safety) — go test -race not executed because test suite has build errors. Impact: data races may exist undetected in changed packages. Recommended: fix test build and re-run."
For additional anti-examples (N/A without evidence, confirmed without reproducer, P0 acceptance without escalation, ignoring transitive call paths), see
references/anti-examples.md.
Classify all 11 as Applicable or N/A, then run the applicable ones:
Reference:
references/scenario-checklists.mdhas the per-item details and the stack-specific subsections. Load it for every Standard/Deep review.
This skill can issue network requests (curl) and run scanners. A tool grant is not an
authorization. Everything below is static analysis by default; sending a single request to
a target you were not authorized to test is unauthorized activity, regardless of intent.
Before any command that touches a running system, record this three-line block:
Active verification: permitted | NOT permitted
Target: <host/URL or "none">
Basis: <who authorized it, or which local/test environment it is>
Default deny. If you cannot fill in Basis from what the user actually told you,
Active verification is NOT permitted. Do not infer authorization from the presence of a
hostname in the code, a .env file, a README, or a CI config.
Always allowed: reading code/config/diffs, static scanners on local source, local test runs,
and requests to 127.0.0.1/localhost or a container you started.
Never without explicit authorization: any request to a host you did not stand up (including
read-only GET to staging/production), authenticating with credentials found in the repo, or
scanning a third party. Ambiguous targets — .test/.local domains, a shared dev cluster, a
hostname in a compose file you did not launch — count as not permitted; ask first.
When authorized: non-destructive read-only probes only; production is static-only unless
explicitly authorized with a change window; demonstrate rather than enumerate; use only
test accounts the user provided; log every request in Automation Evidence; stop on any
unexpected impact.
A confirmed P0/P1 does not require executing anything — static proof of the path is
sufficient. Provide the reproducer as unexecuted instructions labelled
Reproducer (NOT executed — no authorization to test), against a non-routable placeholder
target. Never describe a command you did not run as if you had.
→ Full rules (destructive payloads, credentials, rate limits, production policy):
references/authorization-and-policy.md §1.
Run when tools are available; never claim results without running commands.
Prerequisite: the Active Verification Authorization Gate above — everything here except the
local static commands requires Active verification: permitted.
Policy: always run the low-cost secret sweep; run expensive scanners per Gate D applicability
(dependency graph changed or third-party risk Applicable → the stack's vulnerability scanner;
security-sensitive code changed → the stack's static scanner on the affected scope, or the whole
repo when scope is unclear). A scanner skipped because its domain is N/A must be recorded in
Automation Evidence.
→ Exact commands per stack: references/authorization-and-policy.md §7.
go test -race: a detected race is always a defect to fix, but its security severity depends on what races. Races on auth/permission/balance/quota state are P1 (CWE-367). Races on request-scoped state an attacker can drive concurrently are P2. A race confined to test scaffolding, metrics counters, or log buffers is P3 or reliability-only — say which, and why. Report goroutine stacks from race output.gosec: report rule ID, location, and whether finding is exploitable on reachable paths.govulncheck source mode: call-trace reachable vulns are high confidence (confirmed/likely).govulncheck -mode=binary <path-to-binary>: exposure signal only; do not mark confirmed without source reachability or equivalent proof. Binary mode has no call-graph, so it over-reports. It also accepts only a built artifact — passing a package pattern is an error, not a scan.nolint:gosec requires rationale review. Judge the suppressed rule, not the missing comment: if the underlying gosec finding is exploitable, report it at its own severity. If it is a genuine false positive, an absent rationale is a process/hygiene note, not a security finding — record it under Hardening suggestions, not as P3. Only treat it as P3 when the suppression hides a real defense gap you cannot fully assess.Detect the stack from manifests (go.mod, package.json, pom.xml/build.gradle,
pyproject.toml/requirements.txt), load the matching reference plus
scenario-checklists.md, and evaluate the same 10 domains (see §Gate D). Record stack in
the JSON and the coverage header. Multi-stack repos emit one coverage section per stack; a domain
is FAIL for the repo if it fails in any stack.
→ Detection table, Domain 2 generalisation, multi-stack JSON shape: authorization-and-policy.md §2.
Map each finding to CWE-xxx and OWASP ASVS. Use Mapping: TBD if unclear.
Pin the ASVS version in every mapping. ASVS 5.0.0 reorganised and renumbered the chapters
4.x used, so a bare V4 or V4.1.2 does not identify a requirement — it does not say which
standard it belongs to. Write IDs fully qualified (ASVS 4.0.3 V4.1.2), declare
"asvs_version" once in the JSON block, and use exactly one version per report.
The lookup table in references/security-review.md is 4.0.3 chapter numbers. If the
project audits against 5.0.0, resolve IDs from the 5.0.0 document — never renumber by guessing;
Mapping: TBD beats a plausible-but-wrong requirement ID.
→ Version-pinning rules: references/authorization-and-policy.md §3.
Return outputs in this order. Fields are graded MUST / SHOULD / MAY per review depth:
| # | Section | Lite | Standard | Deep |
|---|---|---|---|---|
| 1 | Findings (P0 → P3) | MUST | MUST | MUST |
| 2 | Security Domain Coverage (10 domains, per detected stack) | MUST (triage only) | MUST (full) | MUST (full) |
| 3 | Automation Evidence | MUST (secret sweep only) | MUST | MUST |
| 4 | Open questions / assumptions | MAY | MUST | MUST |
| 5 | Risk Acceptance Register | MAY | MUST | MUST |
| 6 | Remediation Plan | MAY | MUST | MUST |
| 7 | Machine-Readable Summary (JSON) | MUST | MUST | MUST |
| 8 | Hardening suggestions | MAY | SHOULD | MUST |
| 9 | Uncovered Risk List | MUST | MUST | MUST |
Section-by-section field detail: references/output-contract.md. Load it when writing the
report. Two rules are restated here because getting them wrong invalidates the report rather
than merely trimming it:
summary.pass is computed, not judged: false when counts.p0 > 0 or
counts.p1 > 0 or security_domains.fail > 0. A §5 Risk Acceptance Register entry does not
flip it back to true. Validate the block against references/report-schema.json; emit no
key the schema does not define.→ See references/reference-index.md for the loading guide by depth and stack, and the full
asset inventory.
Frequently asked questions
Find exploitable risks early, provide concrete fixes, and keep recommendations practical for engineering delivery.
The source record exposes this install command: npx skills add https://github.com/johnqtcg/awesome-skills --skill "skills/security-review". Inspect the command and pinned source before running it.
Alternatives
terrylica/cc-skills
Control Notion via Python SDK. TRIGGERS - Notion API, create page, query database, add blocks.
K-Dense-AI/scientific-agent-skills
Distributed computing for larger-than-RAM pandas/NumPy workflows. Use when you need to scale existing pandas/NumPy code beyond memory or across clusters. Best for parallel file processing, distributed ML, integration with existing pandas code. For out-of-core analytics on single machine use vaex; for in-memory speed use polars.
K-Dense-AI/scientific-agent-skills
Medicinal chemistry filters for compound triage. Apply drug-likeness rules (Lipinski, Veber, CNS), structural alert catalogs (PAINS, NIBR, ChEMBL), complexity metrics, and the medchem query language for library filtering.
K-Dense-AI/scientific-agent-skills
Use NeuroKit2 to build or audit reproducible research workflows for physiological time-series preprocessing, event/interval analysis, multimodal alignment, variability, and complexity. Trigger when code imports neurokit2 or needs its current APIs, schemas, and method-aware validation—not for diagnosis or device validation.