jcedrik/canary

GitHub: jcedrik/canary

Canary 是一款专为 LLM/AI Agent 应用设计的静态安全扫描器,用于检测 prompt 注入、密钥泄露、缺失 guardrail 和敏感数据记录等 AI 特有的安全故障模式。

Stars: 0 | Forks: 0

# 金丝雀 一款专为 **LLM 和 AI agent 应用**设计的静态安全扫描器。 传统的 linter 和 SAST 工具是为语言模型出现之前的世界构建的。它们不知道什么是 prompt,无法区分 guardrail 和常规的函数调用,并且完全没有“不可信输入到达模型”的概念。`canary` 正是为填补这一空白而生的。 它会扫描代码库,并标记出 AI 功能特有的故障模式: | 类别 | 捕捉内容 | 示例规则 | |---|---|---| | **Prompt injection** | 被直接拼接到 prompt 中的不可信输入 | `CANARY-PI-001` | | **暴露的 secrets** | 在源码中提交的 OpenAI / Anthropic / Google / AWS 密钥 | `CANARY-SEC-001` | | **缺失的 guardrails** | 没有输出验证或审核的模型调用 | `CANARY-GR-001` | | **敏感数据记录** | 被写入日志的原始用户输入、prompt 或 PII | `CANARY-PII-001` | 零运行时依赖 —— 它是纯标准库 Python,因此可以直接放入任何 CI pipeline 中,而不会拖入庞大的依赖包树。 ## 安装 ``` pip install canary-scan ``` 或者从源码安装: ``` git clone https://github.com/jcedrik/canary.git cd canary pip install -e . ``` ## 用法 扫描目录: ``` canary ./my-app ``` 扫描单个文件,并输出 JSON 以便用于 CI: ``` canary app.py --format json ``` 仅报告中级及以上严重程度的问题,遇到高级或更严重的问题时使构建失败: ``` canary ./my-app --min medium --fail-on high ``` ### 选项 | 标志 | 默认值 | 描述 | |---|---|---| | `--format` | `text` | `text`(人类阅读)或 `json`(机器/CI) | | `--min` | `info` | 仅报告达到或高于此严重级别的问题 | | `--fail-on` | `high` | 如果任何问题达到此严重级别,则以非零状态退出 | ### 退出码 | 代码 | 含义 | |---|---| | `0` | 没有达到或超过 `--fail-on` 的问题 | | `1` | 存在达到或超过 `--fail-on` 的问题 | | `2` | 用法或运行时错误 | ## 输出示例 在内置的易受攻击示例上运行: ![canary 扫描输出](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/9e4c71e7f6003436.png) 供 CI 使用的机器可读 JSON (`--format json`): ![canary JSON 输出](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/590635baba003441.png) 当问题达到 `--fail-on` 阈值时,扫描会以非零状态退出,从而起到构建门禁的作用: ![canary CI 退出码](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/4b346b5e14003446.png) ## 在 CI 中使用 GitHub Actions: ``` - name: Security scan run: | pip install canary-scan canary . --fail-on high ``` 遇到问题时返回的非零退出码会导致作业失败,从而确保不安全的 AI 代码永远不会进入 `main` 分支。 ## 工作原理 `canary` 会对每个源文件运行一组独立的**检测器**。Python 文件会被解析为 AST,以实现精确的 prompt injection 检测;其他语言则使用针对性的模式匹配。每个检测器在设计上都是保守的 —— 它倾向于安静的扫描而不是虚张声势,因为一个用误报淹没你的扫描器,最终只会被卸载。 发现的问题会包含一个稳定的规则 ID、一个 CWE 引用、一个通俗易懂的解释,以及一个具体的修复方案。 ## 路线图 - [ ] `--baseline` 用于抑制已知/接受的问题 - [ ] 内联 `# canary: ignore RULE-ID` 抑制注释 - [ ] 用于 GitHub code-scanning 集成的 SARIF 输出 - [ ] 针对 agent 中不安全的工具/函数调用暴露的检测器 - [ ] 跨函数的污点跟踪(不仅限于单个语句内) ## 为什么开发它 我从事基于 LLM 的内部 agent 开发,并拥有 Security+、AZ-500 和 AWS Solutions Architect 认证。我平时手工进行的那些安全加固工作 —— 将用户输入排除在 system prompt 之外、验证模型输出、将 secrets 和 PII 排除在代码和日志之外 —— 已经机械化到完全可以实现自动化。`canary` 就是这种自动化的体现,它从头开始构建,并向任何发布 AI 功能的人开放。 ## 许可证 MIT — 查看 [LICENSE](LICENSE)。
标签:AI安全, Chat Copilot, DLL 劫持, Python, SAST, StruQ, 大语言模型, 无后门, 盲注攻击, 自动化payload嵌入, 逆向工具, 静态代码扫描