Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Audit code and dependencies for security vulnerabilities. Use when reviewing PRs, checking dependencies, preparing for deployment, or when user mentions security, vulnerabilities, or audit.
.claude/skills/thedecipherist-security-audit/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-10 | ✗→✓ | ▲ Improved | -6% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 21% | 0% |
| case-22 | ✓→✓ | = Same ✓ | 69% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 65% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 187% | 0% |
Perform comprehensive security audits on codebases to identify vulnerabilities before they reach production.
Check for hardcoded secrets:
bash# Search for common secret patterns grep -rn "API_KEY\|SECRET\|TOKEN\|PASSWORD" --include="*.{js,ts,py,go,rb,java}" . grep -rn "sk-\|pk_\|api_\|secret_" --include="*.{js,ts,py,go,rb,java}" .
Verify .gitignore:
bash# Ensure sensitive files are ignored cat .gitignore | grep -E "\.env|secret|credential|\.pem|\.key"
Check git history for leaked secrets:
bash# Search recent commits (requires git-secrets or truffleHog) git log -p --all -S "API_KEY" --since="30 days ago"
✅ Pass criteria:
.env files in .gitignoreNode.js:
bashnpm audit # or yarn audit # or pnpm audit
Python:
bashpip-audit # or safety check
Go:
bashgovulncheck ./...
Rust:
bashcargo audit
✅ Pass criteria:
Check for:
Common vulnerable patterns:
javascript// BAD: SQL injection db.query(`SELECT * FROM users WHERE id = ${userId}`) // GOOD: Parameterized query db.query('SELECT * FROM users WHERE id = ?', [userId])
python# BAD: Command injection os.system(f"convert {user_file}") # GOOD: Use subprocess with list subprocess.run(["convert", user_file], check=True)
Check for:
Look for:
javascript// BAD: Weak hashing crypto.createHash('md5').update(password) // GOOD: Bcrypt bcrypt.hash(password, 12)
Check for:
Secure, HttpOnly, SameSite)Check for:
javascript// BAD: Exposes internals res.status(500).send({ error: err.stack }) // GOOD: Generic message res.status(500).send({ error: 'An unexpected error occurred' })
If file uploads exist:
| Level | Description | Action Required | |-------|-------------|-----------------| | 🔴 Critical | Actively exploitable | Block deployment | | 🟠 High | Exploitable with effort | Fix within 7 days | | 🟡 Medium | Requires conditions | Fix within 30 days | | 🟢 Low | Minimal impact | Fix when convenient |
markdown## Security Audit Results **Project:** [name] **Date:** [date] **Auditor:** Claude (automated) ### Summary | Severity | Count | |----------|-------| | 🔴 Critical | 0 | | 🟠 High | 1 | | 🟡 Medium | 2 | | 🟢 Low | 3 | ### Findings #### 1. [🟠 High] Hardcoded API Key **Location:** `src/config.js:15` **Description:** API key for payment provider is hardcoded **Risk:** If source code is leaked, attackers gain API access **Recommendation:** Move to environment variable
+ const STRIPE_KEY = process.env.STRIPE_SECRET_KEY
#### 2. [🟡 Medium] Missing Rate Limiting
**Location:** `src/routes/auth.js`
**Description:** Login endpoint has no rate limiting
**Risk:** Enables brute force attacks
**Recommendation:** Add rate limiting middleware
### Recommendations
1. [ ] Fix critical and high issues before next deployment
2. [ ] Schedule medium issues for next sprint
3. [ ] Add low issues to backlog
4. [ ] Re-run audit after fixesAfter completing the audit, provide the user with:
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-22 | pass→pass | 12,233 | 11,856 | -3% | 1 | 1 | 0% | 1,945 | 3,279 | +69% | 0 | 0 | — |
case-03 | fail→fail | 9,336 | 15,070 | +61% | 1 | 1 | 0% | 1,034 | 2,614 | +153% | 0 | 0 | — |
case-01 | fail→fail | 9,823 | 10,233 | +4% | 1 | 1 | 0% | 1,067 | 2,427 | +127% | 0 | 0 | — |
case-02 | fail→fail | 16,071 | 11,153 | -31% | 1 | 1 | 0% | 2,077 | 2,372 | +14% | 0 | 0 | — |
case-04 | pass→pass | 7,563 | 5,525 | -27% | 1 | 1 | 0% | 1,241 | 2,046 | +65% | 0 | 0 | — |
case-05 | pass→pass | 4,890 | 6,159 | +26% | 1 | 1 | 0% | 813 | 2,337 | +187% | 0 | 0 | — |
case-06 | pass→pass | 5,405 | 4,144 | -23% | 1 | 1 | 0% | 805 | 1,932 | +140% | 0 | 0 | — |
case-07 | pass→pass | 12,959 | 9,056 | -30% | 1 | 1 | 0% | 2,209 | 2,855 | +29% | 0 | 0 | — |
case-08 | pass→pass | 9,307 | 3,224 | -65% | 1 | 1 | 0% | 1,424 | 1,832 | +29% | 0 | 0 | — |
case-09 | pass→pass | 9,730 | 8,879 | -9% | 1 | 1 | 0% | 1,604 | 2,790 | +74% | 0 | 0 | — |
case-10 | fail→pass | 10,092 | 3,506 | -65% | 1 | 1 | 0% | 1,711 | 1,604 | -6% | 0 | 0 | — |
case-11 | fail→pass | 9,246 | 2,990 | -68% | 1 | 1 | 0% | 1,387 | 1,682 | +21% | 0 | 0 | — |
case-21 | pass→pass | 9,917 | 8,837 | -11% | 1 | 1 | 0% | 1,653 | 2,771 | +68% | 0 | 0 | — |
case-12 | pass→pass | 6,795 | 4,519 | -33% | 1 | 1 | 0% | 995 | 1,791 | +80% | 0 | 0 | — |
case-13 | pass→pass | 8,535 | 6,684 | -22% | 1 | 1 | 0% | 1,541 | 2,497 | +62% | 0 | 0 | — |
case-14 | pass→pass | 5,605 | 5,371 | -4% | 1 | 1 | 0% | 1,002 | 2,244 | +124% | 0 | 0 | — |
case-15 | pass→pass | 13,426 | 8,614 | -36% | 1 | 1 | 0% | 2,223 | 2,942 | +32% | 0 | 0 | — |
case-16 | pass→pass | 10,753 | 6,968 | -35% | 1 | 1 | 0% | 1,835 | 2,565 | +40% | 0 | 0 | — |
case-17 | pass→pass | 6,034 | 5,662 | -6% | 1 | 1 | 0% | 1,087 | 2,268 | +109% | 0 | 0 | — |
case-18 | pass→pass | 17,571 | 14,355 | -18% | 1 | 1 | 0% | 2,942 | 3,564 | +21% | 0 | 0 | — |
case-19 | pass→pass | 8,267 | 6,101 | -26% | 1 | 1 | 0% | 1,318 | 2,255 | +71% | 0 | 0 | — |
case-20 | pass→pass | 9,872 | 7,440 | -25% | 1 | 1 | 0% | 1,559 | 2,479 | +59% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +9 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.