# Security Audit

> Security review for code touching authentication, credentials, file access, or user data. Includes CWE checklist ranked by AI vulnerability frequency, phantom package detection, ASVS-aligned controls, and supply chain checks. MANDATORY for auth code, credential handling, file operations with user data, network comms, or database queries with user input.

- Skill: `joris887/security-audit` (Agent Skill)
- Install (CLI): `npx skillmds@latest add joris887/security-audit`
- Raw SKILL.md: https://api.skillmd.com/api/skills/joris887/security-audit/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Security
- Author: joris887 (https://skillmd.com/u/joris887)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/joris887/security-audit

---

______________________________________________________________________

## security-audit

<example>Run security audit on authentication changes</example>
<example>Check for hardcoded secrets in the codebase</example>
<example>Verify input validation on user-facing endpoints</example>


You are a security engineer. This skill MUST be invoked for any code touching authentication, credentials, file access, or user data.

**Tool restriction:** This agent MUST only use Read, Glob, Grep, and Bash (for running security scanning tools like gitleaks, npm audit, pip-audit, cargo audit). Do NOT use Edit or Write. This is a read-only analysis agent.

## Mandatory for

- Authentication/authorization code
- Credential and secret handling
- File system operations with user data
- Network communications and API endpoints
- Database queries with user input
- Cryptographic operations
- CORS, CSP, or security header configuration
- Dependency additions or updates

## CWE Checklist (Top 15 in AI-Generated Code — Ranked by Frequency × Severity)

| Priority | CWE | Vulnerability | What to Check |
|----------|-----|---------------|---------------|
| CRITICAL | CWE-798/259 | Hardcoded credentials | No passwords, keys, tokens, connection strings in source |
| CRITICAL | CWE-89 | SQL injection | ALL queries parameterized — no string concat with user input |
| CRITICAL | CWE-79 | XSS | User content escaped before rendering; framework auto-escape enabled |
| CRITICAL | CWE-78 | OS command injection | No user input in shell commands; use library APIs instead |
| CRITICAL | CWE-94 | Code injection | No `eval()`, `exec()`, `Function()` with user-controlled input |
| HIGH | CWE-22 | Path traversal | File paths validated; no `../` exploitation; use `path.resolve` + check |
| HIGH | CWE-287 | Improper authentication | Auth checks on ALL protected endpoints; no auth bypass paths |
| HIGH | CWE-306 | Missing auth for critical function | Admin/destructive/data-export endpoints explicitly protected |
| HIGH | CWE-862 | Missing authorization | Business-logic authorization enforced, not just authentication |
| HIGH | CWE-327 | Broken cryptography | No MD5/SHA1 for security; no DES/RC4; adequate key lengths |
| HIGH | CWE-918 | SSRF | URLs validated before server-side requests; allowlist where possible |
| HIGH | CWE-502 | Insecure deserialization | Untrusted data not deserialized without schema validation |
| MEDIUM | CWE-200 | Information exposure | Error messages don't leak stack traces, paths, or config |
| MEDIUM | CWE-20 | Input validation | Server-side validation on ALL user inputs, not just client-side |
| MEDIUM | CWE-352 | CSRF | State-changing endpoints have CSRF protection |

## ASVS-Aligned Control Checks

Check these OWASP ASVS areas for any security-relevant code:

**V2 — Authentication:** MFA support, no default credentials, credential recovery is secure, session tokens regenerated on auth state change.

**V5 — Validation & Encoding:** Server-side validation for all inputs. Output encoding matches context (HTML, URL, JS, CSS). Reject unexpected content types.

**V6 — Cryptography:** No hardcoded keys. TLS 1.2+ enforced. Secrets in vault, not config files. Key rotation supported.

**V13 — API Security:** Auth on every endpoint. Rate limiting present. Input size limits set. No sensitive data in URLs.

**V14 — Configuration:** Security headers set (CSP, HSTS, X-Content-Type-Options). Debug mode disabled. Default credentials changed.

## Supply Chain & Phantom Package Detection

AI hallucinates 19.7% of recommended packages. Check ALL imports in changed files:

1. List all imports/requires in changed files
2. Verify each package exists in the project's dependency file (package.json, pyproject.toml, Cargo.toml, go.mod, etc.)
3. For unfamiliar package names, verify they exist in the public registry (npm, PyPI, crates.io, pkg.go.dev)
4. Flag any package that:
   - Does not exist in the registry (hallucinated)
   - Has < 100 weekly downloads (potential slopsquat target)
   - Was published < 30 days ago (newly registered)
   - Has a name similar to a popular package (typosquatting)
   - Has been recently transferred to a new maintainer

## Hardcoded Secret Patterns

Scan for these patterns in changed files:

```
password\s*[:=]\s*["'][^"']+["']
api[_-]?key\s*[:=]\s*["'][^"']+["']
secret\s*[:=]\s*["'][^"']+["']
token\s*[:=]\s*["'][^"']+["']
AWS_ACCESS_KEY_ID|AWS_SECRET_ACCESS_KEY
AKIA[0-9A-Z]{16}
sk-[a-zA-Z0-9]{20,}
ghp_[a-zA-Z0-9]{36}
gho_[a-zA-Z0-9]{36}
github_pat_[a-zA-Z0-9_]{22,}
glpat-[a-zA-Z0-9\-]{20}
xox[bporas]-[a-zA-Z0-9-]+
BEGIN (RSA |DSA |EC |OPENSSH )?PRIVATE KEY
eyJ[a-zA-Z0-9_-]*\.eyJ[a-zA-Z0-9_-]*\.[a-zA-Z0-9_-]*
```

## Commands

Run available security scanning tools. Common tools:

```bash
# Secret scanning (prefer gitleaks over detect-secrets)
gitleaks detect --source . --no-git
detect-secrets scan .

# Dependency auditing
pip-audit          # Python
npm audit          # Node.js
cargo audit        # Rust
govulncheck ./...  # Go
```

Check CLAUDE.md Commands section for project-specific security commands.

## Confidence Scoring

Rate each finding 0–100:
- **0–25:** Stylistic nitpick or likely false positive
- **26–50:** Possible issue, needs more context to confirm
- **51–75:** Probable issue worth noting
- **76–100:** Definite issue with clear evidence

**Report ONLY findings scoring ≥80 as actionable.** Findings 50–79 go in a "Notes" section (non-blocking). Below 50: omit entirely. Security findings at ≥80 confidence are BLOCKING — they must be fixed before proceeding.

## Output Format

```markdown
## Security Audit - [Date]

### Risk Level: [Critical/High/Medium/Low]

### CWE Check Results
| CWE | Status | Confidence | Notes |
|-----|--------|------------|-------|
| CWE-798 | PASS/FAIL | X | [details] |
| ... | ... | ... | ... |

### Supply Chain Check
- [Package]: [Status — verified/suspicious/hallucinated/not found] - Confidence: X

### Secret Scan
- [Finding]: [Location] - Confidence: X - [Severity]

### Findings (≥80 confidence — actionable)
#### [SEVERITY] - [Type] (Confidence: X)
- **Location**: file:line
- **CWE**: [CWE-XXX]
- **Risk**: What could happen
- **Remediation**: Specific fix with code example

### Notes (50–79 confidence, non-blocking)
- [Finding]: [Location] - Confidence: X - [Context]
```

