aiGalen Guan

Security Theater: Evaluating Skill-Vetter, the AI Skill Security Scanner

There's a new category of developer tool emerging: skills for AI coding agents. With Claude Code, OpenClaw, Codex, and Hermes Agent all supporting installable skill packs, the attack surface is growing fast. A malicious skill can read your files, exfiltrate API keys, or inject prompt-level exploits — all from a simple clawhub install.

Enter skill-vetter — a "multi-scanner security gate" from app-incubator-xyz that promises to detect malicious code, vulnerabilities, and suspicious patterns before you install a skill. It has 26 stars, 6 forks, and a bold claim: four scanners working together to block dangerous skills.

I spent an afternoon tearing it apart. Here's what I found.

Skill-Vetter Failure Mode Diagram

What It Claims to Do

skill-vetter runs four scanners against a skill before installation:

Scanner Claims to Detect
aguara Prompt injection, obfuscation, suspicious LLM calls
skill-analyzer Known malicious patterns, CVE database (Cisco)
secrets-scan Hardcoded API keys, tokens, credentials
structure-check Missing SKILL.md, malformed YAML, dangerous shell commands

Outputs a verdict: SAFE, REVIEW NEEDED, or BLOCKED.

Sounds solid, right?

The Reality: Dead Scanners on Arrival

Here's the first problem. On a clean macOS machine — no Go toolchain, no Cisco Python package — here's what happens when you run the dependency check:

✅ python3
✅ curl
✅ jq
✅ git
❌ aguara — NOT INSTALLED
❌ skill-scanner — NOT INSTALLED

That's 50% of the detection surface offline. The two most sophisticated scanners — aguara (prompt injection) and skill-scanner (CVE database) — require separate, non-trivial installations (go install, pip install). The install script doesn't even attempt to install them. It just notes them as "skipped."

Without these, skill-vetter still runs. It still outputs verdicts. It still says "✅ SAFE" or "🚫 BLOCKED." But only the two weakest scanners are working: grep-based regexes for secrets and shell commands.

The Scanner That Can't Scan Itself

The most revealing bug is in vett.sh, the main scanning script. Line 17 of the structure-check scanner reads:

grep -rqE "(rm -rf|curl.*\|.*bash|...) ..." "$SKILL_DIR" --exclude="vett.sh"

Notice the --exclude="vett.sh"? That's not a coincidence. vett.sh contains the exact patterns it flags as dangerous — specifically, rm -rf "$TMPDIR_BASE" on line 17 for cleanup. Without that self-exemption, skill-vetter would block itself.

The README's own one-line install command is bash <(curl -s https://...) — a curl|bash pattern that's one of the tool's danger signals. The tool doesn't scan README.md (only *.sh, *.py, *.js), so it never catches itself.

This is the tooling equivalent of a security guard who doesn't pass their own background check and quietly exempts themself from the rules.

Regex Roulette: The Secrets Scanner

The secrets scanner uses exactly two grep regexes. Let me show you what they catch — and what they miss.

Caught (true positive):

api_key="sk-abcdefghijklmnop123456"  # ✅ Detected

Missed (false negative):

API_KEY=sk-1234567890123456789  # ❌ Not detected — regex requires quotes

False positive (a UUID):

apikey="550e8400-e29b-41d4-a716-446655440000"  # ❌ Flagged as a secret

Missed entirely:

subprocess.run(["rm", "-rf", "/"])  # Not detected — regex expects contiguous "rm -rf"

This is signature-based detection at its crudest. No entropy analysis. No AST parsing. No taint tracking. Real secret scanners like gitleaks and truffleHog use Shannon entropy — skill-vetter uses two regular expressions.

Multi-Dimensional Scorecard

Dimension Score Why
Security effectiveness 4/10 Signature-only, grep-level, trivially bypassable
Code quality 5/10 Decent bash hygiene but self-exemptions and fragile error handling
Dependency health 3/10 50% scanners dead on arrival; install script doesn't help
False positives/negatives 3/10 UUIDs flagged as secrets; unquoted keys invisible
Uniqueness 6/10 First-mover in a real niche — but first doesn't mean good
Maintenance signals 2/10 2 commits, 0 updates in 60 days, no license file
Fit for my stack 3/10 Only detects Claude Code / OpenClaw; no Hermes support
Weighted average ~3.6/10

The Irony: A Pipeline That Outperforms It

Want real security scanning for agent skills? A three-tool pipeline of existing, battle-tested tools beats skill-vetter on every dimension:

# Real secret detection (entropy-based, 100+ rules)
gitleaks detect --source <skill-dir>

# Real code analysis (AST-aware, 2000+ rules, taint tracking)
semgrep --config auto <skill-dir>

# Real shell script analysis (catches actual bugs)
shellcheck <skill-dir>/scripts/*.sh

These tools have thousands of contributors, millions of downloads, and are maintained by organizations with security teams. skill-vetter has 2 commits from a single author who hasn't touched the repo in two months.

What Would It Take to Fix?

If someone wanted to turn skill-vetter into a real tool:

  1. Drop the self-exemption. If your security tool can't pass its own checks, fix the checks — don't add exclusions.
  2. Add entropy-based secret detection. Two regexes is not a scanner.
  3. Bundle the dependencies. If aguara and skill-scanner are required, install them automatically or warn explicitly that the scan is degraded.
  4. Add a license file. README says MIT, repo has no LICENSE — legally ambiguous.
  5. Support more agent platforms. Hermes, Codex, Cursor — not just Claude Code and OpenClaw.

Verdict: Security Theater

skill-vetter is a well-intentioned prototype that creates more problems than it solves. The output format looks authoritative — green checkmarks, severity levels, a final verdict — but the underlying detection is grep with a pretty face.

The danger isn't that skill-vetter is useless. It's that it creates a false sense of security. A user sees "✅ SAFE — All scanners passed" and installs a skill, not realizing that half the scanners never ran and the other half can be bypassed with basic obfuscation.

For now, the best skill-vetting tool is still the oldest one: read the SKILL.md, check the source repo, and ask yourself: do I trust this author with access to my filesystem?

Final verdict: SKIP installation. Use gitleaks + semgrep + shellcheck instead.