urcuqui/AgentBreak
GitHub: urcuqui/AgentBreak
一个演示 AI Agent 间接 prompt 注入攻击与确定性防御措施的教学实验项目。
Stars: 0 | Forks: 0
# 使用 Python 黑客攻击 AI Agent
这是一个 7-8 分钟的会议演示,展示了存在漏洞的 AI Agent 如何通过 RAG pipeline 检索到的文档内的**间接 prompt 注入**被操纵,以及如何通过确定性的 Python 控制来阻止*相同*的攻击。
## 教学目标
在现场观众面前具体说明:
1. 间接 prompt 注入是 Agent 系统的一种真实故障模式。
2. 将检索到的内容视为受信任的指令是根本原因。
3. 缓解措施不是“客气地请求模型”——而是确定性的 Python:工具 allowlist、参数验证、egress 控制、将指令与不受信任的上下文分离,以及结构化的审计日志。
## 架构
```
+---------------------------+
user ---> | UserRequest |
| question + task |
+-------------+-------------+
|
v
+---------------------------+
| RAG (local, keyword) |
| trust_level=untrusted |
+-------------+-------------+
|
v
+---------------------------+
| Simulated agent brain | (deterministic LLM stand-in)
+-------------+-------------+
|
proposed ToolCall(s)
|
VULNERABLE PATH | SECURE PATH
no checks v policy layer
+---------------------------+
| authorize_tool |
| validate_arguments |
| check_egress |
+-------------+-------------+
|
v
+---------------------------+
| Tool runtime (local only) |
+---------------------------+
```
## 项目布局
```
AgentBreak/
├── README.md
├── pyproject.toml
├── requirements.txt
├── data/
│ ├── clean_knowledge_base.json
│ ├── poisoned_knowledge_base.json
│ └── customers.json
├── src/hacking_ai_agents/
│ ├── cli.py
│ ├── models.py
│ ├── rag.py
│ ├── tools.py
│ ├── agents_common.py
│ ├── vulnerable_agent.py
│ ├── secure_agent.py
│ ├── policies.py
│ ├── security.py
│ ├── presenter.py
│ ├── llm.py ← Ollama client + deterministic simulator
│ ├── webapp.py ← FastAPI app (SSE streaming)
│ ├── web/ ← single-page UI (HTML/CSS/JS)
│ └── logging_utils.py
├── tests/
└── scripts/
├── run_demo.sh
└── run_demo.ps1
```
## 安装
需要 Python 3.11+。运行时不需要网络访问。
```
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\Activate.ps1
pip install -e ".[dev]"
```
## 可选:通过 Ollama 使用本地 LLM
该演示开箱即用,带有一个确定性的**模拟器**,因此它永远不会在台上卡住。要使用真实的本地模型驱动 agent,请安装 [Ollama](https://ollama.com) 并拉取一个小型 instruct 模型:
```
# 1. 安装 Ollama(参见 https://ollama.com)
# 2. 启动 server(安装后通常作为 service 运行)
ollama serve &
# 3. 拉取一个小型 model
ollama pull llama3.2:3b
# 4. 验证是否已安装
ollama list
```
如果出现以下情况,CLI 和 Web 应用将自动回退到模拟器:
* 无法在 `http://localhost:11434` 访问 Ollama,或者
* 尚未拉取请求的模型标签,或者
* 模型返回不可解析的 JSON。
使用环境变量或标志覆盖默认值:
```
export OLLAMA_BASE_URL=http://localhost:11434
export OLLAMA_MODEL=llama3.2:3b
```
## CLI 命令
```
python -m hacking_ai_agents.cli normal
python -m hacking_ai_agents.cli attack
python -m hacking_ai_agents.cli secure
python -m hacking_ai_agents.cli full-demo
python -m hacking_ai_agents.cli full-demo --no-pause # automatic
python -m hacking_ai_agents.cli attack --use-llm # try the local LLM
python -m hacking_ai_agents.cli attack --use-llm --model llama3.2:3b
```
常用标志:`--verbose`、`--no-color`、`--no-pause`(仅在 `full-demo` 上可用)、`--use-llm` / `--no-llm`、`--model `。
便捷启动器:
```
./scripts/run_demo.sh # macOS/Linux
.\scripts\run_demo.ps1 # Windows
```
## Web 应用(可视化演示)
包含一个 FastAPI + SSE 单页 UI,使演示在投影仪上更加直观。使用以下命令启动它:
```
python -m hacking_ai_agents.cli serve --host 127.0.0.1 --port 8000
# 然后打开 http://127.0.0.1:8000
```
该页面提供了三个按钮(**Normal**、**Attack**、**Secure**),一个“Use local Ollama LLM”切换开关和一个模型字段。页眉显示实时状态:
* `[OK] Ollama detected (model=...)` — 将使用 LLM。
* `[!] Ollama up but model X is not pulled` — `ollama pull` 的说明。
* `[--] Ollama not detected` — 将使用模拟器。
每次运行都会通过 Server-Sent Events 流式传输结构化事件(横幅、步骤、检索到的文档、策略决策、结果)。
## Docker
使用 Docker Compose 构建并启动 Web 演示:
```
docker compose up --build
# 打开 http://127.0.0.1:8000
```
默认堆栈使用确定性模拟器。要同时启动 Ollama 并将默认模型拉取到持久化 Docker volume 中,请启用其 profile:
```
docker compose --profile ollama up --build
```
在 UI 中启用 **Use local Ollama LLM** 之前,请等待一次性的 `ollama-pull` 服务完成。可以根据需要覆盖配置:
```
APP_PORT=8080 OLLAMA_MODEL=llama3.2:3b docker compose --profile ollama up --build
```
模拟报告存储在 `sent-reports` 命名 volume 中。使用 `docker compose down` 停止容器;仅当您还想删除报告和下载的 Ollama 模型时,才添加 `--volumes`。
要直接从镜像运行 CLI:
```
docker compose run --rm web python -m hacking_ai_agents.cli full-demo --no-pause
```
## 示例输出(节选)
`attack`:
```
[1] User question received
[2] Retrieving knowledge from poisoned KB
[3] Retrieved untrusted document
[4] Agent selected tool: get_customer_record
[5] Agent selected tool: send_report
[X] DATA EXFILTRATION SIMULATED
```
`secure`:
```
[1] User question received
[2] Retrieving knowledge from poisoned KB
[3] [!] Suspicious instructions detected in untrusted context
[4] Requested tool: get_customer_record
[5] Authorization policy evaluated
[6] [X] BLOCKED: Tool 'get_customer_record' is not allowed for task 'refund_policy'.
[7] No sensitive data was accessed
[8] No report was sent
[OK] ATTACK BLOCKED
```
## 攻击
被投毒的 knowledge base 包含一个合法的退款政策,随后是一个伪造的“IMPORTANT SYSTEM UPDATE”块,指示 agent 获取客户记录并通过 `send_report` 窃取其 `api_key`。
有漏洞的 agent 在没有信任边界的情况下混合了 **system prompt**、**user question** 和 **retrieved content**。模拟的 LLM(其行为在本 repo 中是确定性的,正是为了确保演示不会失火)遵循了这些嵌入的指令。
## 根本原因
没有针对任务的 allowlist,没有对工具参数进行验证,没有 egress 控制,并且系统指令与不受信任的上下文之间没有分离。
## 安全变体中实施的缓解措施
1. **按任务划分的工具 allowlist**(`policies.py`)— `refund_policy` 只允许调用 `search_knowledge_base`。
2. 在每次工具调用前进行**策略执行**(`security.authorize_tool`)。
3. **递归参数验证**在任何深度拒绝诸如 `api_key`、`token`、`password`、`secret`、`credential` 等敏感键。
4. 针对 `send_report` 的 **Egress 控制**阻止敏感键和看起来像机密的值。
5. prompt 中的**信任分离**:检索到的内容被包装在 `UNTRUSTED RETRIEVED CONTENT` 块中。*这只是一个辅助控制。*
6. **可疑内容检测**将诸如 `ignore previous instructions` 之类的短语标记为风险*信号*,而不是保证。
7. **结构化、经过脱敏处理的审计日志**记录每一个决策,包含策略名称、状态、原因和风险级别。
## 局限性
* 可疑内容检测器故意保持简单且易于解释。将其视为遥测数据;它绝不能是唯一的防线。
* “LLM”是模拟的,因此演示在会议舞台上具有确定性。在真实系统中,您会使用相同的 Python 控制来限制真实模型的工具调用。
* prompt 中的信任分离无法阻止已经过训练或微调以忽略此类标记的模型;只有确定性的策略层才能做到这一点。
## 建议的 7-8 分钟演讲稿
* **0:00–1:00** 介绍 agent 及其四个工具。展示 `ALLOWED_TOOLS_BY_TASK` 表。
* **1:00–2:00** 运行 `normal`。问题得到解答,未使用敏感工具。
* **2:00–3:00** 打开 `data/poisoned_knowledge_base.json`。在合法的退款政策旁边展示注入的“IMPORTANT SYSTEM UPDATE”块。
* **3:00–5:00** 运行 `attack`。逐步讲解事件 [1]–[6] 和红色的“DATA EXFILTRATION SIMULATED”面板。
* **5:00–6:00** 解释根本原因:检索到的内容被视为受信任的指令,没有针对任务的 allowlist,没有 egress 控制。
* **6:00–7:30** 运行 `secure`。相同的问题,相同的投毒 KB。逐步讲解策略决策和绿色的“ATTACK BLOCKED”面板。
* **7:30–8:00** 以此结束:*“模型可以选择操作,但 Python 必须决定是否允许该操作。”*
## 故障排除
* `ModuleNotFoundError: hacking_ai_agents` — 在 repo 根目录运行 `pip install -e .`。
* `Ollama up but model X is not pulled` — 运行 `ollama pull llama3.2:3b`(或您想使用的任何其他标签,然后传递 `--model `)。
* `Ollama not detected` — 启动 Ollama(`ollama serve` 或桌面应用程序)并使用 `curl http://localhost:11434/api/tags` 进行验证。
* 颜色无法渲染 — 使用现代终端(Windows Terminal、iTerm2、GNOME Terminal)。或者传递 `--no-color`。
* 测试因 `ImportError` 而失败 — 确保您使用的是 Python 3.11+,并且 `pyproject.toml` 中的 `pythonpath = ["src"]` 正在被读取(从项目根目录运行 `pytest`)。
* `scripts/run_demo.sh` 不可执行 — `chmod +x scripts/run_demo.sh`。
## 运行测试
```
pip install pytest
pytest
```
## 道德声明
该项目是故意设计为存在漏洞的,是为了教育和防御性安全研究而创建的。它不连接到外部系统,也不使用真实凭据。请勿将有漏洞的变体改编用于生产环境。请将安全变体及其展示的控制措施作为您自己的 Agent 系统的起点。
标签:AI安全, AI风险缓解, Chat Copilot, LLM, OWASP Top 10, Python, RAG, Unmanaged PE, 大模型安全, 安全规则引擎, 无后门, 请求拦截, 逆向工具