Security Audit Checklist
Comprehensive security vulnerability checklists organized by severity with quantified point deductions for code review scoring.
Quick Start
Full security audit:
Run a complete security audit using the OWASP Top 10 checklist with severity scoring.
Language-specific scan:
Check this Node.js codebase for injection vulnerabilities and authentication issues.
Severity Classification
| Severity | Multiplier | Point Range | Response Time |
|---|---|---|---|
| Critical | 2.0x | 2.0-4.0 | Immediate (block deploy) |
| High | 1.5x | 1.0-2.0 | 24 hours |
| Medium | 1.0x | 0.5-1.0 | 1 week |
| Low | 0.5x | 0.25-0.5 | Next sprint |
Critical Vulnerabilities (P0)
SQL Injection
Base Deduction: 2.0 points | Severity: Critical (2.0x) | Total: 4.0 points
Detection Commands:
# String interpolation in queries
grep -rn "\`SELECT.*\${" src/
grep -rn "\"SELECT.*\" \+" src/
grep -rn "query.*\`.*\${" src/
grep -rn "execute.*f\"" src/ # Python f-strings
# Raw queries without parameterization
grep -rn "\.raw\(" src/
grep -rn "\.rawQuery\(" src/
grep -rn "createQuery.*\+" src/ # Java JPA
Evidence Template:
Location: {file}:{line}
Pattern: Unparameterized SQL with user input
Measurement: {count} injection vectors
Impact: Full database compromise, data exfiltration
Remote Code Execution (RCE)
Base Deduction: 2.0 points | Severity: Critical (2.0x) | Total: 4.0 points
Detection Commands:
# Command injection
grep -rn "exec\(" src/
grep -rn "eval\(" src/
grep -rn "spawn.*shell.*true" src/
grep -rn "subprocess.*shell=True" src/
grep -rn "os\.system\(" src/
# Unsafe deserialization
grep -rn "pickle\.loads\(" src/
grep -rn "yaml\.load\(" src/ | grep -v "safe_load"
grep -rn "ObjectInputStream" src/
grep -rn "unserialize\(" src/
Evidence Template:
Location: {file}:{line}
Pattern: {exec|eval|deserialization} with user-controlled input
Measurement: {count} RCE vectors
Impact: Complete server compromise, lateral movement
Hardcoded Secrets
Base Deduction: 2.0 points | Severity: Critical (2.0x) | Total: 4.0 points
Detection Commands:
# API keys and tokens
grep -rn "AKIA[0-9A-Z]{16}" src/
grep -rn "sk_live_" src/
grep -rn "gh[pousr]_[A-Za-z0-9_]" src/
grep -rn "xox[baprs]-" src/
# Generic patterns
grep -rn "password\s*=\s*['\"]" src/
grep -rn "api_key\s*=\s*['\"]" src/
grep -rn "secret\s*=\s*['\"]" src/
grep -rn "token\s*=\s*['\"][^'\"]*['\"]" src/
# Private keys
grep -rn "BEGIN.*PRIVATE KEY" src/
grep -rn "BEGIN RSA PRIVATE" src/
Evidence Template:
Location: {file}:{line}
Pattern: {AWS key|Stripe key|generic secret} hardcoded
Measurement: {count} secrets exposed
Impact: Credential theft, financial fraud, account takeover
Authentication Bypass
Base Deduction: 2.0 points | Severity: Critical (2.0x) | Total: 4.0 points
Detection Commands:
# Missing auth middleware
grep -rn "app\.\(get\|post\|put\|delete\)" src/ | grep -v "auth\|protect\|require"
# JWT issues
grep -rn "algorithm.*none" src/
grep -rn "verify.*false" src/
grep -rn "ignoreExpiration.*true" src/
# Session issues
grep -rn "session\.secret.*=.*['\"]" src/
grep -rn "secure.*false" src/ | grep -i cookie
Evidence Template:
Location: {file}:{line}
Pattern: {missing auth check|weak JWT|insecure session}
Measurement: {count} unprotected endpoints
Impact: Unauthorized access, privilege escalation
High Vulnerabilities (P1)
Cross-Site Scripting (XSS)
Base Deduction: 1.5 points | Severity: High (1.5x) | Total: 2.25 points
Detection Commands:
# React dangerouslySetInnerHTML
grep -rn "dangerouslySetInnerHTML" src/
# Template injection
grep -rn "<%- " src/ # EJS unescaped
grep -rn "\|safe" src/ # Django/Jinja unescaped
grep -rn "v-html" src/ # Vue
grep -rn "{!! " src/ # Laravel Blade
# DOM manipulation
grep -rn "\.innerHTML\s*=" src/
grep -rn "document\.write\(" src/
Evidence Template:
Location: {file}:{line}
Pattern: {dangerouslySetInnerHTML|innerHTML|unescaped template}
Measurement: {count} XSS vectors
Impact: Session hijacking, credential theft, defacement
Insecure Direct Object Reference (IDOR)
Base Deduction: 1.5 points | Severity: High (1.5x) | Total: 2.25 points
Detection Commands:
# Direct ID usage without ownership check
grep -rn "params\.id\|req\.params\.id" src/
grep -rn "findById.*req\.params" src/
grep -rn "findOne.*id.*=.*req" src/
# Check if ownership validation exists nearby
Audit Questions:
- Does every resource access check ownership?
- Are UUIDs used instead of sequential IDs?
- Is there row-level security in the database?
Server-Side Request Forgery (SSRF)
Base Deduction: 1.5 points | Severity: High (1.5x) | Total: 2.25 points
Detection Commands:
# URL from user input
grep -rn "fetch\(.*req\." src/
grep -rn "axios\.\(get\|post\).*req\." src/
grep -rn "requests\.get\(.*request\." src/
grep -rn "http\.get\(.*params" src/
# Redirects
grep -rn "redirect\(.*req\." src/
Evidence Template:
Location: {file}:{line}
Pattern: HTTP request with user-controlled URL
Measurement: {count} SSRF vectors
Impact: Internal network scanning, cloud metadata access
Missing Rate Limiting
Base Deduction: 1.0 points | Severity: High (1.5x) | Total: 1.5 points
Detection Commands:
# Check for rate limiter middleware
grep -rn "rateLimit\|rate-limit\|RateLimiter" src/
# Sensitive endpoints without rate limiting
grep -rn "login\|register\|password\|forgot\|reset" src/routes/
Audit Questions:
- Are login endpoints rate-limited?
- Is password reset rate-limited?
- Are API endpoints throttled per user?
Medium Vulnerabilities (P2)
Missing Input Validation
Base Deduction: 0.75 points | Severity: Medium (1.0x) | Total: 0.75 points
Detection Commands:
# Direct body/query usage without validation
grep -rn "req\.body\." src/ | head -20
grep -rn "req\.query\." src/ | head -20
grep -rn "request\.json\(\)" src/
# Check for validation libraries
grep -rn "zod\|yup\|joi\|validator\|pydantic" package.json src/
Weak Cryptography
Base Deduction: 0.75 points | Severity: Medium (1.0x) | Total: 0.75 points
Detection Commands:
# Weak hash algorithms
grep -rn "md5\|MD5" src/
grep -rn "sha1\|SHA1" src/ | grep -v "sha1.*integrity"
# Weak encryption
grep -rn "DES\|3DES\|RC4\|ECB" src/
# Insecure random
grep -rn "Math\.random\(\)" src/
grep -rn "random\.random\(\)" src/
Missing Security Headers
Base Deduction: 0.5 points | Severity: Medium (1.0x) | Total: 0.5 points
Required Headers Checklist:
-
Content-Security-Policy -
X-Content-Type-Options: nosniff -
X-Frame-Options: DENY -
Strict-Transport-Security -
Referrer-Policy -
Permissions-Policy
Detection Commands:
# Check for helmet or manual headers
grep -rn "helmet\|setHeader.*Content-Security" src/
grep -rn "X-Frame-Options\|X-Content-Type" src/
CORS Misconfiguration
Base Deduction: 0.5 points | Severity: Medium (1.0x) | Total: 0.5 points
Detection Commands:
# Dangerous CORS patterns
grep -rn "origin.*\*\|origin.*true" src/
grep -rn "Access-Control-Allow-Origin.*\*" src/
grep -rn "credentials.*true" src/ | grep -i cors
# Check for origin reflection
grep -rn "origin.*req\.headers\.origin" src/
Low Vulnerabilities (P3)
Verbose Error Messages
Base Deduction: 0.25 points | Severity: Low (0.5x) | Total: 0.125 points
Detection Commands:
# Stack traces exposed
grep -rn "error\.stack\|err\.stack" src/
grep -rn "res\.send.*error\|res\.json.*error" src/
# Debug mode in production
grep -rn "DEBUG.*true\|debug.*=.*true" src/
Missing Audit Logging
Base Deduction: 0.25 points | Severity: Low (0.5x) | Total: 0.125 points
Audit Questions:
- Are authentication events logged?
- Are authorization failures logged?
- Are sensitive data access events logged?
- Do logs include user ID, action, timestamp, IP?
Outdated Dependencies
Base Deduction: 0.25-1.0 points | Severity: Varies
Detection Commands:
# NPM security audit
npm audit --json 2>/dev/null | jq '.metadata.vulnerabilities'
# Check for outdated
npm outdated 2>/dev/null
# Python
pip-audit 2>/dev/null
safety check 2>/dev/null
Scoring:
| CVE Severity | Deduction |
|---|---|
| Critical | 1.0 per CVE |
| High | 0.5 per CVE |
| Medium | 0.25 per CVE |
| Low | 0.1 per CVE |
Language-Specific Checklists
Node.js/JavaScript
See references/nodejs-security.md for:
- Prototype pollution patterns
- Event emitter leaks
- Path traversal in file serving
- Child process injection
- Regular expression DoS (ReDoS)
Python
See references/python-security.md for:
- Pickle/YAML deserialization
- Template injection (Jinja2, Django)
- OS command injection
- Path traversal
Go
See references/go-security.md for:
- SQL injection with database/sql
- Path traversal in http.FileServer
- Race conditions
- Unsafe pointer usage
Java
See references/java-security.md for:
- XXE in XML parsers
- Deserialization gadget chains
- JNDI injection
- Expression Language injection
Audit Report Template
## Security Audit Summary
| Severity | Count | Total Deduction |
|----------|-------|-----------------|
| Critical | {n} | {n * 4.0} |
| High | {n} | {n * 2.25} |
| Medium | {n} | {n * 0.75} |
| Low | {n} | {n * 0.125} |
| **Total** | **{sum}** | **{sum} points** |
### Critical Findings (P0)
#### Finding 1: {Title}
| Field | Value |
|-------|-------|
| Location | `{file}:{line}` |
| Vulnerability | {type} |
| OWASP | A0{n}:{name} |
| CVSS | {score} |
| Deduction | {points} |
**Evidence:**
```{lang}
{code snippet}
Remediation: {specific fix with code example}
{Repeat for all findings}
## Integration with Brutal Reviewer
This skill provides the Security category scoring for the brutal-reviewer agent:
- **Weight:** 12% of total score
- **Maximum Deduction:** 9.0 points (capped)
- **Grade Thresholds:**
- A: 0 critical, 0 high
- B: 0 critical, 1-2 high
- C: 0 critical, 3+ high OR 1 critical (fixed quickly)
- D: 1-2 critical
- F: 3+ critical OR any actively exploitable