CyberSunil/LLMVault
GitHub: CyberSunil/LLMVault
LLMVault 是一个刻意包含漏洞的 OWASP LLM Top 10 实战培训靶场,通过 CTF 风格的递进式实验帮助用户学习 AI 安全攻防技能。
Stars: 215 | Forks: 53
终极实战 OWASP LLM Top 10 培训平台
## 🎬 演示
学习 • 利用 • 防御
|
蓝色 **Master** 卡片 = 核心与高级难度已完成 · 绿色 **Beginner** 卡片 = 核心难度已完成。预览图反映了真实主题;你可以随时替换为自己的截图 —— 见 docs/。
## 🧩 核心难度 — OWASP LLM Top 10
| OWASP (2025) | 实验 | 技术 |
|---|---|---|
| LLM01 Prompt Injection | The Obedient Assistant | 直接指令覆盖 |
| LLM02 Sensitive Info Disclosure | Redaction Theater | 通过编码绕过输出过滤 |
| LLM03 Supply Chain | Trust the Manifest? | 仿冒/未签名依赖 |
| LLM04 Data & Model Poisoning | The Sleeper Phrase | 投毒数据后门触发器 |
| LLM05 Improper Output Handling | Rendered Without Question | 未净化的输出 → 注入 |
| LLM06 Excessive Agency | Keys to the Kingdom | 过度授权的工具,无 authz |
| LLM07 System Prompt Leakage | Loose Lips | 从 system prompt 泄露的机密 |
| LLM08 Vector & Embedding | Retrieval Without Borders | RAG 检索忽略 ACL |
| LLM09 Misinformation | The Yes-Man | 谄媚 / 虚假权威 |
| LLM10 Unbounded Consumption | Denial of Wallet | 失控生成 + 错误信息泄露 |
## 🔥 高级难度 — 多轮对话挑战(完成所有 10 个核心挑战后解锁)
这些是 **对话型** 的:没有哪条单独的消息能直接通关 —— 它们需要在多轮对话中建立状态(角色扮演升级、迭代投毒、工具链、预言机查询)。
| OWASP | 实验 | 高级技术 |
|---|---|---|
| LLM01 | Roleplay Unchained | 通过角色升级的 **多轮越狱** |
| LLM02 | Death by a Thousand Hints | 从部分泄露的预言机中进行片段重构 |
| LLM03 | The Tampered Registry | 已部署与规范哈希关联对比 |
| LLM04 | Teach Me Wrong | 对在线学习过滤器的 **主动数据投毒** |
| LLM05 | The Note Keeper | **存储型 / 二阶** 注入 |
| LLM06 | Confused Deputy | **智能体工具链**(通过 SSRF 访问内部元数据) |
| LLM07 | Method Actor | 多种技术结合的 system prompt 提取 |
| LLM08 | Crossed Wires | 跨租户 RAG 记忆泄露 |
| LLM09 | The Confident Liar | 幻觉 → 过度依赖级联 |
| LLM10 | The Oracle | **基于查询的模型提取** |
## ⚔️ 专家难度 — 真实世界攻击类别(解决所有高级挑战后解锁)
五个 **专家** 实验模拟了针对 LLM 系统的、现实世界中已披露漏洞的攻击类别。每个实验都是 **模拟的** —— 应用程序会识别已知的 payload 并返回 flag;工具中不会发生真实的 RCE/SSRF/SQL。
**该难度在发布时是加密的,此处故意不列出其内容。** 挑战和 flag 被通过 AES(Fernet)加密到 `challenges/expert.enc` 文件中,密钥由一个仅存在于运营者私有保险库(绝不在代码库中)的秘密 **Expert Access Key** 派生而来。克隆该代码库只能获取密文;在你获得资格之前,具体的场景将一直保密。为了解锁,玩家必须 (1) 完成所有核心 + 高级实验,并且 (2) 输入由运营者(**CyberSunil**)在玩家分享其通关卡片后 **手动** 发放的密钥。密钥错误 → 认证解密失败 → 不会暴露任何内容。
## 🚀 运行它
```
pip install -r requirements.txt
python app.py
# 打开 http://127.0.0.1:5000
```
无需 API key —— 漏洞助手是 **确定性/脚本化** 的,因此 flag 能可靠复现,并且整个靶场可以完全离线运行。
## 🐳 使用 Docker 运行
```
# 构建 + 运行
docker compose up --build # then open http://127.0.0.1:5000
# 或使用普通 docker:
docker build -t llmvault .
docker run -p 5000:5000 llmvault
```
由 gunicorn 提供服务(单工作进程,以保持内存中的记分板数据一致)。
**不要将其暴露在公共互联网上** —— 它存在蓄意设置的漏洞。如果仅需绑定到 localhost,请在 `docker-compose.yml` 中使用 `"127.0.0.1:5000:5000"`。
## 💾 持久化(支持自托管)
进度和记分板会保存到 `data/progress.json` —— **无需数据库** —— 因此它们在页面刷新 *和* 服务器/容器重启后依然存在。在 Docker 中,`./data` 卷会在执行 `docker compose down/up` 后保留它们。删除该文件即可重置所有人的进度。
## 🙋 玩家体验
- **首次运行名称限制**(设置后即锁定)以及在你首次进行实验时的 **一次性引导教程**。
- 当你解决一个实验后,会弹出一个 **📘 Learn — the fix** 面板,揭示该 OWASP 类别的防御课程。
- **响应式布局** —— 可在手机上使用(侧边栏会折叠,面板会堆叠)。
## 🕹️ 游戏玩法
1. 首次启动时,你需要设置一个 **玩家名称**(选择后即锁定 —— 之后无法更改)。
2. 挑战 **核心** 实验;利用该类别的技术让每个助手泄露其 flag。
3. 完成所有 10 个核心实验以解锁 **高级难度**;完成所有高级实验以解锁 **专家难度**。
4. 如果遇到困难,可以查看 **提示**(每查看一次扣 5 分)。提交 flag(格式为 `LLMVAULT{...}`,可在 `config.py` 中配置)。
5. 卡片在悬停时会 **浮动**,并在解决后变为 **绿色**;在 **记分板** 上跟踪所有内容。
**计分:** 核心 100–300 分,高级 400 分,专家 500 分;提示花费分别为 10 / 25 / 50(逐步递增)。
## 🎓 通关卡片与分享
当你完成一个难度时,两张里程碑卡片会作为弹出窗口自动解锁:一张 **绿色 Beginner** 卡片(完成所有 10 个核心实验)和一张 **蓝色 Master** 卡片(完成所有 20 个核心 + 高级实验)。这两张卡片也可以在 `/completion` 找到。每张卡片都有一个 **下载卡片 (PNG/SVG)** 按钮、一段预写好的配文(复制)以及 LinkedIn/X 的开场白。
**分享图片:** 社交网站无法通过分享链接自动附加图片,因此流程是:**下载卡片 → 打开 LinkedIn/X → 粘贴配文 → 附上图片。** 玩家发布它并标记 **CyberSunil** 以接收 Expert Access Key。该卡片在服务器端渲染为带主题的 SVG(`/card.svg`),并在浏览器中导出为 PNG —— 无需外部依赖。
## 🧱 架构
```
app.py # Flask: labs, chat, hint, submit, scoreboard, name-gate, unlock gating
config.py # APP_NAME, AUTHOR/COPYRIGHT, flag prefix, scoring
challenges/
__init__.py # Challenge base (tier), registry, core_labs()/advanced_labs()
llm01_..llm10_*.py # core labs
advanced/a01_..a10_*.py # advanced multi-turn labs
expert.enc # ENCRYPTED expert tier (ciphertext, shipped)
expert_meta.json # public KDF salt/params
expert_vault.py # runtime decryptor + declarative challenge engine
templates/ static/ # dark violet UI + completion card + expert key gate
Dockerfile docker-compose.yml # containerised deploy
LICENSE # MIT + security notice
```
每个挑战都是一个 `Challenge` 子类,带有一个用于编码漏洞的 `respond(message, state)` 方法;高级实验使用持久化的 `state` 字典来实现多轮逻辑。通过在 `challenges/`(或 `challenges/advanced/`)中放入一个模块并注册它,即可添加你自己的挑战。
## 👤 致谢与许可
由 **CyberSunil** 制作。© 2026 CyberSunil。在 **MIT License** 下发布(见 `LICENSE`),并附带安全声明:该项目是刻意设置漏洞的,仅供授权培训使用。作者致谢信息会显示在每个页面上,且不可在运行时编辑。
*在这里突破它,以便你能在任何地方防御它。*
欢迎贡献 —— 见 [CONTRIBUTING.md](CONTRIBUTING.md)。安全策略:[SECURITY.md](SECURITY.md)。标签:请求拦截, 逆向工具