AISecurityConsortium/AIGoat

GitHub: AISecurityConsortium/AIGoat

一个基于电商场景的AI安全靶场平台,通过攻击内置漏洞机器人来实践OWASP LLM Top 10相关的对抗技术与防御策略。

Stars: 21 | Forks: 3

AI Goat Shop

AI Goat Shop

通过攻击真实的 AI 电商应用来学习 AI 安全。

Python 3.11+ Node 18+ OWASP LLM Top 10 License: MIT

## 什么是 AI Goat Shop? AI Goat Shop 是一个内置了名为 **Cracky** 的 AI 聊天机器人的在线商店。该商店看起来和用起来都像一个真实的电商网站——你可以浏览商品、下订单、留下评论,并与 AI 助手聊天。 关键点在于:Cracky 存在你可以利用的真实安全漏洞。每一个漏洞都对应于 [OWASP Top 10 for LLM Applications](https://genai.owasp.org/llm-top-10/),这是 AI/LLM 安全风险的行业标准。 该平台为你提供: - **9 个攻击实验室** —— 指导性练习,教你如何利用特定的 AI 漏洞 - **9 个 CTF 挑战** —— 夺旗赛挑战,通过成功攻击聊天机器人来赚取积分 - **3 个防御等级** —— 查看开启防御后同一攻击的表现 - **可污染的知识库** —— 注入虚假文档并观察 AI 信任它们的过程 一切都在你的电脑上本地运行。无需云账户。无需 API 密钥。设置完成后无需联网。 ## 适用人群? - 首次学习 AI 安全的 **学生** - 实践研究 LLM 漏洞的 **安全工程师** - 练习对抗性 AI 技术的 **红队成员** - 对 AI 聊天机器人如何被欺骗感到好奇的 **任何人** ## 快速开始 ### 前置条件 | 工具 | 用途 | 安装 | |------|---------|---------| | **Python 3.11+** | 后端服务器 | [python.org](https://www.python.org/downloads/) | | **Node.js 18+** | 前端应用 | [nodejs.org](https://nodejs.org/) | | **Ollama** | 本地 AI 模型 | [ollama.ai](https://ollama.ai/) | ### 一键启动 ``` git clone https://github.com/AISecurityConsortium/AIGoat.git cd AIGoat ./scripts/start.sh ``` 就是这样。该脚本将: 1. 检查 Ollama 是否正在运行(如果没有则启动它) 2. 如果尚未安装 Mistral AI 模型,则下载它 3. 使用演示数据设置数据库 4. 启动后端 API 服务器 5. 启动前端 Web 应用程序 当你看到 "AI Goat is running!" 时,打开浏览器: | 内容 | URL | |------|-----| | **应用程序** | http://localhost:3000 | | **API 文档** | http://localhost:8000/docs | ### 登录凭证 | 用户名 | 密码 | 角色 | |----------|----------|------| | `alice` | `password123` | 普通用户 | | `bob` | `password123` | 普通用户 | | `charlie` | `password123` | 普通用户 | | `admin` | `admin123` | 管理员 | ### 停止应用程序 ``` ./scripts/stop.sh ``` ### 重新开始(重置数据库) ``` ./scripts/stop.sh --clean ./scripts/start.sh ``` 或者使用简写: ``` ./scripts/start.sh --fresh ``` ### Docker(替代方案) ``` # 一次性设置:创建持久化 model volume docker volume create ollama_models # 启动应用 cd docker docker-compose up --build ``` Docker 设置启动三个容器:backend、frontend(通过 Nginx)和 Ollama。首次运行时,后端会自动拉取 Mistral 模型(约 4.5 GB)。 `ollama_models` 卷是 **外部的** —— 它在 `docker-compose down -v` 后依然保留,因此模型只需下载一次。要在不重新下载模型的情况下重置应用数据(数据库、挑战): ``` docker-compose down -v # removes app data, keeps model docker-compose up -d # re-seeds on next startup ``` ## 应用程序如何工作 ### AI 聊天机器人 (Cracky) Cracky 是 AI 购物助手。它可以回答有关商品的问题、查询订单并帮助客户。在 **防御等级 0**(易受攻击)下,Cracky 没有安全保护 —— 它会随意分享内部数据、遵循注入的指令并采用虚假的人设。 你可以通过每个页面上可用的聊天小部件与 Cracky 互动。 ### 防御等级 使用导航栏中的切换开关在以下等级之间切换: | 等级 | 名称 | 发生什么 | |-------|------|-------------| | **0** | 易受攻击 | 无保护。所有攻击都有效。这是你的起点。 | | **1** | 加固 | 输入验证、意图分类和输出过滤已激活。一些攻击仍然可以通过创造性的措辞生效。 | | **2** | 设防 | 完整的 NVIDIA NeMo Guardrails 已激活。大多数直接攻击被阻止。只有高级技术才有可能成功。 | ### 知识库 知识库页面允许你添加、编辑和删除聊天机器人用作参考材料的文档。这是一个故意的攻击面 —— 你可以注入虚假信息并观察聊天机器人信任它。 添加或修改条目后,点击 **"Sync to Vector DB"** 将更改推送到聊天机器人的检索管道。 ## 攻击实验室 攻击实验室是指导性练习。每个实验室针对特定的 OWASP LLM 漏洞,提供示例提示词,并解释在每个防御等级下要注意什么。 从侧边栏导航到 **Attack Labs** 页面。 | OWASP | 实验室 | 你将学到什么 | |-------|-----|---------------| | **LLM01** | 提示词注入(3 个实验室) | 覆盖聊天机器人指令、注入隐藏命令、链接多轮攻击 | | **LLM02** | 敏感信息泄露(3 个实验室) | 从聊天机器人上下文中提取管理员凭证、客户数据、内部配置 | | **LLM04** | 数据投毒(3 个实验室) | 通过聊天机器人重复为事实的评论和提示注入虚假信息 | | **LLM05** | 不安全输出 (XSS) | 使聊天机器人生成在浏览器中执行的 HTML/JavaScript | | **LLM07** | 系统提示词泄露 | 提取聊天机器人的隐藏系统指令,包括其机密配置块 | | **LLM08** | RAG 弱点(3 个实验室) | 污染知识库、操纵向量检索、淹没上下文窗口 | | **LLM09** | 虚假信息(3 个实验室) | 诱骗聊天机器人伪造认证、认可和安全数据 | ## 挑战 挑战是 CTF 风格(夺旗赛)的任务。你可以通过成功利用漏洞并提交聊天机器人响应中出现的 flag 来获得积分。 从侧边栏导航到 **Challenges** 页面。 ### 挑战如何运作 每个挑战都有自己 **专用的聊天窗口**,与主商店聊天机器人完全分开。 1. **点击挑战卡片** 打开其详情视图 2. **点击 "Start Challenge"** 激活专用的挑战聊天 3. **使用挑战聊天** 来精心设计你的攻击(对于 KB 挑战,在聊天标题中启用 KB 切换) 4. 当你成功时,一个 **flag**(如 `AIGOAT{a1b2c3d4...}`)会出现在聊天回复中 5. **复制 flag** 并将其粘贴到左侧面板的提交字段中 ### 挑战列表 | # | 名称 | 难度 | 分数 | 交互方式 | |---|------|-----------|--------|----------------| | 1 | 提示词注入 | 初级 | 100 | 聊天机器人 | | 2 | 系统提示词提取 | 初级 | 100 | 聊天机器人 | | 3 | RAG 知识库投毒 | 初级 | 150 | 知识库 + 聊天机器人 | | 4 | 上下文覆盖 | 初级 | 100 | 聊天机器人 | | 5 | 多轮升级 | 中级 | 250 | 聊天机器人(3 条以上消息) | | 6 | 身份劫持 | 中级 | 200 | 聊天机器人 | | 7 | 权威上下文投毒 | 中级 | 300 | 知识库 + 聊天机器人 | | 8 | 链式 KB + 注入 | 中级 | 400 | 知识库 + 聊天机器人 | | 9 | 防护栏侵蚀 | 中级 | 500 | 聊天机器人(4 条以上消息) | **可能获得的总分:2,100** Flags 对于每个用户是唯一的并且是动态生成的 —— 你无法在源代码中找到它们。 有关完整的演练解决方案,请参阅 [docs/challenges-walkthrough.md](docs/challenges-walkthrough.md)。 ## 架构 ``` graph TB subgraph User["User's Browser"] FE["React 18 + Material-UI
(Port 3000)"] end subgraph Backend["FastAPI Backend (Port 8000)"] API["API Routes
/api/chat, /api/products,
/api/auth, /api/knowledge-base"] MW["JWT Auth Middleware"] subgraph Defense["Defense Pipeline"] L0["Level 0: Vulnerable
(no checks, passthrough)"] L1["Level 1: Hardened
Input Validator → Intent Classifier
→ Policy Engine → Output Moderator"] L2["Level 2: Guardrailed
NeMo Guardrails + Colang Rules"] end CE["Challenge Engine
9 Evaluators + HMAC Flag Generator"] RAG["RAG Subsystem
Query Rewriter → Retriever → Context Builder"] end subgraph Storage["Data Layer"] DB[("SQLite
Users, Orders, Products,
Challenges, Telemetry")] VDB[("ChromaDB
Vector Embeddings
for Knowledge Base")] end subgraph AI["AI Layer"] OLLAMA["Ollama
(Local LLM - Mistral)"] EMB["Sentence Transformers
(all-MiniLM-L6-v2)"] end subgraph Guardrails["NeMo Guardrails (Level 2)"] INPUT_RAILS["Input Rails
Injection, Jailbreak, Sensitive Data,
Social Engineering, Off-topic"] OUTPUT_RAILS["Output Rails
PII Detection, Prompt Leak,
HTML/XSS, Hallucination"] end FE -->|"REST API + SSE (streaming)"| MW MW --> API API --> Defense L0 -->|"No checks"| OLLAMA L1 -->|"Validated + classified"| OLLAMA L2 --> INPUT_RAILS INPUT_RAILS -->|"Blocked → canned response"| API INPUT_RAILS -->|"Allowed"| OLLAMA OLLAMA --> OUTPUT_RAILS OUTPUT_RAILS -->|"Clean"| API OUTPUT_RAILS -->|"Blocked → safe response"| API API --> CE CE -->|"Evaluate exploit → emit flag"| API API --> RAG RAG --> VDB RAG --> EMB EMB --> VDB API --> DB OLLAMA -.->|"Local inference
Port 11434"| AI ``` **数据如何在系统中流动:** 1. **React 前端** 向 **FastAPI 后端** 发送 API 请求。 2. 每个请求都通过 **JWT 认证中间件**。 3. 聊天消息进入 **防御管道**,该管道根据当前防御等级(0、1 或 2)应用检查。 4. 在 **等级 2**,NeMo Guardrails 首先检查输入。如果检测到威胁,消息永远不会到达 AI —— 立即返回预设的拒绝响应。 5. 如果消息通过输入检查,它会转到 **Ollama**(本地 AI 模型)以获取响应。 6. AI 的响应在到达用户之前通过 **输出护栏**(PII 检测、提示词泄露检测、HTML/XSS 检测)。 7. **挑战** 有自己专用的聊天端点 (`/api/challenges/{id}/chat`),带有特定于挑战的提示词。**挑战引擎** 评估利用是否成功,并将动态 flag 注入到响应中。 8. 当启用 KB 集成时,**RAG 子系统** 从 **ChromaDB** 检索相关的知识库文档。 ## 项目结构 ``` AIGoat/ ├── app/ Python backend (FastAPI) │ ├── api/ API route handlers │ ├── challenges/ Flag engine and 9 exploit evaluators │ ├── core/ Config, database, security utilities │ ├── defense/ Input validation, intent classification, output moderation │ ├── models/ Database models (SQLAlchemy) │ ├── rag/ Knowledge Base retrieval (ChromaDB + embeddings) │ └── services/ Business logic (cart, orders, chat) ├── config/ │ ├── config.yml Main configuration file │ └── labs.yml Attack lab definitions ├── frontend/ React application (Material-UI) ├── prompts/ System prompts for each defense level and lab │ ├── level0/ Vulnerable (no restrictions) │ ├── level1/ Hardened (with security rules) │ ├── level2/ Guardrailed (strict containment) │ ├── labs/ Lab-specific vulnerable prompts │ └── challenges/ Challenge-specific system prompts (one per challenge) ├── guardrails/ NeMo Guardrails config (Level 2) ├── scripts/ │ ├── start.sh Start the application │ ├── stop.sh Stop the application │ └── seed.py Database seeding script ├── docs/ │ ├── workshop-guide.md Instructor guide for workshops │ └── challenges-walkthrough.md Full challenge solutions ├── media/ Product images and logo └── docker/ Docker Compose setup ``` ## 配置 所有设置都在 `config/config.yml` 中: ``` app: secret_key: "aigoat-dev-secret-change-in-production" ollama: base_url: "http://localhost:11434" model: "mistral" defense: level: 0 # Default defense level (0, 1, or 2) rag: enabled: true top_k: 5 # Number of KB documents retrieved per query ``` ## 硬件要求 | 资源 | 最低要求 | 推荐配置 | |----------|---------|-------------| | **RAM** | **8 GB 可用**(不是总量 —— 是 *可用*) | 16 GB+ 总量 | | **磁盘** | 6 GB(应用 + Mistral 模型权重) | 10 GB | | **CPU** | 4 核 | 8+ 核 | | **GPU** | 非必需,但 **强烈推荐** | 任何具有 6 GB+ 显存的 NVIDIA/Apple Silicon GPU | ### 为什么你需要 GPU 没有 GPU,每次聊天响应都在你的 CPU 上运行,需要 **10-30 秒**。使用 GPU(NVIDIA CUDA 或 Apple Silicon Metal),响应会在 **1-3 秒** 内返回。如果你有支持的 GPU,Ollama 将自动使用它 —— 无需配置。 ### Docker 用户 Docker 容器共享同一池的 RAM。你必须为 Docker Desktop 分配 **至少 12 GB 的 RAM** —— Mistral 模型(4.5 GB)加上后端(PyTorch、sentence-transformers:约 3 GB)加上操作系统开销,在默认的 8 GB 设置下没有剩余空间。 **Docker Desktop → Settings → Resources → Memory → 设置为 12 GB 或更高** 如果你的机器总共只有 8 GB RAM,请执行以下操作之一: 1. 在主机上**本地运行 Ollama**(Docker 外部)并将后端指向它,或者 2. 在 `docker/config.yml` 中切换到更小的模型如 `tinyllama`,并更新 `docker-compose.yml` 中的 `ollama-pull` 入口点 要在 Docker 中进行 GPU 直通,请使用 NVIDIA Container Toolkit (`--gpus all`) 或在主机上本地运行 Ollama 并将后端指向它。 ## 故障排除 **"Ollama not reachable"**:从 [ollama.ai](https://ollama.ai/) 安装 Ollama 并确保它正在运行 (`ollama serve`)。 **聊天机器人很慢**:Ollama 默认在 CPU 上运行 AI 模型。GPU 可显著提高速度。你也可以通过将 `config/config.yml` 中的 `ollama.model` 更改为 `"tinyllama"` 来尝试更小的模型。 **"Port already in use"**:先运行 `./scripts/stop.sh`,或者手动终止端口 8000 和 3000 上的进程。 **前端显示空白页**:检查后端是否在 http://localhost:8000 运行。前端依赖于 API。 **知识库未影响聊天机器人**:添加/编辑 KB 条目后,你必须点击知识库页面上的 **"Sync to Vector DB"**,并在聊天机器人中启用 **KB 切换**。 ## 安全声明 AI Goat Shop 是故意设计成易受攻击的软件。这些漏洞是功能,而不是错误。 **故意的漏洞(请勿报告):** 提示词注入、系统提示词提取、RAG 投毒、数据泄露、等级 0 下通过聊天机器人输出的 XSS、弱默认凭证。 **非故意的漏洞(请报告):** 身份验证绕过、任意代码执行、容器逃逸、后端中的 SQL 注入、路径遍历。 有关完整的披露政策,请参阅 [SECURITY.md](SECURITY.md)。 ## 许可证 [MIT License](LICENSE)

Made with ❤️ by Farooq and Nal

标签:AI安全, AI风险缓解, Chatbot安全, Chat Copilot, GNU通用公共许可证, MITM代理, Node.js, OPA, OWASP Top 10 LLM, Python, 人工智能, 域名收集, 大模型安全, 安全教育, 对抗性攻击, 提示注入, 无后门, 用户模式Hook绕过, 电商系统, 知识库投毒, 自定义脚本, 请求拦截, 逆向工具, 集群管理, 靶场