Security Code Review
Perform a thorough security review of the changes in a GitHub PR or issue, producing a structured report with per-category verdicts.
Prerequisites
gh (GitHub CLI) must be installed and authenticated.
git must be available.
- Network access to clone repositories and fetch PR metadata.
When to Use
- Reviewing a pull request before merge for security vulnerabilities.
- Triaging a GitHub issue that reports a potential security flaw.
- Auditing code changes for hardcoded secrets, injection flaws, auth bypasses, or insecure configurations.
Step 1: Parse the GitHub URL
If the user provided a PR or issue URL, extract the owner, repo, and number. If not, ask for one.
Supported URL formats:
https://github.com/OWNER/REPO/pull/NUMBER
https://github.com/OWNER/REPO/issues/NUMBER
Step 2: Check Out the Code
Determine whether you are already in the target repository (compare gh repo view --json nameWithOwner -q .nameWithOwner against the URL). If you are:
gh pr checkout <number>
If reviewing a different repo, clone it to a temporary directory first:
TMPDIR=$(mktemp -d)
gh repo clone OWNER/REPO "$TMPDIR"
cd "$TMPDIR"
gh pr checkout <number>
Step 3: Identify Changed Files
List all files changed relative to the base branch:
git diff main...HEAD --name-status
If the PR targets a branch other than main, use the correct base. Check with:
gh pr view <number> --json baseRefName -q .baseRefName
Step 4: Read Every Changed File and Diff
Read the full content of each changed file and the diff for that file:
git diff main...HEAD -- <file>
For large PRs (more than 30 changed files), prioritize files in this order:
- Files that handle authentication, authorization, or credentials.
- Files that process user input (API handlers, CLI argument parsing, URL parsing).
- Configuration files (Dockerfiles, YAML policies, environment configs).
- New dependencies (package.json, requirements.txt, go.mod changes).
- Everything else.
Step 5: Analyze Against the Security Checklist
For each of the 9 categories below, assign a verdict:
- PASS — no issues found (brief justification).
- WARNING — potential concern (describe risk and suggested fix).
- FAIL — confirmed vulnerability (describe impact, severity, and remediation).
Category 1: Secrets and Credentials
- No hardcoded secrets, API keys, passwords, tokens, or connection strings in code, configs, or test fixtures.
- No secrets committed to version control (check for
.env files, PEM/key files, credential JSON).
- Tokens and credentials passed via environment variables or secret stores, not string literals.
Category 2: Input Validation and Data Sanitization
- All user-controlled inputs (APIs, forms, URLs, headers, query params, file uploads) are validated against an allowlist of expected types, lengths, and formats.
- Proper encoding and escaping to prevent XSS, SQL injection, command injection, path traversal, and SSRF.
- Deserialization of untrusted data uses safe parsers (no
pickle.loads, yaml.unsafe_load, eval, new Function, or similar).
Category 3: Authentication and Authorization
- All new or modified endpoints enforce authentication before processing requests.
- Authorization logic ensures users can only access or modify resources they own or are permitted to use.
- No privilege escalation paths (horizontal or vertical).
- Token validation (expiry, signature, scope) is correctly implemented.
Category 4: Dependencies and Third-Party Libraries
- Newly added dependencies checked for known CVEs (OSV, Snyk, GitHub Advisory DB).
- Dependencies pinned to specific, secure versions (no floating ranges in production).
- OSS license compatibility not violated.
- Dependencies pulled from trusted registries only.
Category 5: Error Handling and Logging
- Error responses do not leak stack traces, internal paths, or sensitive data.
- Logging does not record secrets, tokens, passwords, or PII.
- Exceptions caught at appropriate boundaries; no unhandled crashes that expose state.
Category 6: Cryptography and Data Protection
- Standard, up-to-date algorithms (AES-256-GCM, RSA-2048+, SHA-256+).
- No MD5 or SHA-1 for security purposes. No custom cryptography.
- Sensitive data encrypted at rest and in transit where applicable.
Category 7: Configuration and Security Headers
- Secure defaults (debug mode off, restrictive permissions, minimal port exposure).
- If HTTP endpoints are present: CSP and CORS configured correctly. No wildcard origins in authenticated contexts.
- Container images use non-root users, minimal base images, and pinned digests.
Category 8: Security Testing
- Tests cover security edge cases: malicious input, boundary values, unauthorized access attempts.
- Existing security test coverage not degraded by the change.
- Negative test cases verify that forbidden actions are denied.
Category 9: Holistic Security Posture
- Changes do not degrade overall security posture.
- No false sense of security (client-only validation, incomplete checks).
- Least privilege followed for code, services, and users.
- No TOCTOU race conditions in security-critical paths.
- No unsafe concurrency that bypasses security checks.
Step 6: Produce the Report
Structure the output as follows:
Verdict
One paragraph summarizing the overall risk assessment and whether the PR is safe to merge.
Findings Table
One row per finding:
| # |
Category |
Severity |
File:Line |
Description |
Recommendation |
If no findings, state explicitly that the review is clean.
Detailed Analysis
Per-category breakdown (categories 1 through 9), each with its PASS, WARNING, or FAIL verdict and justification.
Files Reviewed
List every file analyzed.
Important Notes
- If the PR has no changed files or is a draft with no code, state that and skip the analysis.
- For NemoClaw PRs, pay special attention to sandbox escape vectors: SSRF bypasses, Dockerfile injection, network policy circumvention, credential leakage, and blueprint tampering.
- Do not skip categories. If a category is not applicable to the changes (e.g., no cryptography involved), mark it PASS with "Not applicable — no cryptographic operations in this change."
- When in doubt about severity, err on the side of WARNING rather than PASS.
1---2name: nemoclaw-maintainer-security-code-review3description: Performs a comprehensive security review of code changes in a GitHub PR or issue. Checks out the branch, analyzes changed files against a 9-category security checklist, and produces PASS/WARNING/FAIL verdicts. Use when reviewing pull requests for security vulnerabilities, hardcoded secrets, injection flaws, auth bypasses, or insecure configurations. Trigger keywords - security review, code review, appsec, vulnerability assessment, security audit, review PR security.4---5
6# Security Code Review
7
8Perform a thorough security review of the changes in a GitHub PR or issue, producing a structured report with per-category verdicts.
9
10## Prerequisites
11
12- `gh` (GitHub CLI) must be installed and authenticated.
13- `git` must be available.
14- Network access to clone repositories and fetch PR metadata.
15
16## When to Use
17
18- Reviewing a pull request before merge for security vulnerabilities.
19- Triaging a GitHub issue that reports a potential security flaw.
20- Auditing code changes for hardcoded secrets, injection flaws, auth bypasses, or insecure configurations.
21
22## Step 1: Parse the GitHub URL
23
24If the user provided a PR or issue URL, extract the owner, repo, and number. If not, ask for one.
25
26Supported URL formats:
27
28- `https://github.com/OWNER/REPO/pull/NUMBER`
29- `https://github.com/OWNER/REPO/issues/NUMBER`
30
31## Step 2: Check Out the Code
32
33Determine whether you are already in the target repository (compare `gh repo view --json nameWithOwner -q .nameWithOwner` against the URL). If you are:
34
35```bash
36gh pr checkout <number>
37```
38
39If reviewing a different repo, clone it to a temporary directory first:
40
41```bash
42TMPDIR=$(mktemp -d)
43gh repo clone OWNER/REPO "$TMPDIR"
44cd "$TMPDIR"
45gh pr checkout <number>
46```
47
48## Step 3: Identify Changed Files
49
50List all files changed relative to the base branch:
51
52```bash
53git diff main...HEAD --name-status
54```
55
56If the PR targets a branch other than `main`, use the correct base. Check with:
57
58```bash
59gh pr view <number> --json baseRefName -q .baseRefName
60```
61
62## Step 4: Read Every Changed File and Diff
63
64Read the full content of each changed file and the diff for that file:
65
66```bash
67git diff main...HEAD -- <file>
68```
69
70For large PRs (more than 30 changed files), prioritize files in this order:
71
721. Files that handle authentication, authorization, or credentials.
732. Files that process user input (API handlers, CLI argument parsing, URL parsing).
743. Configuration files (Dockerfiles, YAML policies, environment configs).
754. New dependencies (package.json, requirements.txt, go.mod changes).
765. Everything else.
77
78## Step 5: Analyze Against the Security Checklist
79
80For each of the 9 categories below, assign a verdict:
81
82- **PASS** — no issues found (brief justification).
83- **WARNING** — potential concern (describe risk and suggested fix).
84- **FAIL** — confirmed vulnerability (describe impact, severity, and remediation).
85
86### Category 1: Secrets and Credentials
87
88- No hardcoded secrets, API keys, passwords, tokens, or connection strings in code, configs, or test fixtures.
89- No secrets committed to version control (check for `.env` files, PEM/key files, credential JSON).
90- Tokens and credentials passed via environment variables or secret stores, not string literals.
91
92### Category 2: Input Validation and Data Sanitization
93
94- All user-controlled inputs (APIs, forms, URLs, headers, query params, file uploads) are validated against an allowlist of expected types, lengths, and formats.
95- Proper encoding and escaping to prevent XSS, SQL injection, command injection, path traversal, and SSRF.
96- Deserialization of untrusted data uses safe parsers (no `pickle.loads`, `yaml.unsafe_load`, `eval`, `new Function`, or similar).
97
98### Category 3: Authentication and Authorization
99
100- All new or modified endpoints enforce authentication before processing requests.
101- Authorization logic ensures users can only access or modify resources they own or are permitted to use.
102- No privilege escalation paths (horizontal or vertical).
103- Token validation (expiry, signature, scope) is correctly implemented.
104
105### Category 4: Dependencies and Third-Party Libraries
106
107- Newly added dependencies checked for known CVEs (OSV, Snyk, GitHub Advisory DB).
108- Dependencies pinned to specific, secure versions (no floating ranges in production).
109- OSS license compatibility not violated.
110- Dependencies pulled from trusted registries only.
111
112### Category 5: Error Handling and Logging
113
114- Error responses do not leak stack traces, internal paths, or sensitive data.
115- Logging does not record secrets, tokens, passwords, or PII.
116- Exceptions caught at appropriate boundaries; no unhandled crashes that expose state.
117
118### Category 6: Cryptography and Data Protection
119
120- Standard, up-to-date algorithms (AES-256-GCM, RSA-2048+, SHA-256+).
121- No MD5 or SHA-1 for security purposes. No custom cryptography.
122- Sensitive data encrypted at rest and in transit where applicable.
123
124### Category 7: Configuration and Security Headers
125
126- Secure defaults (debug mode off, restrictive permissions, minimal port exposure).
127- If HTTP endpoints are present: CSP and CORS configured correctly. No wildcard origins in authenticated contexts.
128- Container images use non-root users, minimal base images, and pinned digests.
129
130### Category 8: Security Testing
131
132- Tests cover security edge cases: malicious input, boundary values, unauthorized access attempts.
133- Existing security test coverage not degraded by the change.
134- Negative test cases verify that forbidden actions are denied.
135
136### Category 9: Holistic Security Posture
137
138- Changes do not degrade overall security posture.
139- No false sense of security (client-only validation, incomplete checks).
140- Least privilege followed for code, services, and users.
141- No TOCTOU race conditions in security-critical paths.
142- No unsafe concurrency that bypasses security checks.
143
144## Step 6: Produce the Report
145
146Structure the output as follows:
147
148### Verdict
149
150One paragraph summarizing the overall risk assessment and whether the PR is safe to merge.
151
152### Findings Table
153
154One row per finding:
155
156| # | Category | Severity | File:Line | Description | Recommendation |
157|---|----------|----------|-----------|-------------|----------------|
158
159If no findings, state explicitly that the review is clean.
160
161### Detailed Analysis
162
163Per-category breakdown (categories 1 through 9), each with its PASS, WARNING, or FAIL verdict and justification.
164
165### Files Reviewed
166
167List every file analyzed.
168
169## Important Notes
170
171- If the PR has no changed files or is a draft with no code, state that and skip the analysis.
172- For NemoClaw PRs, pay special attention to sandbox escape vectors: SSRF bypasses, Dockerfile injection, network policy circumvention, credential leakage, and blueprint tampering.
173- Do not skip categories. If a category is not applicable to the changes (e.g., no cryptography involved), mark it PASS with "Not applicable — no cryptographic operations in this change."
174- When in doubt about severity, err on the side of WARNING rather than PASS.