Mustafa-Hazard/promptbreaker

GitHub: Mustafa-Hazard/promptbreaker

一个交互式的 LLM Prompt 注入攻防演示平台,通过模拟银行聊天机器人展示五种攻击技术及对应的分层防御方案。

Stars: 1 | Forks: 0

# PromptBreaker 🔴🟢 ![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/96/96fc34eaa99eb435d3594cd67aca32043358fe2dd7a85149b8ad4e0e8accb32f.svg) ![Docker Build](https://static.pigsec.cn/wp-content/uploads/repos/cas/24/24659684161444500b39f6a2f47d6d8eabf525af724606c4c259ae53fcaf09a6.svg) ![License](https://img.shields.io/badge/license-MIT-blue.svg) ## 什么是 Prompt 注入? 大型语言模型在处理指令及其需要处理的内容时,使用的是相同的通道——这就意味着,在“开发者指令”与“声称是指令的用户提供文本”之间,不存在结构性的隔离。Prompt 注入正是利用了这一点:攻击者精心构造输入内容,使模型将其解析为新的指令,而非待处理的数据,从而导致模型无视其原有的约束条件,泄露受保护的信息,或者做出超出预期角色的行为。本项目通过一个虚构的银行支持聊天机器人(SecureBank Digital 的“Ava”——无真实机构,所有种子数据均为伪造),演示了针对该机制的 5 种不同攻击技术,并展示了一套在不影响机器人正常服务客户能力的前提下,成功拦截所有攻击的分层防御机制。 ## 架构 ![架构图](https://static.pigsec.cn/wp-content/uploads/repos/cas/70/70b8a9f7f355eea5109d29df16d06c1c44a0ab3b92359022536fa8df99aa3a47.svg) - **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, 大语言模型, 提示注入, 攻防演示, 请求拦截, 逆向工具, 集群管理