| name | skill-vetter |
| version | 2.0.0 |
| description | 结构化安全审计流程。对 AI agent 技能执行去混淆→上下文感知→自动化规则扫描→权限评估→0-100 量化评分,输出三档分级报告。移植自 HarnessKit 审计引擎核心规则。触发:审查技能、vet skill、技能安全检查。 |
Skill Vetter 🔒
结构化安全审计协议。移植 HarnessKit 核心审计规则,对 AI agent 技能执行自动化扫描与量化评分。
When to Use
- 安装任何来自 ClawdHub / GitHub / 第三方的技能前
- 审查其他 agent 分享的技能
- 评估 MCP server 配置安全性
- 任何需要安全评估的场景
审计流程
Step 0: 去混淆(Deobfuscate)
审查前先清洗文本,移除以下不可见 Unicode 字符:
| 范围 | 字符类型 |
|---|
\u200B–\u200F | 零宽空格 / 零宽连接符 / 方向标记 |
\u202A–\u202E | 双向格式化控制字符 |
\u2060–\u2064 | 隐形运算符 / 字符连接符 |
\u2066–\u2069 | 双向隔离格式 |
\uFEFF | BOM |
\u00AD | 软连字符 |
\uFE00–\uFE0F | 变体选择器 |
\uE0100–\uE01EF | 补充变体选择器 |
执行方式:读取全文后,用 content.replace(/[^\x00-\x7F]/g, (c) => ...) 或逐字过滤,去除上述范围的字符。对剩余非 ASCII 字符保留(中文、日文等正常文本)。
Step 0.5: 上下文感知(Descriptive Line Mask)
规则扫描时跳过以下区域中的内容(它们是示例/文档,非实际指令):
- 代码块:
```...``` 围栏内的所有行
- 引用块:以
> 开头的行
- 嵌套处理:正确追踪 fence 开关状态,处理嵌套
实现:逐行扫描,维护 in_code_block 和 in_blockquote 布尔状态。仅在两者均为 false 时才对当前行执行规则匹配。
Step 1: Source Check
Questions to answer:
- [ ] Where did this skill come from? (ClawdHub / GitHub / Local / Unknown)
- [ ] Is the author known/reputable?
- [ ] How many downloads/stars does it have?
- [ ] When was it last updated?
- [ ] Are there reviews from other agents?
- [ ] Does it have a standard manifest? (plugin.json / package.json)
来源风险:来源为 Local 且无 URL → 标记为 unknown-source(Low 级别 finding)。
Trust Hierarchy:
- Official OpenClaw skills → 基础审查
- High-star repos (1000+) → 标准审查
- Known authors → 标准审查
- New/unknown sources → 最大力度审查
- 请求凭证的技能 → 必须人工批准
Step 2: 自动化规则扫描(Critical — P0)
以下规则在 非代码块、非引用块 的文本行上执行。
2.1 prompt-injection (Critical, -25)
检测尝试操控 agent 行为的注入模式。7 个正则(大小写不敏感):
/ignore\s+(all\s+)?previous\s+instructions/i
/you\s+are\s+now\s+a/i
/override\s+(the\s+)?system\s+prompt/i
/\[SYSTEM\]/
/new\s+(instructions?|directives?|rules?)[\s:]/i
/disregard\s+(your\s+)?(prior\s+)?(instructions?|training)/i
/forget\s+(everything|all|your\s+instructions?)/i
2.2 rce — 远程代码执行 (Critical, -25)
检测通过管道执行远程代码。5 个正则:
/curl\s+\S+\s*\|\s*(sh|bash)/i
/wget\s+\S+\s*(-q\s+)?(-O-)?\s*\|\s*(sh|bash)/i
/base64\s+-d\s*\|/
/eval\s*\(/
/curl\s+\S+.*>\s*\/tmp\/\S+.*\s*&&\s*chmod/i
2.3 plaintext-secrets — 明文密钥 (Critical, -25)
检测硬编码的 API 密钥/Token。7 个前缀正则:
/\bsk-[a-zA-Z0-9]{20,}\b/ # OpenAI API Key
/\bghp_[a-zA-Z0-9]{36,}\b/ # GitHub PAT
/\bgho_[a-zA-Z0-9]{36,}\b/ # GitHub OAuth
/\bAKIA[A-Z0-9]{16}\b/ # AWS Access Key
/\bxox[bpsc]-[a-zA-Z0-9-]{10,}/ # Slack Token
/\bsk-ant-[a-zA-Z0-9_-]{20,}\b/ # Anthropic API Key
/\bAIza[A-Za-z0-9_-]{35}\b/ # Google API Key
2.4 credential-theft — 凭证窃取 (Critical, -25)
双重条件检测 — 必须同时满足两个条件:
条件 A — 读取敏感文件(任一匹配):
~\/\.ssh\/id_(rsa|ed25519|ecdsa)
\.env(\.local|\.production)?
\.aws\/credentials
\.config\/(git|aws|gcloud)
\.npmrc
\.pypirc
\.docker\/config\.json
条件 B — 发送数据到外部(任一匹配):
curl\s+.*-d\s|curl\s+.*--data
wget\s+.*--post-data
nc\s+\d+\.\d+\.\d+\.\d+
判定:
- A ✅ + B ✅ → Critical(-25)
- 仅 A ✅ → 降级为 High(-15)
- 仅 B ✅ → 不触发此规则
2.5 safety-bypass — 安全绕过 (Critical, -25)
检测绕过安全机制的标志。6 个正则:
/--no-verify\b/
/--yes\b/
/--force\b/
/allowedTools\s*:\s*['"]?\*/i
/bypass\s+safety/i
/disable\s+confirm/i
⚠️ 反引号豁免:如果匹配到的标志被反引号包裹(如 `--force` 或 `--no-verify`),视为文档引用,不触发此规则。
Step 2.5: 扩展规则(High — P1)
2.5.1 dangerous-commands — 危险命令 (High, -15)
6 个正则:
/rm\s+-rf\s+\//
/chmod\s+777\b/
/\bsudo\s+/
/\bmkfs\b/
/\bdd\s+.*of=\/dev\//
/:\(\)\s*\{[^}]*\}.*;/
Hook 中保持 High(-15);Skill/Plugin 中降级为 Medium(-8)。
2.5.2 mcp-command-injection — MCP 命令注入 (High, -15)
检测 MCP server args 中的 shell 子执行模式:
/\$\([^)]*\)/ # $(command) 替换
/`[^`]+`/ # 反引号执行
⚠️ 精确过滤:SQL 分号(;)和 grep 管道(|)不触发此规则。
2.5.3 broad-permissions — 过宽权限 (High, -15)
检测 MCP server 绑定全接口或越权文件访问:
/bind\s*:\s*['"]?(0\.0\.0\.0|\*)/i # 全接口绑定
/filesystem.*root/i # 根路径访问(排除 /tmp)
Step 3: 权限评估(五维度)
对技能涉及的权限进行 5 维度评估:
| 维度 | 检查内容 | 判定标准 |
|---|
| FileSystem | 文件读写路径 | 扫描 ~/、/etc/、/home/、/tmp/、/var/、/opt/、/Library/、C:\、%APPDATA% 等路径。Skill 天生有文件权限(引导 agent 读写)。 |
| Network | 网络请求域名 | 提取 https?://domain 中的域名。域名 > 3 个 → 标记广泛网络攻击面。 |
| Shell | 执行的命令 | 从 ```bash ``` 代码块提取命令首 token(basename)。仅在检测到命令时标记。 |
| Database | 数据库连接 | 匹配 postgres、mysql、mariadb、sqlite、mongodb、redis(不区分大小写)。 |
| Env | 环境变量访问 | 仅 MCP:从配置的 env 字段提取。Skill 中的 $VAR 通常为 shell 变量,不标记为 Env 权限。 |
权限组合风险(额外标记):
- Network + Env → ⚠️ 凭证外泄风险
- Shell + Network → ⚠️ 远程代码执行风险
- Network + FileSystem + Shell → ⚠️ 全面攻击面
Step 4: 信任评分
评分算法
trust_score = max(0, 100 - total_deduction)
扣分规则(同规则去重)
| 严重程度 | 首次命中 | 同规则重复命中 |
|---|
| Critical | 25 | 1 |
| High | 15 | 1 |
| Medium | 8 | 1 |
| Low | 3 | 1 |
核心机制 — 同规则去重:同一 rule_id 的多个 finding,首次扣全量分,后续每个仅扣 1 分。避免文档中多次提及同一模式导致评分暴跌。
三档分级
| 分数范围 | 等级 | 显示 |
|---|
| 80–100 | Safe | 🟢 |
| 60–79 | Low Risk | 🟡 |
| 0–59 | Needs Review | 🔴 |
示例
- 无 finding → 100 分 🟢 Safe
- 1 条 Critical + 2 条 High → 100 - 25 - 15 - 15 = 45 分 🔴 Needs Review
- 同一 Critical 出现 3 次 → 100 - 25 - 1 - 1 = 73 分 🟡 Low Risk
- 5 条不同 Critical → 100 - 125 = 0 分 🔴 Needs Review(下限为 0)
输出格式
## SKILL AUDIT REPORT
═══════════════════════════════════════
Skill: [name]
Source: [ClawdHub / GitHub / Local / Unknown]
Author: [username]
Version: [version]
═══════════════════════════════════════
### Metrics
- Downloads/Stars: [count]
- Last Updated: [date]
- Files Reviewed: [count]
### Findings
| # | Rule ID | Severity | Line(s) | Matched Pattern |
|---|---------|----------|---------|-----------------|
| 1 | prompt-injection | Critical | 42 | "ignore previous instructions" |
| 2 | plaintext-secrets | Critical | 87 | sk-xxx... |
### Permissions
- 📁 FileSystem: [paths or "Minimal"]
- 🌐 Network: [domains or "None"]
- 💻 Shell: [commands or "None"]
- 🗄️ Database: [engines or "None"]
- 🔑 Env: [keys or "N/A (Skill)"]
### Permission Combo Risks
- [None / 列出组合风险]
### Trust Score
- **Score: [0-100] / 100**
- **Grade: [🟢 Safe / 🟡 Low Risk / 🔴 Needs Review]**
- Deduction breakdown: [列出每条规则的扣分]
### Verdict
**[✅ SAFE TO INSTALL / ⚠️ INSTALL WITH CAUTION / ❌ DO NOT INSTALL]**
### Notes
[任何观察、建议]
═══════════════════════════════════════
Quick Reference
GitHub 技能快速检查
curl -s "https://api.github.com/repos/OWNER/REPO" | jq '{stars: .stargazers_count, forks: .forks_count, updated: .updated_at}'
curl -s "https://raw.githubusercontent.com/OWNER/REPO/main/skills/SKILL_NAME/SKILL.md"
审计执行顺序
Step 0 → 去混淆(清洗不可见字符)
Step 0.5 → 构建上下文掩码(标记代码块/引用块)
Step 1 → Source Check(来源评估)
Step 2 → P0 规则扫描(5 条 Critical)
Step 2.5 → P1 扩展规则(3 条 High)
Step 3 → 权限评估(五维度 + 组合风险)
Step 4 → 信任评分(同规则去重 + 三档分级)
Remember
- 没有任何技能值得牺牲安全性
- 有疑问就不安装
- 高风险决策交给人类
- 记录每次审计结果以备追溯
Paranoia is a feature. 🔒🦀