| name | security-audit |
| description | Audits code for security vulnerabilities. Use when asked to check security, find vulnerabilities, or audit for OWASP issues. |
Security Audit Skill
Systematically audit code for common security vulnerabilities.
Workflow
1. Identify Attack Surface
Map entry points:
- API endpoints
- User input forms
- File uploads
- URL parameters
- Headers and cookies
- WebSocket messages
grep -r "app.get\|app.post\|router\." --include="*.ts" --include="*.js"
grep -r "onSubmit\|handleSubmit" --include="*.tsx" --include="*.jsx"
2. Check OWASP Top 10
Go through each category systematically:
| # | Category | What to Check |
|---|
| 1 | Broken Access Control | Auth checks on all endpoints |
| 2 | Cryptographic Failures | Sensitive data exposure |
| 3 | Injection | User input in queries/commands |
| 4 | Insecure Design | Business logic flaws |
| 5 | Security Misconfiguration | Default configs, headers |
| 6 | Vulnerable Components | Outdated dependencies |
| 7 | Auth Failures | Weak passwords, session issues |
| 8 | Data Integrity Failures | Unverified updates, CI/CD |
| 9 | Logging Failures | Missing audit trails |
| 10 | SSRF | Server-side request forgery |
3. Review Code Patterns
Search for dangerous patterns:
grep -r "query.*\${" --include="*.ts"
grep -r "execute.*+" --include="*.py"
grep -r "exec\|spawn\|system" --include="*.ts" --include="*.js"
grep -r "innerHTML\|dangerouslySetInnerHTML" --include="*.tsx"
grep -r "password\|secret\|api_key\|token" --include="*.ts" --include="*.env*"
4. Check Dependencies
npm audit
npx snyk test
pip-audit
safety check
5. Document Findings
For each vulnerability:
- Severity (Critical/High/Medium/Low)
- Location (file:line)
- Description
- Proof of concept (if safe)
- Recommended fix
Quick Reference
Common Vulnerabilities
Injection (SQL, NoSQL, Command, LDAP)
Vulnerable:
const query = `SELECT * FROM users WHERE id = ${userId}`;
exec(`convert ${userFilename} output.png`);
User.find({ username: req.body.username });
Fixed:
const query = 'SELECT * FROM users WHERE id = ?';
db.query(query, [userId]);
const safeFilename = path.basename(userFilename);
exec(`convert ${shellescape([safeFilename])} output.png`);
User.find({ username: String(req.body.username) });
Cross-Site Scripting (XSS)
Vulnerable:
element.innerHTML = userInput;
<div dangerouslySetInnerHTML={{ __html: comment }} />
Fixed:
element.textContent = userInput;
import DOMPurify from 'dompurify';
<div dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(comment) }} />
Broken Authentication
Vulnerable:
const sessionId = Math.random().toString();
app.post('/login', (req, res) => { });
window.location = `/login?password=${password}`;
Fixed:
const sessionId = crypto.randomBytes(32).toString('hex');
app.post('/login', rateLimit({ max: 5, windowMs: 15*60*1000 }), ...);
fetch('/login', { method: 'POST', body: JSON.stringify({ password }) });
Sensitive Data Exposure
Vulnerable:
console.log('User login:', { email, password });
res.status(500).json({ error: err.stack });
const API_KEY = 'sk-1234567890abcdef';
Fixed:
console.log('User login:', { email, password: '[REDACTED]' });
res.status(500).json({ error: 'Internal server error' });
const API_KEY = process.env.API_KEY;
Security Headers Checklist
helmet({
contentSecurityPolicy: true,
hsts: true,
noSniff: true,
frameguard: { action: 'deny' },
xssFilter: true
});
Authentication Checklist
Authorization Checklist
See Also