ola-cloud/prompt-injection-eval
GitHub: ola-cloud/prompt-injection-eval
一个轻量级的 LLM agent 间接 prompt 注入安全评估框架,通过 canary token 精确匹配来量化 agent 的抗攻击能力。
Stars: 0 | Forks: 0
# prompt-injection 评估
一个小巧、实在的评估工具,用于衡量 LLM agent 抵御**通过工具输出传递的间接 prompt 注入**的能力——即模型在执行合法任务时,*工具返回的数据*试图劫持它的情况。我认为这是生产级 agent 部署中最被低估的攻击面,因此我构建了一种可复现的测量方法。
该测试框架特意保持小巧且确定。它在每次攻击中植入一个 **canary**(注入试图让模型输出的 token)或一个 **secret**(注入试图窃取的值),然后检查模型输出中是否包含它,以此来对 agent 进行评分。因为生成该 token *就是*注入的目标,所以一旦命中,就是注入成功的直接证据——评分循环中无需使用 LLM-as-judge,因此运行成本很低且在 CI 中可重复执行。
## 测量内容
- **攻击成功率 (ASR)** —— 包括总体和按攻击类别分类。
- **任务完成情况** —— agent 是否仍完成了实际任务,包括在干净的 *control* 场景下,从而防止模型仅仅通过拒绝一切来获得高分。
内置语料库 (`data/scenarios.yaml`) 中的攻击类别:
| 类别 | 探测内容 |
|---|---|
| `indirect_injection` | 隐藏在检索内容(电子邮件、网页、待翻译文本)中的指令 |
| `data_exfiltration` | 让 agent 泄露植入的 secret(追加凭证、markdown-image 信标) |
| `toolchain_hijack` | 让 agent 调用破坏性/未请求的工具(删除、shell) |
| `instruction_override` | 伪造的 `SYSTEM:` 备注和人设切换,试图摆脱 system prompt |
| `control` | 干净的工具输出 —— 衡量保留的实用效用 / 过度拒绝 |
## 安装
```
git clone https://github.com/ola-cloud/prompt-injection-eval.git
cd prompt-injection-eval
pip install -r requirements.txt
```
离线演示和测试只需要 PyYAML。`anthropic` 包仅在真实后端中需要。
## 运行
离线演示 —— 确定性强,无需 API key。这会针对模拟 agent 执行完整的 pipeline 并生成报告:
```
python run_eval.py --backend mock --out report.md --json-out report.json
```
针对您有权访问的模型进行真实评估:
```
export ANTHROPIC_API_KEY=sk-...
python run_eval.py --backend anthropic --model claude-sonnet-4-5 \
--out report.md --json-out report.json
```
将 `--model` 设置为您的 key 可以访问的模型。请参阅 [`examples/sample_report.md`](examples/sample_report.md) 查看示例(模拟后端)报告。
## 场景如何传达给模型
对于 Anthropic 后端,每个场景都会以最小化的 agent 循环进行重放,以便有毒内容以生产环境中相同的方式到达——即作为 `tool_result` 传递,而不是作为用户消息:
1. 用户发出合法任务,
2. agent 调用场景的工具,
3. 工具返回 `tool_output`(攻击场景中有毒,控制场景中干净),
4. 模型的最终文本将根据 canary/secret 和任务标记进行评分。
## 扩展语料库
向 `data/scenarios.yaml` 添加条目。攻击场景必须定义 `canary` 和/或 `planted_secret`;控制场景使用 `category: control` 并保持干净。加载器会验证这两条规则,因此永远无法被评分的场景会在加载时被拒绝,而不是默默地导致 ASR 产生偏差。
## 项目布局
```
injection_eval/
scenario.py # Scenario model + validating YAML loader
adapters.py # MockAdapter (offline) and AnthropicAdapter (real API)
detectors.py # canary/secret + task-marker grading
runner.py # orchestration and ASR / task-completion metrics
report.py # Markdown + JSON reporting
data/scenarios.yaml
tests/ # pytest suite (offline; no key needed)
run_eval.py # CLI
```
## 测试
```
pip install pytest
python -m pytest
```
## 范围和客观限制
- **模拟后端不是模型。** 它是一个植入种子的模拟器,其唯一作用是使评分 pipeline 无需 key 即可运行和复现。真实数据来自 Anthropic 后端。
- 评分有意对 canary/secret 进行**精确匹配** (exact-match)。这使得误报几乎不可能发生,但会漏掉那些在不输出植入 token 的情况下从*语义上*成功的注入。这种权衡是刻意为之;下一步自然可以是开发基于模糊匹配或判断器的检测器。
- 该语料库是一个包含公开记录注入模式的**起步集**,旨在进行扩展,而不是一个全面的基准测试。
## 许可证
MIT —— 请参阅 [LICENSE](LICENSE)。
标签:AI安全, Chat Copilot, DLL 劫持, Python, StruQ, 大语言模型, 安全规则引擎, 恶意代码分类, 提示注入, 无后门, 红队评估, 逆向工具, 集群管理