lindsey98/camel-prompt-injection
GitHub: lindsey98/camel-prompt-injection
CaMeL 是论文「从设计上击败提示注入」的实验代码库,提供基于解释器与安全策略引擎的 LLM 提示注入防御机制及可复现的评测框架。
Stars: 0 | Forks: 0
# `CaMeL`:[从设计上击败提示注入](https://arxiv.org/abs/2503.18813)
Edoardo Debenedetti1,3, Ilia Shumailov2, Tianqi Fan1, Jamie Hayes2, Nicholas Carlini2, Daniel Fabian1, Christoph Kern1, Chongyang Shi2, Florian Tramèr3
1Google, 2Google DeepMind, 和 3ETH Zurich
## 前置条件
1. 安装依赖项:
pip install -r requirements.txt
2. 将 `.env.example` 重命名为 `.env` 并填入你的 API 密钥
(`OPENAI_API_KEY`、`ANTHROPIC_API_KEY`、`GOOGLE_API_KEY`)。
3. 在运行之前将密钥加载到你的环境中:
set -a && source .env && set +a
模型始终以 `provider:model_name` 的格式传递。在无攻击情况下,
根据 CaMeL 实用性表现最好的三个模型——如下面的示例中所使用的——是:
`openai:o3-2025-04-16`(带有 `--reasoning-effort high`)、
`openai:o4-mini-2025-04-16`(带有 `--reasoning-effort high`)和
`anthropic:claude-sonnet-4-20250514`。
默认情况下,运行结果会报告**实用性**(无攻击)。添加 `--run-attack` 也可以报告在 AgentDojo 的 `important_instructions` 攻击下的**安全性**。
## 运行模式
有三种运行方式,总结如下,下面有详细说明:
| 模式 | 标志 | 是什么 |
| --- | --- | --- |
| **无 CaMeL(基线)** | `--use-original` | 原生工具调用 API,无防御 |
| **CaMeL,无策略** | *(无)* | CaMeL 解释器,安全策略**关闭** |
| **CaMeL + 策略** | 两个步骤,见下文 | 强制执行安全策略的 CaMeL 解释器 |
### 1. 无 CaMeL — 原生工具调用(`--use-original`)
这是未防御的基线(即“原生工具调用 API”的数值)。它使用常规的工具调用循环运行模型,没有 CaMeL 解释器。
```
python main.py openai:o3-2025-04-16 --reasoning-effort high --use-original
```
### 2. 无安全策略的 CaMeL(单步)
在**没有额外标志**的情况下运行 CaMeL 会使用 CaMeL 解释器,但**不会**强制执行任何安全策略(它内部使用了一个无操作策略引擎)。这就是 `+camel` 配置。
```
python main.py anthropic:claude-sonnet-4-20250514
```
### 3. 带有安全策略的 CaMeL(`+camel+secpol`)— 两个步骤
```
# 步骤 1 — 生成 CaMeL traces(写入到 ./logs/+camel/...)
python main.py openai:o3-2025-04-16 --reasoning-effort high
# 步骤 2 — 在强制执行 security policies 的情况下重放相同的代码
python main.py openai:o3-2025-04-16 --reasoning-effort high --replay-with-policies
```
这两个步骤中的模型**必须完全相同**(重放时会根据 pipeline 名称查找 trace)。**不要**在第 1 步中传入 `--q-llm`,否则 trace 路径在第 2 步中将无法匹配。
## 在攻击下运行(安全性)
默认情况下,运行会报告无注入的**实用性**。添加 `--run-attack` 以注入 AgentDojo 的 `important_instructions` 提示注入攻击;随后运行将同时报告**实用性**和**安全性**(安全性 = 攻击者成功的注入任务比例,因此**越低越好**)。
`--run-attack` 可以与上述每种模式组合使用:
```
# 受攻击下的 No CaMeL(baseline)
python main.py openai:o3-2025-04-16 --reasoning-effort high --use-original --run-attack
# 受攻击下的 CaMeL(无 policies)
python main.py anthropic:claude-sonnet-4-20250514 --run-attack
```
对于**在攻击下带有策略的 CaMeL**,仍然是相同的两个步骤——只需将 `--run-attack` 添加到**两者**中即可。第 1 步在存在注入的情况下生成 trace;第 2 步在强制执行安全策略的情况下重放它们(这就是攻击实际上应该被阻止的地方):
```
# 步骤 1 — 生成注入 attack 的 traces
python main.py openai:o3-2025-04-16 --reasoning-effort high --run-attack
# 步骤 2 — 在强制执行 policies 的情况下重放 -> security numbers
python main.py openai:o3-2025-04-16 --reasoning-effort high --run-attack --replay-with-policies
```
## 常用选项
- `--run-attack` — 同时运行 `important_instructions` 攻击并报告安全性(如果是仅实用性/无攻击运行,则省略它)。
- `--reasoning-effort {low,medium,high}` — **仅**影响 OpenAI 推理模型(`o3`、`o4-mini`、`o1`、`codex`)。会被 Gemini / Claude / GPT-4.1 忽略。
- `--thinking-budget-tokens N` — Anthropic 思考预算(例如,对于带推理的 Claude Sonnet 4 设为 `16000`)。这与 `--reasoning-effort` 是分开的。
- `--suites workspace banking travel slack` — 限制为特定的测试套件。
- `--user-tasks user_task_0 user_task_1` — 限制为特定的用户任务。
- `--q-llm provider:model` — 使用更便宜的模型作为隔离 LLM(仅适用于单步 CaMeL 运行,不适用于重放)。
- `--eval-mode {normal,strict}` — 策略的依赖传播模式(`strict` 对应于 `+camel+secpol+strict`)。
完整列表:`python main.py --help`。
### 复现顶级模型
在无攻击的 CaMeL 实用性方面表现最好的三个模型是 **o3 (high)**、
**o4-mini (high)** 和 **Claude Sonnet 4**(无推理)。要通过 `+camel+secpol` pipeline(实用性和安全性,均作为两步重放)运行这三个模型,请使用辅助脚本:
```
set -a && source .env && set +a
./scripts/run_top3.sh
# 例如,限制为单个 suite:
SUITES="--suites workspace" ./scripts/run_top3.sh
```
### 示例
```
# Baseline(无 CaMeL),受 attack -> security numbers
python main.py anthropic:claude-sonnet-4-20250514 --use-original --run-attack
# OpenAI reasoning model(高 reasoning effort),CaMeL + policies
python main.py openai:o3-2025-04-16 --reasoning-effort high
python main.py openai:o3-2025-04-16 --reasoning-effort high --replay-with-policies
# Claude Sonnet 4(16k thinking budget),CaMeL + policies,仅限 workspace
python main.py anthropic:claude-sonnet-4-20250514 --thinking-budget-tokens 16000 --suites workspace
python main.py anthropic:claude-sonnet-4-20250514 --thinking-budget-tokens 16000 --suites workspace --replay-with-policies
```
## 常见问题解答
你可以将其添加到 [`models.py`](src/camel/models.py) 文件中的 `_supported_model_names` 变量中。键是带有指定提供商的模型名称(查看该提供商的 API),而值是当模型被问及“你是什么模型?”时它所回答的内容。请记住,OpenAI 推理模型反而存储在 `_oai_thinking_models` 变量中。
请在此仓库中提一个 issue。请注意,我们不打算修复 bug,因为此代码库仅作为研究制品提供。
## 运行测试和 linter
```
ruff check --fix
ruff format
pyright
pytest
```
这不是官方支持的 Google 产品。本项目不符合参与 [Google 开源软件漏洞奖励计划](https://bughunters.google.com/open-source-security) 的条件。
标签:AI安全, Chat Copilot, DLL 劫持, Petitpotam, TruffleHog, 人工智能, 大语言模型, 学术论文, 提示词注入防御, 用户模式Hook绕过, 逆向工具