ryanda9910/agentfrisk
GitHub: ryanda9910/agentfrisk
一个零依赖的 Node CLI 安全扫描工具,用于在 AI 编码助手加载技能文件和规则文件之前检测其中是否存在恶意或被投毒的指令。
Stars: 0 | Forks: 0
agentfrisk
在加载中毒指令之前,对 agent 的技能文件和规则文件进行安全检查。
🇺🇸 English · 🇮🇩 Bahasa Indonesia · 🇨🇳 简体中文
你可能会安装一个 Claude Code 技能、一条 Cursor 规则、一个来自模板的
`AGENTS.md`,或者一个自带 `.claude/skills/` 的代码库。随后,你的 agent 就会
**读取并遵循**这些文件——这正是它们存在的意义。这也使得它们成为了一个后门:
一个中毒的技能可能会指示 agent 读取你的 `~/.ssh` 密钥并将其 POST 到某处,
要求“不要告诉用户”,执行 `curl … | bash`,或者将指令隐藏在 HTML 注释
或你在代码审查时根本看不到的零宽字符中。没有人会像扫描依赖项那样去扫描这些文件。
`agentfrisk` 会遍历目录,找出 coding agent 加载的每一个文件,
并逐一检查其中是否包含合法技能永远不会出现的指令。零依赖,
可以直接在你的代码库或 CI 中运行。
## 扫描范围
Claude Code 技能 (`.claude/skills/**/*.md`, `SKILL.md`)、`AGENTS.md`、`CLAUDE.md`、
`GEMINI.md`、Cursor 规则 (`.cursorrules`, `.cursor/rules/**`)、`.windsurfrules`、
`.clinerules` 以及 `.github/copilot-instructions.md`。
## 检测内容
- **机密信息窃取** — 读取机密文件(`.env`、`~/.ssh`、
keychain、`.npmrc`)或向外部 URL 发送数据的指令。
- **向用户隐瞒** — “不要告诉用户”、“在不知会任何人的情况下”。
- **越狱** — “忽略你的安全准则”、“无视之前所有的指令”。
- **远程代码执行** — `curl … | bash`,解码并运行 base64,以及对解码内容执行 eval。
- **持久化** — 向你的 shell profile、cron 或 git hooks 写入内容的指令。
- **隐藏文本** — 零宽字符 / bidi / Unicode 标签走私,以及可疑的 HTML 注释。
- **硬编码密钥** — 文件中遗留的真实 API key、token 或 private key。
## 使用方法
```
# 扫描当前 repo
npx github:ryanda9910/agentfrisk
# 扫描目录或单个文件
npx github:ryanda9910/agentfrisk ~/.claude/skills
npx github:ryanda9910/agentfrisk path/to/SKILL.md
# CI: 用于 GitHub code scanning 的 SARIF,或设置 baseline 使其仅在发现新问题时失败
npx github:ryanda9910/agentfrisk --sarif .
npx github:ryanda9910/agentfrisk --write-baseline .agentfrisk-baseline.json .
npx github:ryanda9910/agentfrisk --baseline .agentfrisk-baseline.json .
```
干净时退出代码为 `0`,当检测结果达到 `--fail-on`(默认为 `high`)时为 `1`,
发生用法错误时为 `2`——因此可以直接无缝接入 CI:
```
- uses: ryanda9910/agentfrisk@main # fails the PR if a skill/rule file is poisoned
```
## 难点:避免误报
技能文件*本身就应该*包含指令,因此标准不是“提到了
密码”——而是“是否存在窃取数据、隐瞒行为、越狱或执行远程
代码的指令”。agentfrisk 经过调优,确保真正的安全技能(它们整天都在讨论
secrets 和 prompt injection)能够顺利通过检测。已通过作者本人安装的技能进行了验证——详见 **[CASES.md](CASES.md)**。
## 为什么可以信任其输出结果
```
$ node test/detect.test.mjs
PASS — 13 passed, 0 failed
```
它只读取文件;绝不执行它发现的任何内容。它是起飞前的安全检查,而不是一个 sandbox。
## License
MIT。
标签:AI代码助手, DNS 反向解析, GNU通用公共许可证, MITM代理, Node.js, StruQ, 图数据库, 提示词安全, 文档结构分析, 自定义脚本