Mustafa-Hazard/promptbreaker
GitHub: Mustafa-Hazard/promptbreaker
一个交互式的 LLM Prompt 注入攻防演示平台,通过模拟银行聊天机器人展示五种攻击技术及对应的分层防御方案。
Stars: 1 | Forks: 0
# PromptBreaker 🔴🟢



## 什么是 Prompt 注入?
大型语言模型在处理指令及其需要处理的内容时,使用的是相同的通道——这就意味着,在“开发者指令”与“声称是指令的用户提供文本”之间,不存在结构性的隔离。Prompt 注入正是利用了这一点:攻击者精心构造输入内容,使模型将其解析为新的指令,而非待处理的数据,从而导致模型无视其原有的约束条件,泄露受保护的信息,或者做出超出预期角色的行为。本项目通过一个虚构的银行支持聊天机器人(SecureBank Digital 的“Ava”——无真实机构,所有种子数据均为伪造),演示了针对该机制的 5 种不同攻击技术,并展示了一套在不影响机器人正常服务客户能力的前提下,成功拦截所有攻击的分层防御机制。
## 架构

- **Frontend:** React (Vite) —— 包含模式切换、攻击面板以及实时防御状态说明的聊天 UI
- **Backend:** Flask —— 单个 `/api/chat` endpoint,根据 `mode` 的不同,通过易受攻击或经过加固的代码路径进行路由
- **LLM:** Groq API (`llama-3.1-8b-instant`)
- **攻击工具:** `scripts/run_attacks.py` —— 向实时后端发送真实 payload,并将实际响应写入 `/docs/`
详细拆解见 [`docs/architecture-diagram.svg`](./docs/architecture-diagram.svg)。
## 攻击类别 (5)
| # | 攻击 | 功能描述 |
|---|---|---|
| 01 | [直接注入](./docs/attacks/01-direct-injection.md) | 直接指示模型无视其 system prompt |
| 02 | [角色劫持](./docs/attacks/02-role-hijacking.md) | 为模型重新分配一个无任何限制的新人设 |
| 03 | [数据泄露](./docs/attacks/03-data-exfiltration.md) | 虚构一个看似合理的权威(如“审计员”)来直接索取机密 |
| 04 | [间接注入](./docs/attacks/04-indirect-injection.md) | 将指令隐藏在模型被要求总结的内容中 |
| 05 | [上下文操纵](./docs/attacks/05-context-manipulation.md) | 伪造一段从未发生过的先前对话 |
针对易受攻击模式,这 5 种攻击均取得了成功——请参阅各个链接文档查看实时捕获的 payload 和响应。
## 防御层
共三层防御,每一层都会捕获其他层遗漏的攻击:
1. **[输入清理](./docs/defenses/input-sanitization.md)** —— 在到达模型之前,对已知的注入措辞进行模式匹配
2. **[Prompt 加固](./docs/defenses/prompt-hardening.md)** —— 将指令完整性规则、无状态提醒以及明确的内容/指令隔离机制内置到 system prompt 中
3. **[输出验证](./docs/defenses/output-validation.md)** —— 扫描模型响应中的实际诱饵机密,并在返回给用户之前进行脱敏处理
每个经过加固模式的响应都会通过 `defense_layer` 字段报告是否有防御层(以及哪一层)介入,以便 UI 的防御面板准确展示请求被拦截的具体原因,而不留任何悬念。
## 结果
每种模式各进行 25 次尝试(5 种攻击 × 每种运行 5 次,因为 LLM 的响应是非确定性的,单次运行结果不足为凭):
| 模式 | 泄露机密 |
|---|---|
| 易受攻击 | 因攻击类型而异,介于 20%–100% 之间 |
| 加固后 | **0/25 (0%)** |
不同攻击*形式*被不同的防御层拦截——直接的注入措辞(攻击 01、02、04)在到达模型之前就被清理器拦截;而社会工程学话术(攻击 03、05)虽然绕过了清理器,但在加固 prompt 的规则下被模型本身拒绝。请参阅 [`docs/owasp-llm-mapping.md`](./docs/owasp-llm-mapping.md) 查看完整的 OWASP Top 10 映射,以及 [`docs/attacks/`](./docs/attacks/) 查看每种攻击的可靠性数据。
## OWASP LLM Top 10 映射
请参阅 [`docs/owasp-llm-mapping.md`](./docs/owasp-llm-mapping.md) 查看每种攻击和防御层对应 OWASP 2025 类别的完整明细。
## 技术栈
- **Frontend:** React (Vite)
- **Backend:** Flask
- **LLM:** Groq API
- **基础设施:** Docker Compose, GitHub Actions CI/CD
## 快速开始
```
git clone https://github.com/Mustafa-Hazard/promptbreaker.git
cd promptbreaker
cp .env.example .env
# 在 .env 中填写你的 GROQ_API_KEY — 在 console.groq.com 免费获取
```
## 使用 Docker Compose 运行
```
docker compose up --build
```
- Frontend: http://localhost:3000
- Backend 健康检查: http://localhost:5000/api/health
## 不使用 Docker 运行
```
# terminal 1
cd backend
pip install -r requirements.txt
flask --app "app:create_app()" run --port 5000
# terminal 2
cd frontend
npm install
npm run dev
```
## 运行攻击套件
```
pip install -r backend/requirements-dev.txt
python scripts/run_attacks.py --runs 5
```
需要先运行后端。它会根据实时响应重新生成 `docs/attacks/*.md`——记录的是真实捕获,而非捏造的示例。
## 运行测试
```
cd backend
pytest tests/ -v
```
## 项目结构
```
promptbreaker/
├── backend/ Flask app: routes, services (LLM client,
│ sanitizer, validator), prompts, tests
├── frontend/ React app: chat UI, mode toggle, attack panel,
│ defense explainer
├── scripts/ Attack runner (Python, hits the live API)
├── docs/
│ ├── phases/ Build log, one file per development phase
│ ├── attacks/ Live-captured attack results (generated)
│ ├── defenses/ Explanation of each defense layer
│ ├── owasp-llm-mapping.md
│ └── architecture-diagram.svg
└── docker-compose.yml
```
## 构建日志
请参阅 [`/docs/phases`](./docs/phases) 获取按阶段划分的开发日志,包括开发过程中遇到并修复的真实 Bug——如依赖版本固定问题、缺失的分支保护设置等。
## 已知局限性
- **非确定性**:结果是在 `temperature=0.7` 下通过真实的 LLM 捕获的;单次运行会有差异,这也是为什么 `run_attacks.py` 支持 `--runs N` 且文档报告的是概率而非单一结果的原因。
- **基于模式的防御存在已知盲区**:如果使用了足够新颖的措辞,清理器是可以被绕过的;而且输出验证器只能捕获符合已知模式的机密——详情请参阅各个防御文档中的“它做不到什么”部分。
- **单轮对话,无真实对话记忆**:`/api/chat` 每次请求都是无状态的;前端会保留用于展示的消息历史记录,但后端并不会验证关于前几轮对话的声明(这本身就被“上下文操纵”攻击所利用)。
- **仅限于 OWASP LLM Top 10 的子集**:本项目涵盖 prompt 注入、敏感信息泄露和 system prompt 泄露。它不包含工具访问、RAG pipeline 或 fine-tuning 步骤,因此像过度代理或向量/嵌入漏洞等类别在此不适用——请参阅 `docs/owasp-llm-mapping.md` 了解超出范围的内容及其原因。
## 作者
**Mustafa Hazard**
[GitHub](https://github.com/Mustafa-Hazard)
## 许可证
[MIT](./LICENSE)
标签:AI安全, Chat Copilot, DLL 劫持, Flask, React, Syscalls, Sysdig, 大语言模型, 提示注入, 攻防演示, 请求拦截, 逆向工具, 集群管理