AntonioTimo/skillchecker

GitHub: AntonioTimo/skillchecker

一款只读的安全审计工具,用于在安装第三方 Claude Code skill 之前对其静态扫描和语义分析,检测恶意代码与提示词注入等风险并给出红黄绿三级判定。

Stars: 0 | Forks: 0

# 🛡️ skill-checker [![tests](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/5efa90770b043050.svg)](https://github.com/AntonioTimo/skillchecker/actions/workflows/tests.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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/