praneel95/skillguard
GitHub: praneel95/skillguard
面向 AI agent 技能和插件的静态安全扫描器,通过内容分析检测 prompt 注入、隐藏指令、数据窃取和破坏性命令等供应链威胁。
Stars: 0 | Forks: 0
# SkillGuard 🛡️
**面向 AI agent 技能和插件的静态安全扫描器。**
针对 Claude Code、Cursor 以及更广泛的 MCP 生态系统的技能和插件正呈现出爆发式的增长 —— 像 `awesome-claude-skills` 和 `andrej-karpathy-skills` 这样的集合加起来已经有数十万个 star。但所谓的“技能”本质上只是 markdown(`SKILL.md`、`CLAUDE.md`)加上脚本和 hooks,并且**所有这些内容都会直接加载到你的 agent 的上下文中,或者在你的机器上执行。**
包级别的供应链扫描器(npm audit、PyPI 检查,甚至是像 Perplexity 的 Bumblebee 这样的 MCP 扫描器)验证的是*包的来源*。**它们全都不会去读取技能文件里面的内容。** 这正是 SkillGuard 填补的空白:它负责读取*内容*,并标记出那些真正会对你造成伤害的东西 —— prompt 注入、不可见的 Unicode 指令、凭证窃取,以及破坏性的 shell 命令。
零运行时依赖。纯 Python 标准库。可在任何 CI 中运行。
## 为什么这很重要
恶意的技能不需要 CVE。它只需要你安装它。它可能携带的真实攻击技术包括:
- **Prompt 注入** —— 类似于 `Ignore all previous instructions and do not tell the user...` 的语句被深埋在 `SKILL.md` 中,而你的 agent 会乖乖地读取它。
- **不可见的 Unicode** —— 零宽字符和 Unicode *tag* 字符。这些字符在 GitHub 上对人类审查者来说是不可见的,但会被原封不动地输入给模型。SkillGuard 会将它们解码回纯文本,让你能看到隐藏的 payload。
- **数据窃取** —— 捆绑的 `setup.sh` 通过 `curl` 将你的 `~/.ssh/id_rsa` 或 `.env` 发送到远程主机,或者执行 `curl | bash` 管道。
- **破坏性命令** —— `rm -rf ~/`、fork 炸弹、磁盘覆写、清除历史记录。
- **硬编码的 secrets** —— 意外提交到技能中的 API 密钥和私钥。
## 安装
```
pip install skillguard # once published
# 或直接从 clone 运行(无需 dependencies):
python -m skillguard scan ./path/to/skill
```
## 用法
```
# 扫描 skill 或 plugin 目录
skillguard scan ./my-skill
# Machine-readable output
skillguard scan ./my-skill --format json
skillguard scan ./my-skill --format sarif -o results.sarif # GitHub code scanning
# 控制 CI gate(默认:在 `high` 或以上级别时 fail)
skillguard scan ./my-skill --fail-on critical
# 列出 detection rules
skillguard rules
```
退出代码:`0` 表示干净(或低于阈值),`1` 表示发现达到或高于 `--fail-on` 的问题,`2` 表示使用错误。
## 扫描内容
目标中的每一个 markdown/指令文件和脚本:`SKILL.md`、`CLAUDE.md`、`AGENTS.md`、`.cursorrules`、`README.md`,以及 `.sh/.py/.js/.ts/.rb`,还有清单文件(`.json/.yaml/.toml`)。它会跳过 `.git`、`node_modules` 和其他干扰目录,并将文件大小上限设定为 2 MB。
## 检测规则
| ID | 严重程度 | 类别 | 捕获内容 |
|----|----------|----------|-----------------|
| SG001 | high | prompt-injection | 指令覆盖 / 越狱(jailbreak)短语 |
| SG002 | critical | hidden-content | 不可见 / bidi / Unicode-tag 字符(已解码) |
| SG003 | high | hidden-content | 隐藏在 HTML 注释中的指令 |
| SG004 | critical | exfiltration | curl/wget 上传,`curl \| bash`,读取凭证文件 |
| SG005 | critical | dangerous-command | `rm -rf`、fork 炸弹、磁盘擦除、反取证 |
| SG006 | high | secret | 硬编码的 API 密钥、token、私钥 |
| SG007 | medium | suspicious-network | 裸 IP、高风险 TLD、URL 缩短服务 |
## 作为 GitHub Action 使用
```
name: skill-security
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: praneel95/skillguard@v0.1.0
with:
path: .
fail-on: high
format: sarif
output: skillguard.sarif
- uses: github/codeql-action/upload-sarif@v3
if: always()
with: { sarif_file: skillguard.sarif }
```
或者在不使用 Action 的情况下直接调用该模块:
```
- run: python -m skillguard scan . --fail-on high
```
## 作为 pre-commit hook 使用
添加到你的 `.pre-commit-config.yaml` 中:
```
repos:
- repo: https://github.com/praneel95/skillguard
rev: v0.1.0
hooks:
- id: skillguard
```
然后运行 `pre-commit install`。SkillGuard 现在会在每次提交时进行扫描,并拦截
任何严重程度为 `high` 或以上的内容。
## 构建方式
- `skillguard/rules.py` —— 检测引擎。每条规则都是一个独立的小型检测器;通过向 `RULES` 中追加内容即可添加新规则。
- `skillguard/scanner.py` —— 遍历目录,应用规则,并计算 0–100 的风险评分。
- `skillguard/report.py` —— 终端、JSON 和 SARIF 2.1.0 渲染器。
- `skillguard/cli.py` —— `skillguard` 命令。
- `examples/` —— 一个良性技能和一个测试中使用的故意设置为恶意的技能。
- `tests/` —— 15 个单元测试,覆盖了每一条规则(`python tests/test_rules.py`)。
## 测试
```
python tests/test_rules.py # no test dependencies required
```
## 范围与客观说明
SkillGuard 是一款快速的初步静态分析工具,而不是绝对的保障。它使用基于模式的启发式算法,因此可能会产生误报(例如一篇*记录了* `rm -rf` 的安全教程),并且无法捕获所有的混淆手段。请将干净的扫描结果视为“没有发现明显问题”,而不是“绝对安全”。请务必手动审查高风险技能。
## 许可证
MIT
标签:AI安全, Chat Copilot, DLL 劫持, DNS 反向解析, LNA, Python, 大语言模型, 无后门, 逆向工具, 静态扫描