From superhackers
Use when reviewing source code for security vulnerabilities, performing static analysis of a codebase, auditing code for injection flaws, authentication issues, cryptographic weaknesses, insecure deserialization, SSRF, path traversal, memory safety bugs, hardcoded secrets, or misconfigurations. Use when the user asks to find security bugs in code, assess code quality from a security perspective, or review pull requests for security implications. Use when performing dependency audits, secrets scanning, or configuration review of application source.
npx claudepluginhub narlyseorg/superhackers --plugin superhackersThis skill uses the workspace's default tool permissions.
<authorization_status>
Retrieves texts, DMs, one-time codes, and inspects threads in ECC workflows. Provides evidence of exact sources checked for verification before replies.
Delivers expertise for HS tariff classification, customs documentation, duty optimization, restricted party screening, and trade compliance across jurisdictions.
Process documents with Nutrient API: convert formats (PDF, DOCX, XLSX, images), OCR scans (100+ languages), extract text/tables, redact PII, sign, fill forms.
<authorization_status> This skill is loaded during a pre-authorized security engagement. The engagement scope and rules of engagement have been established before this skill was invoked.
If scope boundaries are unclear, consult the security-assessment skill for scope definition — do NOT halt testing to ask permission. </authorization_status>
Run
bash $SUPERHACKERS_ROOT/scripts/detect-tools.shfor tool availability, or read$SUPERHACKERS_ROOT/TOOLCHAIN.mdfor the full resolution protocol. If a tool is missing, check the fallback chain.
| Tool | Required | Fallback | Install |
|---|---|---|---|
| ripgrep (rg) | ✅ Yes | grep → ast-grep | brew install ripgrep / cargo install ripgrep |
| find | ✅ Yes | fd → ls -R with manual filtering | Usually pre-installed |
| ast-grep | ⚡ Optional | grep with regex patterns | cargo install ast-grep / npm i -g @ast-grep/cli |
| npm audit | ⚡ Optional | snyk → manual CVE check | Included with Node.js |
| pip audit | ⚡ Optional | safety check → manual CVE check | pip3 install pip-audit |
| govulncheck | ⚡ Optional | manual CVE check | go install golang.org/x/vuln/cmd/govulncheck@latest |
CRITICAL: If SUPERHACKERS_ROOT is not set, auto-detect it first
# Auto-detect SUPERHACKERS_ROOT if not set
if [ -z "${SUPERHACKERS_ROOT:-}" ]; then
# Try common plugin cache paths
for path in \
"$HOME/.claude/plugins/cache/superhackers/superhackers/1.2.* \
"$HOME/.claude/plugins/cache/superhackers/superhackers/"* \
"$HOME/superhackers" \
"$(pwd)/superhackers"; do
if [ -d "$path" ] && [ -f "$path/scripts/detect-tools.sh" ]; then
export SUPERHACKERS_ROOT="$path"
echo "Auto-detected SUPERHACKERS_ROOT=$SUPERHACKERS_ROOT"
break
fi
done
fi
# Verify detection worked
if [ -z "${SUPERHACKERS_ROOT:-}" ] || [ ! -f "$SUPERHACKERS_ROOT/scripts/detect-tools.sh" ]; then
echo "ERROR: SUPERHACKERS_ROOT not set and auto-detection failed"
echo "Please set: export SUPERHACKERS_ROOT=/path/to/superhackers"
return 1
fi
MANDATORY: All code scanning commands MUST follow this protocol:
Pre-scan tool verification
# Check if ripgrep is available before large scans
if ! command -v rg >/dev/null 2>&1; then
echo "FALLBACK: ripgrep not found, using grep"
SCAN_TOOL="grep"
else
SCAN_TOOL="rg"
fi
echo "Using: $SCAN_TOOL for pattern matching"
Pattern scanning with validation
# Scan for secrets with output validation
echo "Scanning for hardcoded secrets..."
OUTPUT=$($SCAN_TOOL -ri "password|apikey|secret|token" . --include="*.py" --include="*.js" 2>&1)
EXIT_CODE=$?
if [ $EXIT_CODE -eq 0 ]; then
FINDING_COUNT=$(echo "$OUTPUT" | wc -l)
echo "SUCCESS: Found $FINDING_COUNT potential secret references"
if [ "$FINDING_COUNT" -gt 0 ]; then
echo "Sample findings:"
echo "$OUTPUT" | head -5
fi
elif [ $EXIT_CODE -eq 127 ]; then
echo "TOOL_FAILURE: $SCAN_TOOL not found"
echo "FALLBACK: Manual code review required"
else
echo "INFO: Scan returned exit code $EXIT_CODE"
fi
ast-grep operations with timeout
# ast-grep can hang on large codebases - always use timeout
echo "Running ast-grep for SQL injection patterns..."
if command -v ast-grep >/dev/null 2>&1; then
OUTPUT=$(timeout 60 ast-grep -p '$DB.query(`$$$`)' -l js 2>&1)
EXIT_CODE=$?
if [ $EXIT_CODE -eq 124 ]; then
echo "TOOL_FAILURE: ast-grep timeout (60s)"
echo "FALLBACK: Using ripgrep pattern matching"
rg -l "DB\.query\(|\.rawQuery\(" . -g "*.js"
elif [ $EXIT_CODE -eq 0 ]; then
echo "SUCCESS: ast-grep completed"
echo "Files with SQL patterns: $(echo "$OUTPUT" | wc -l)"
else
echo "INFO: ast-grep returned exit code $EXIT_CODE"
fi
else
echo "INFO: ast-grep not available, using ripgrep patterns"
fi
Dependency audit with validation
# npm audit with validation
if [ -f "package.json" ]; then
echo "Running npm audit..."
OUTPUT=$(timeout 120 npm audit 2>&1)
EXIT_CODE=$?
if [ $EXIT_CODE -eq 0 ]; then
# Check for vulnerabilities
if echo "$OUTPUT" | rg -q "vulnerabilities"; then
VULN_COUNT=$(echo "$OUTPUT" | rg -o "\d+ vulnerabilities" | head -1)
echo "FOUND: $VULN_COUNT vulnerabilities"
else
echo "SUCCESS: No vulnerabilities found"
fi
elif [ $EXIT_CODE -eq 127 ]; then
echo "FALLBACK: npm not found or package.json issue"
echo "Manual dependency review required"
else
echo "INFO: npm audit returned exit code $EXIT_CODE"
fi
fi
Before running any commands in this skill:
- Run
bash $SUPERHACKERS_ROOT/scripts/detect-tools.shif not already run this session- For any ❌ missing tool, use the fallback from the chain above
Role: Source Code Security Auditor — Your job is to find security vulnerabilities through systematic static analysis and code review. Stay in your lane: you analyze code and identify vulnerabilities, you do NOT perform runtime testing or write final reports.
Systematic methodology for identifying security vulnerabilities through source code analysis. This skill focuses on reading and analyzing code — not running exploits against live targets. You will use ripgrep (rg), ast-grep, and direct code reading to find injection flaws, authentication bugs, cryptographic weaknesses, insecure deserialization, SSRF, file handling issues, memory safety bugs, secrets, and misconfigurations.
Position: Phase 3 (Testing, code-focused) — can run independently or after
recon-and-enumerationExpected Input: Source code access, optionally recon deliverable for context on deployed behavior Your Output: Code-level security findings with file:line references, vulnerability traces, and remediation guidance Consumed By:vulnerability-verification(for live confirmation of code-level findings),writing-security-reports(for final report) Critical: You are often the ONLY agent with full source code access. If you miss a vulnerability pattern, no other agent can discover it from runtime testing alone.
Priority order for review: auth → input handling → crypto → config → business logic.
REQUIRED SUB-SKILL: Use superhackers:vulnerability-verification to confirm exploitability of findings. REQUIRED SUB-SKILL: Use superhackers:writing-security-reports to document and report findings.
Apply source-to-sink taint analysis as the primary methodology:
Code review-specific additions:
1. ORIENT → Identify language, framework, architecture, entry points
2. SURFACE → Automated pattern scanning (rg/ast-grep for known-bad patterns)
3. TRACE → Follow user input from source → sink (taint analysis)
4. INSPECT → Deep-dive into auth, crypto, session, config
5. SUPPLY → Dependency and third-party component review
6. SECRETS → Scan for hardcoded credentials, keys, tokens
7. DOCUMENT → Structured findings with severity, evidence, remediation
| Priority | Category | Why |
|---|---|---|
| P0 | Authentication & Authorization | Direct access control bypass |
| P1 | Input Handling & Injection | RCE, SQLi, SSTI, Command injection |
| P1 | Insecure Deserialization | Often leads to RCE |
| P2 | Cryptography | Data exposure, key compromise |
| P2 | SSRF / File Handling | Internal network access, data leaks |
| P3 | Configuration | Missing headers, weak TLS, CORS issues |
| P3 | Secrets in Code | Credential exposure |
| P4 | Business Logic | Requires context-specific analysis |
| Severity | Criteria |
|---|---|
| Critical | RCE, auth bypass, SQLi with data access, hardcoded admin creds |
| High | Stored XSS, SSRF to internal, path traversal with read/write, broken access control |
| Medium | Reflected XSS, CSRF on state-changing ops, weak crypto in use, info disclosure |
| Low | Missing headers, verbose errors, outdated non-vulnerable deps |
| Info | Best practice deviations, code quality issues with security implications |
Identify the language, framework, and architecture before scanning.
Before proceeding to advanced analysis, pause and verify:
If any answer reveals a problem, reassess before continuing.
# Identify languages and frameworks
find . -type f -name "*.py" -o -name "*.js" -o -name "*.ts" -o -name "*.java" -o -name "*.go" -o -name "*.php" -o -name "*.rb" -o -name "*.c" -o -name "*.cpp" | head -50
# Check for framework indicators
ls -la package.json requirements.txt Gemfile go.mod pom.xml composer.json Cargo.toml 2>/dev/null
# Map entry points — routes, controllers, API endpoints
rg -l "app\.(get|post|put|delete|patch|all|use)" -g "*.js" -g "*.ts"
rg -l "@app\.route|@blueprint\.route|@api\.route" -g "*.py"
rg -l "@RequestMapping|@GetMapping|@PostMapping" -g "*.java"
rg -l "func.*Handler|http\.HandleFunc|r\.HandleFunc" -g "*.go"
# Identify authentication/authorization middleware
rg -l "authenticate|authorize|isAdmin|requireAuth|protect|guard|middleware"
# Find database interaction patterns
rg -l "query|execute|rawQuery|raw\(|cursor\.|db\.|sql\."
# Locate file upload handlers
rg -l "upload|multipart|multer|FileUpload|formidable"
Map the attack surface:
Run rg/ast-grep scans for known dangerous patterns. Work through each category systematically.
# String concatenation in SQL queries (all languages)
rg "SELECT.*+.*\"|INSERT.*+.*\"|UPDATE.*+.*\"|DELETE.*+.*\"" -g "*.js" -g "*.ts" -g "*.py" -g "*.java" -g "*.php" -g "*.rb"
# Python f-strings / format strings in SQL
rg "execute.*f\"|execute.*\.format|execute.*%" -g "*.py"
# Node.js raw queries
rg "\.query\s*\(.*\`|\.query\s*\(.*\+" -g "*.js" -g "*.ts"
# Java string concat in SQL
rg "Statement.*execute.*+|createQuery.*+|createNativeQuery.*+" -g "*.java"
# PHP unsafe queries
rg "mysql_query|mysqli_query.*\\\$|pg_query.*\\\$" -g "*.php"
# ast-grep: Find template literal SQL in JavaScript/TypeScript
# Pattern: db.query(`SELECT ... ${userInput}`)
ast-grep -p '$DB.query(`$$$`)' -l js
ast-grep -p '$DB.query(`$$$`)' -l ts
# Direct command execution with user input
rg -l "exec\(|execSync|spawn|child_process|shell_exec|system\(|popen|proc_open|passthru" -g "*.js" -g "*.ts" -g "*.php"
rg -l "subprocess\.|os\.system|os\.popen|commands\.|Popen" -g "*.py"
rg -l "Runtime\.getRuntime\(\)\.exec|ProcessBuilder" -g "*.java"
rg -l "exec\.Command|os/exec" -g "*.go"
rg -l "system\(|popen|exec\(|backtick|\`.*\\\$" -g "*.rb"
# ast-grep: exec() calls in JavaScript
ast-grep -p 'exec($CMD)' -l js
ast-grep -p 'execSync($CMD)' -l js
# Server-side template rendering with user input
rg -l "render_template_string|Template\(|Environment\(" -g "*.py"
rg -l "eval|new Function|vm\.runInNewContext|vm\.createContext" -g "*.js" -g "*.ts"
rg -l "render.*string|ERB\.new|Erubis" -g "*.rb"
rg -l "Velocity|Freemarker|Thymeleaf.*\$\{" -g "*.java"
# Jinja2 without autoescape
rg -l "autoescape\s*=\s*False|Markup\(|safe\b" -g "*.py"
# XPath injection
rg -l "xpath|XPathExpression|selectNodes|evaluate.*/" -g "*.java" -g "*.py" -g "*.php"
# LDAP injection
rg -l "ldap\.|LdapContext|search_s|ldap_search|DirectorySearcher" -g "*.py" -g "*.java" -g "*.php" -g "*.cs"
# Hardcoded credentials
rg -l "password\s*=\s*[\"']|passwd\s*=\s*[\"']|secret\s*=\s*[\"']|api_key\s*=\s*[\"']" -g "*.py" -g "*.js" -g "*.ts" -g "*.java" -g "*.go" -g "*.rb" -g "*.php"
# Weak password policy
rg -l "minlength|minLength|min_length|password.*length|\.length\s*[<>=]" -g "*.js" -g "*.ts" -g "*.py" -g "*.java"
# Insecure session configuration
rg -l "httpOnly\s*:\s*false|secure\s*:\s*false|sameSite\s*:\s*[\"']none" -g "*.js" -g "*.ts"
rg -l "SESSION_COOKIE_SECURE\s*=\s*False|SESSION_COOKIE_HTTPONLY\s*=\s*False" -g "*.py"
# Broken auth flows — missing auth checks on routes
rg "app\.(get|post|put|delete)" -g "*.js" -g "*.ts" | rg -v "auth|protect|guard|middleware|login|public|health|static"
# JWT issues
rg -l "algorithms.*none|verify\s*=\s*False|verify:\s*false|alg.*HS256.*RS256|jwt\.decode.*verify" -g "*.py" -g "*.js" -g "*.ts" -g "*.java"
# ast-grep: JWT decode without verification in Python
ast-grep -p 'jwt.decode($TOKEN, options={"verify_signature": False})' -l python
# Weak hashing algorithms
rg "md5|MD5|sha1|SHA1|SHA-1\b" -g "*.py" -g "*.js" -g "*.ts" -g "*.java" -g "*.go" -g "*.php" -g "*.rb" | rg -iv "comment|doc|readme|test.*expected|checksum|integrity|fingerprint|etag"
# Weak encryption (DES, RC4, Blowfish for sensitive data)
rg -l "\bDES\b|DESede|RC4|RC2|Blowfish" -g "*.java" -g "*.py" -g "*.go"
# ECB mode (no semantic security)
rg -l "ECB|MODE_ECB|AES/ECB" -g "*.py" -g "*.java" -g "*.go" -g "*.js"
# Hardcoded keys and IVs
rg "AES\.new|CryptoJS\.AES|Cipher\.getInstance" -g "*.py" -g "*.js" -g "*.java" | rg -i "key\s*=\|iv\s*="
# Insufficient key length
rg -l "keysize|key_size|KeySize|key_length|bits\s*=\s*(512|768|1024)\b" -g "*.py" -g "*.java" -g "*.go"
# Math.random() for security purposes
rg "Math\.random|random\.random|rand\(\)|srand" -g "*.js" -g "*.ts" -g "*.py" -g "*.php" -g "*.rb" | rg -iv "test|mock|seed"
# Missing input validation — direct use of req.body/req.params
rg -l "req\.body\.|req\.params\.|req\.query\.|request\.form|request\.args|request\.json" -g "*.js" -g "*.ts" -g "*.py"
# Prototype pollution (JavaScript/TypeScript)
rg "Object\.assign|merge\(|deepMerge|extend\(|defaultsDeep|\[.*\]\s*=" -g "*.js" -g "*.ts" | rg -i "req|user|input|body|param|query"
# ReDoS — vulnerable regex patterns
rg -l "new RegExp|re\.compile|Pattern\.compile" -g "*.js" -g "*.ts" -g "*.py" -g "*.java"
# Look for patterns with nested quantifiers: (a+)+, (a|b+)*, (a{1,}){1,}
rg "\(.*[+*]\).*[+*]|\[.*\].*[+*].*[+*]" -g "*.js" -g "*.ts" -g "*.py"
# Type confusion / missing type checks
rg "==\s|!=\s" -g "*.js" -g "*.ts" | rg -v "===|!==" | head -30
# ast-grep: Object.assign with user input in JS
ast-grep -p 'Object.assign($TARGET, req.body)' -l js
ast-grep -p 'Object.assign($TARGET, req.body)' -l ts
# Python pickle / yaml
rg -l "pickle\.loads|pickle\.load|cPickle|shelve\.|marshal\.loads" -g "*.py"
rg "yaml\.load|yaml\.unsafe_load|yaml\.full_load" -g "*.py" | rg -v "yaml\.safe_load"
# Java deserialization
rg -l "ObjectInputStream|readObject|readUnshared|XMLDecoder|XStream|fromXML" -g "*.java"
# PHP deserialization
rg -l "unserialize|json_decode.*\\\$" -g "*.php"
# Ruby deserialization
rg "Marshal\.load|YAML\.load\b" -g "*.rb" | rg -v "YAML\.safe_load"
# Node.js deserialization
rg -l "node-serialize|serialize|funcster|cryo" -g "*.js" -g "*.ts"
# ast-grep: pickle.loads in Python
ast-grep -p 'pickle.loads($DATA)' -l python
ast-grep -p 'yaml.load($DATA)' -l python
# Outbound HTTP requests with user-controlled URLs
rg -l "requests\.get|requests\.post|urllib\.request|urlopen|httplib" -g "*.py"
rg -l "fetch\(|axios\.|http\.get|https\.get|request\(|got\(|node-fetch" -g "*.js" -g "*.ts"
rg -l "HttpClient|URL\(|openConnection|HttpURLConnection" -g "*.java"
rg -l "http\.Get|http\.Post|http\.NewRequest|net/http" -g "*.go"
rg -l "curl_exec|file_get_contents|fopen.*http" -g "*.php"
# DNS rebinding risk — check if URL validation only happens once
rg -l "isValidUrl|validateUrl|allowedHosts|whitelist|blocklist" -g "*.py" -g "*.js" -g "*.ts" -g "*.java"
# Direct Host header usage
rg -l "request\.get_host|request\.host|HTTP_HOST|SERVER_NAME" -g "*.py" -g "*.php"
rg -l "req\.host|req\.hostname|getHeader\('host'\)|req\.get\('host'\)" -g "*.js" -g "*.ts"
rg -l "getServerName\(\)|getHeader\(\"Host\"\)" -g "*.java"
# URL generation with Host header
rg -l "build_absolute_uri|base_url|url_for.*_external|request\.url" -g "*.py"
rg -l "baseURL|absoluteUrl|baseUrl.*request" -g "*.js" -g "*.ts"
rg -l "requestURL|getRequestURL|getServerPort\(\)" -g "*.java"
# Redirect with Host header
rg -i "redirect.*host|location.*host|Host.*redirect" -g "*.py" -g "*.js" -g "*.ts" -g "*.java" -g "*.php"
# Proxy header trust (X-Forwarded-*)
rg -l "X-Forwarded-Host|X-Forwarded-Server|X-Real-IP" -g "*.py" -g "*.js" -g "*.ts"
rg -l "USE_X_FORWARDED.*True|trust proxy.*true|TRUSTED_PROXIES" -g "*.py" -g "*.js" -g "*.ts"
# Framework host configuration
rg -l "ALLOWED_HOSTS.*\*|config\.hosts.*\*|allowedHosts.*\*" -g "*.py" -g "*.rb"
rg -l "trust proxy.*true|trustProxy.*true" -g "*.js" -g "*.ts"
# Password reset / email generation with Host
rg -i "reset.*url|email.*url|verification.*url|invite.*url" -g "*.py" -g "*.js" -g "*.ts" | rg -i "host|request"
# CRLF injection risk in Host header parsing
rg -l "split.*\r|\n|header.*split|parse.*header" -g "*.py" -g "*.js" -g "*.ts"
# ast-grep: Host header usage in JavaScript
ast-grep -p 'req.get("host")' -l js
ast-grep -p 'req.host' -l js
ast-grep -p 'req.hostname' -l js
# Path traversal
rg -l "\.\./" -g "*.js" -g "*.ts" -g "*.py" -g "*.java" -g "*.go" -g "*.php"
rg "path\.join|os\.path\.join|Paths\.get" -g "*.js" -g "*.ts" -g "*.py" -g "*.java" | rg -i "req|user|input|param"
rg "sendFile|readFile|createReadStream|open\(" -g "*.js" -g "*.ts" | rg -i "req|user|param"
# Unrestricted file upload
rg -l "upload|multer|formidable|FileUpload|MultipartFile" -g "*.js" -g "*.ts" -g "*.java" -g "*.py"
# Check: Is file type validated? Is filename sanitized? Where are files stored?
# Symlink attacks
rg -l "symlink|readlink|lstat|followLinks|resolveLinks" -g "*.js" -g "*.ts" -g "*.py" -g "*.java" -g "*.go"
# Buffer overflow candidates
rg -l "strcpy|strcat|sprintf|gets\b|scanf\b" -g "*.c" -g "*.cpp" -g "*.h"
# Format string vulnerabilities
rg "printf\s*\(\s*[a-zA-Z_]" -g "*.c" -g "*.cpp" | rg -v 'printf\s*\(\s*"'
# Integer overflow — arithmetic on user input before bounds check
rg -l "atoi|atol|strtol|strtoul|parseInt" -g "*.c" -g "*.cpp" -g "*.h"
# Use-after-free indicators
rg -l "free\(|delete\s|delete\[" -g "*.c" -g "*.cpp" -g "*.h"
# Then check: is the pointer used after free? Is it set to NULL?
# Unsafe memory functions
rg -l "memcpy|memmove|realloc|alloca\b" -g "*.c" -g "*.cpp" -g "*.h"
# Check: are sizes validated? Can user influence the length parameter?
For each potential vulnerability found in Phase 2, trace data flow:
Identify the source — where does user input enter?
req.body, req.query, req.params, request.form, request.argsreq.headers, request.headersFollow the flow — how is the data transformed?
Check the sink — where does the data end up?
SOURCE → [validation?] → [sanitization?] → [transformation?] → SINK
If any step in the chain is missing or bypassable → FINDING
# CORS configuration
rg -l "Access-Control-Allow-Origin|cors\(|CORS\(|AllowOrigins|allowedOrigins" -g "*.js" -g "*.ts" -g "*.py" -g "*.java" -g "*.go"
# CRITICAL: Look for "*" or reflection of Origin header without validation
# CSP (Content Security Policy)
rg -l "Content-Security-Policy|contentSecurityPolicy|csp" -g "*.js" -g "*.ts" -g "*.py" -g "*.java"
# Check for: unsafe-inline, unsafe-eval, wildcard sources, data: URI
# HSTS
rg -l "Strict-Transport-Security|hsts|max-age" -g "*.js" -g "*.ts" -g "*.py" -g "*.java"
# Cookie flags
rg -l "Set-Cookie|cookie|session" -g "*.js" -g "*.ts" -g "*.py" -g "*.java" | rg -i "secure|httponly|samesite"
# TLS configuration
rg -l "TLSv1\b|SSLv3|ssl_version|PROTOCOL_TLS|MinVersion|verify\s*=\s*false|InsecureSkipVerify|NODE_TLS_REJECT_UNAUTHORIZED" -g "*.py" -g "*.js" -g "*.ts" -g "*.java" -g "*.go"
# Debug mode in production
rg -l "DEBUG\s*=\s*True|debug\s*:\s*true|app\.debug|FLASK_DEBUG" -g "*.py" -g "*.js" -g "*.ts"
# API keys and tokens
rg "AKIA[0-9A-Z]{16}" . # AWS Access Key
rg "AIza[0-9A-Za-z_-]{35}" . # Google API Key
rg "sk-[a-zA-Z0-9]{48}" . # OpenAI API Key
rg "ghp_[a-zA-Z0-9]{36}" . # GitHub Personal Access Token
rg "glpat-[a-zA-Z0-9_-]{20}" . # GitLab PAT
rg "xox[baprs]-[a-zA-Z0-9-]+" . # Slack tokens
rg "sk_live_[a-zA-Z0-9]+" . # Stripe Secret Key
# Private keys
rg -l "BEGIN RSA PRIVATE|BEGIN EC PRIVATE|BEGIN PRIVATE KEY|BEGIN OPENSSH PRIVATE" .
# Generic secret patterns
rg -l "secret|password|token|apikey|api_key|auth_token|access_token|private_key" -g "*.env" -g "*.yml" -g "*.yaml" -g "*.json" -g "*.toml" -g "*.ini" -g "*.cfg" -g "*.conf"
# Connection strings with embedded credentials
rg "mongodb://.*:.*@|postgres://.*:.*@|mysql://.*:.*@|redis://.*:.*@|amqp://.*:.*@"
# Check .gitignore for missing sensitive file exclusions
cat .gitignore 2>/dev/null | rg -i "env|secret|key|credential|config"
# Node.js
npm audit 2>/dev/null || true
cat package.json | rg -A1 "dependencies|devDependencies"
# Python
pip audit 2>/dev/null || safety check 2>/dev/null || true
cat requirements.txt 2>/dev/null
pip list --outdated 2>/dev/null || true
# Java (Maven)
mvn dependency-check:check 2>/dev/null || true
# Go
go list -m all 2>/dev/null | head -50
govulncheck ./... 2>/dev/null || true
# Ruby
bundle audit check 2>/dev/null || true
# PHP
composer audit 2>/dev/null || true
Check for:
Use this structured format for each finding:
### [SEVERITY] Finding Title
**Category:** Injection / Auth / Crypto / Config / etc.
**CWE:** CWE-XXX
**File:** path/to/file.ext:LINE
**CVSS:** X.X (if applicable)
**Description:**
One-paragraph description of the vulnerability.
**Vulnerable Code:**
\`\`\`language
// exact code snippet from the codebase
\`\`\`
**Proof of Concept:**
Steps or payload demonstrating exploitability.
**Impact:**
What an attacker can achieve by exploiting this.
**Remediation:**
\`\`\`language
// fixed code snippet
\`\`\`
**References:**
- OWASP link or relevant documentation
REQUIRED SUB-SKILL: Use superhackers:writing-security-reports to compile findings into a full report.
For each finding, document in BOTH formats:
Use the standard finding documentation format with code-specific additions: affected file:line, vulnerable code snippet, fixed code snippet.
Record each finding for vulnerability-verification to attempt live confirmation:
| Field | Description | Example |
|---|---|---|
id | Unique finding ID | CODE-001 |
vuln_type | Category: SQLi, XSS, SSRF, CmdInj, PathTraversal, Deserialization, HardcodedSecret, InsecureCrypto, AuthBypass, MissingAuthZ, IDOR, SSTI | SQLi |
code_location | File path and line number | src/api/search.ts:42 |
source | Where tainted input enters | req.query.search |
sink | Where tainted input is used dangerously | db.query(\SELECT * FROM users WHERE name = '${search}'`)` |
missing_defense | What security control is absent | No parameterized query — string concatenation |
exploit_hypothesis | How to exploit at runtime | GET /api/search?search=' UNION SELECT * FROM credentials-- |
confidence | HIGH / MEDIUM / LOW | HIGH |
runtime_testable | Can this be confirmed via live testing? | true |
Wrong: Grepping for eval() and flagging every hit.
Right: Check if the input to eval() is user-controlled. Framework-generated eval() in build output is not a finding.
Wrong: Flagging every SQL query as SQL injection. Right: Check if the framework uses parameterized queries by default (Django ORM, SQLAlchemy with bound parameters, Hibernate HQL with parameters). Only flag raw queries with string concatenation.
Wrong: Only tracing direct request → sink flows. Right: Check if user input is stored in the database and later used in a dangerous sink without sanitization (stored XSS, second-order SQLi).
Wrong: Only scanning for technical vulnerabilities. Right: Review authorization logic — can user A access user B's resources? Are there race conditions in financial operations? Is there IDOR in API endpoints?
Wrong: Reporting 200 findings without prioritization. Right: Rate by exploitability × impact. A theoretical ReDoS in a non-public endpoint is not the same as SQLi in the login flow.
Wrong: Only reviewing first-party code.
Right: Run npm audit / pip audit / bundle audit. Check for known CVEs. A single vulnerable transitive dependency can compromise the entire application.
Wrong: Reporting pattern matches as confirmed vulnerabilities. Right: Trace the full data flow. Confirm the source is attacker-controlled and the sink is exploitable. REQUIRED SUB-SKILL: Use superhackers:vulnerability-verification to confirm findings before reporting.
Wrong: Only reviewing application code. Right: Check CI/CD configs, Terraform/CloudFormation, nginx/Apache configs, database configs for security issues. Secrets in CI env vars, overly permissive IAM roles, exposed debug ports.
This skill's work is DONE when ALL of the following are true:
When all conditions are met, state "Phase complete: secure-code-review" and stop. Do NOT perform runtime testing or write the final report — those are other skills' jobs.