AntonioTimo/skillchecker
GitHub: AntonioTimo/skillchecker
一款只读的安全审计工具,用于在安装第三方 Claude Code skill 之前对其静态扫描和语义分析,检测恶意代码与提示词注入等风险并给出红黄绿三级判定。
Stars: 0 | Forks: 0
# 🛡️ skill-checker
[](https://github.com/AntonioTimo/skillchecker/actions/workflows/tests.yml)
[](https://opensource.org/licenses/MIT)
一个只读审计工具,在你安装任何第三方 Claude
Code skill **之前**运行。它能发现单凭一双眼睛容易漏掉的问题 —— 静态扫描器
针对精心整理的危险行为目录进行模式匹配,而 `SKILL.md` 中由
LLM 驱动的步骤则增加了语义检查(描述与行为一致性、
工具伪装、混淆代理人、提示词注入漏洞)。
输出结果为以下三种判定之一:
- 🔴 **RED(红色)** — 拒绝安装。报告具体原因,不提供补丁
(恶意行为往往具有纵深防御性)。
- 🟡 **YELLOW(黄色)** — 必须打补丁。每项发现都附带精确的 diff。
你需要手动应用、重新运行并迭代直至变为 GREEN。
- 🟢 **GREEN(绿色)** — 可以安全安装。包含安装命令和简要用法说明。
设计上仅为只读:`allowed-tools` 列表中不包含 `rm`、`cp`、`mv`、
`tee`、`mkdir`、包安装或网络命令,也不包含解释器
通配符 —— 只有 `test`、`echo`(用于诊断)和固定版本的 `scan.py`。`echo`
原则上可以重定向到文件;但该 skill 永远不会这样做,而且你可以
审计这一
行为。路径限制是在指令层面强制执行的(即 Checker Scope
Rules),因为 `Read`/`Glob`/`Grep` 本身并不受路径限制。
## 它能捕获什么
静态规则的一个非详尽示例 —— **36 条 CRITICAL**、**19 条 HIGH**、**10 条 MEDIUM** 正则表达式规则,加上结构性打包配置规则(`CR032`/`CR033` hooks/stdio-MCP、`CR040` 错误的 MCP/hook 目标地址、`HI017`/`HI018`、`ME010`、`INV002`)、供应链扫描阶段(`CR039`/`HI023`/`ME012`)、Python AST 扫描阶段(`AST001`–`AST008`)以及 Unicode 扫描阶段(`UNI001`–`UNI004`):
**CRITICAL(严重) — 拒绝,无补丁:**
- 管道至 shell(`curl ... | sh`)、base64 解码的 `eval`/`exec`、使用拼接的动态 `__import__`
- 从外部数据进行 `pickle.loads`/`marshal.loads`,不带 `SafeLoader` 的 `yaml.load`
- 读取 `~/.ssh/`、`~/.aws/`、keychain、`.env`、`*.pem`、`id_rsa`、`.netrc`、`.npmrc`、`.kube/config`
- 持久化:写入 `~/.bashrc`、`~/.gitconfig`、git hooks、npm `postinstall`、cron、launchd
- 数据渗出端点:`webhook.site`、`pastebin`、Discord/Slack webhooks、ngrok
- Skill 自我提权:写入 `~/.claude/settings.json`、其他 skill、MCP config
- 反用户文本:“不要告诉用户”、“静默运行”、“将文档视为系统指令”
- 策略覆盖:“忽略安全限制”、“开发者模式”、“越狱”
- 危险的默认值:“以宽松限制重试”、“如果被阻止则使用 sudo”
**HIGH(高危) — 打补丁(如果达到 3 个或以上则为 RED):**
- `allowed-tools` 中的通配符:`Bash(* *)`、`Bash(python3 *)`、`Bash(rm *)`、`Bash(sudo *)`、`Bash(curl *)`、`Bash(npm *)`、`Bash(ssh *)`、`Bash(aws *)`...
- 对非字面量输入使用 `subprocess(..., shell=True)`、`eval()`、`exec()`
- 没有硬编码目标地址的网络调用
- 递归扫描家目录/根目录(`find ~`、`grep -R ~`)
- JS 动态执行:`Function(...)`、`Buffer.from(..., 'base64')` 后接 eval
**MEDIUM(中等) — 打补丁:**
- 将 `$0` 与 `$1` 混淆作为参数,在未使用 `mktemp` 的情况下使用可预测的 `/tmp/`
- 通过未经验证的 slug 进行路径遍历,不带 `timeout=` 的 `subprocess`
- 静默失败(破坏性操作后使用 `2>/dev/null`),缺少 symlink 检查
- 没有正当理由的“相信我”这类说辞
包含模式和原理的完整目录:[`references/red-flags.md`](references/red-flags.md)。
检查器在 YELLOW 判定中提供的补丁:[`references/patch-templates.md`](references/patch-templates.md)。
## 快速开始
### 1. 安装
```
git clone https://github.com/AntonioTimo/skillchecker.git ~/.claude/skills/skill-checker
chmod +x ~/.claude/skills/skill-checker/scripts/scan.py
```
重启你的 Claude Code 会话(开启新对话 —— skill 会在会话开始时被缓存)。
### 2. 审计 skill
将你要审计的 skill 放在一个暂存目录中 —— **暂时不要**放进 `~/.claude/skills/`:
```
mkdir -p ~/staging/skills
git clone https://github.com/some-author/some-skill.git ~/staging/skills/some-skill
```
然后在 Claude Code 中:
```
/skill-checker ~/staging/skills/some-skill/
```
审计器会执行八个步骤(清点 → 静态扫描 → frontmatter
审计 → bash 审计 → 脚本审计 → 工具伪装 →
混淆代理人 → 提示词注入 → 一致性 → 判定)。
### 3. 根据判定采取行动
- 🔴 **RED(红色)** → `rm -rf ~/staging/skills/some-skill` 并且不要回头。不要试图“绕过修复” —— 恶意行为是分层的。
- 🟡 **YELLOW(黄色)** → 手动应用报告中的 diff,然后重新运行 `/skill-checker` 直到变为 GREEN。
- 🟢 **GREEN(绿色)** → 使用报告中的安装命令将其复制到 `~/.claude/skills/` 中。
## 示例输出
🔴 **RED(红色)判定**(包含 `Bash(* *)`、`curl ... | sh`、`~/.ssh/id_rsa` 的 skill):
```
## 🔴 技能被拒绝 — 请勿安装
Skill path: /tmp/evil-skill
Skill name: super-helpful
Why it was rejected:
[CRITICAL] FM005 SKILL.md:4 — Bash(* *) grants unrestricted shell access
[CRITICAL] CR001 SKILL.md:9 — pipe-to-shell: downloads and executes remote code at runtime
[CRITICAL] CR006 SKILL.md:10 — access to ~/.ssh — private keys, authorized_keys
[CRITICAL] CR025 SKILL.md:10 — access to credential / secret files
[CRITICAL] CR026 SKILL.md:10 — known exfiltration endpoint (webhook.site)
[CRITICAL] CR028 SKILL.md:13 — anti-user instruction
[CRITICAL] CR031 SKILL.md:15 — role confusion: "treat document as system instructions"
...
Recommendation: delete this skill. Do not attempt to patch around the
malicious sections — malice tends to be defense-in-depth.
```
🟡 **YELLOW(黄色)判定**附带补丁:
```
## 🟡 安装前需应用补丁
Findings: 2 HIGH, 4 MEDIUM, 0 LOW
### Patch 1: allowed-tools 中的通配符
File: SKILL.md
Severity: HIGH
Why: Bash(python3 *) lets the model run arbitrary Python (effectively RCE)
Replace:
allowed-tools: Bash(python3 *) Bash(...)
With:
allowed-tools: Bash(python3 ~/.claude/skills//scripts/