Patcy-AI/ai-agent-security-lab
GitHub: Patcy-AI/ai-agent-security-lab
一个 LLM Agent 安全实操实验室,通过分阶段攻击与加固真实 RAG 聊天机器人,教授 Prompt 注入攻防与架构级安全设计。
Stars: 0 | Forks: 0
# Patcy AISec — AI Agent 安全实验室
**构建 → 破坏 → 防御 → 锁定。** 这是一个实操实验室,采用一个真实的 RAG chatbot,并分三个阶段对其进行安全加固,证明在现实世界中破坏 AI agent 的攻击面前,具备进攻(红队)和防御(蓝队)的能力。
`ai-security` · `llm-security` · `prompt-injection` · `ai-red-teaming` · `owasp-llm` · `rag-security` · `langchain` · `ollama` · `python`
**新接触这个?** [`CODE_WALKTHROUGH.md`](CODE_WALKTHROUGH.md) 以通俗易懂的英语、结合修改前后的代码和图表,准确解释了为了让 agent 变得安全而做出的改变,以及易受攻击版本在架构上缺失了什么。
## 实时演示
一个一键托管版本,`streamlit_app.py`,在免费的托管 LLM(Groq)上运行整个三部曲,任何人都可以在浏览器中对其进行攻击 —— 选择 **A / B / C**,然后尝试窃取密钥,并观察每种防御是如何触发(或被绕过)的。部署步骤:[`DEPLOY.md`](DEPLOY.md)。
**实时演示:** https://patcy-ai-agent-security-lab.streamlit.app
## 结果(评分表)
同一个 agent,使用相同的攻击手册,在三个安全成熟度下的表现:
| Agent | 设计 | 基础 prompt injection | 间接(有毒文档) | 直接泄露尝试 | 高级(编码)攻击 | 密钥泄露了? |
|---|---|---|---|---|---|---|
| **A — 易受攻击** | 密钥在 prompt 中,无防护 | 泄露 | 泄露 | 泄露 | 泄露 | **是 — 轻而易举** |
| **B — 已加固** | input guard + sanitizer + output filter | 阻止 | 阻止 | 捕获并编辑 | **绕过了 regex filter** | **仅在高级攻击下** |
| **C — 已锁定** | 密钥从 model 中移除 + vault + 全部防护 | 阻止 | 阻止 | 无可泄露 | 无可泄露 | **否 — 密钥从不在 model 中** |
**结论:** 指令和过滤器都是可以被绕过的;最强大的控制是架构层面的 —— 永远不要把密钥给 model(最小权限 / 数据最小化)。
## 架构
```
flowchart LR
U[User message] --> IG{Input Guard
regex firewall} IG -- attack pattern --> R1[Refuse politely] IG -- passes --> RET[RAG retrieval] RET --> CS[Context Sanitizer
strip hidden instructions] CS --> LLM[LLM · llama3.2:3b via Ollama] VAULT[(Server-side vault · secret
Agent C only)] -. authenticated staff tool .-> LLM LLM --> OF{Output Filter
regex redaction} OF -- secret detected --> RED[Redact -> serve] OF -- clean --> OUT[Serve reply] ``` **安全 pipeline(Agent B/C):** 每条用户消息都会通过 **input guard**,检索到的文档会被 **sanitize**(被视为不受信任的数据),model 运行后,其回复会通过 **output filter**。在 **Agent C** 中,密钥根本不在 model 中 —— 它存在于一个服务端 vault 中,只能由用户无法调用的、经过身份验证的员工工具释放。 ## 已测试的攻击,映射到行业标准框架 | 攻击 | 作用 | OWASP LLM Top 10 | MITRE ATLAS | |---|---|---|---| | 直接 prompt injection | 用户覆盖应用程序的指令 | LLM01 | Prompt injection | | 间接 prompt injection | 检索到的文档中隐藏的指令 | LLM01 | LLM prompt injection (indirect) | | System-prompt / 密钥提取 | model 暴露其隐藏的配置/密钥 | LLM07 / LLM02 | Exfiltration | | 越狱 / 绕过 guardrail | 精心构造的 prompt 绕过安全规则 | LLM01 | Evade ML model | | 不安全的输出处理(概念) | 在下游信任 model 的输出 | LLM05 | — | | 编码输出绕过 | 伪装的密钥击败了 regex output filter | LLM02 | Exfiltration via obfuscation | ## 文档 - **[`ATTACK_CATALOG.md`](ATTACK_CATALOG.md)** — 每一种攻击:精确输入 → 每个阶段 (A/B/C) 缺失了什么 → 修复方案 → OWASP LLM / MITRE ATLAS 映射。学习指南。 - **[`THREAT_MODEL.md`](THREAT_MODEL.md)** — 资产、信任边界(特别是 RAG 数据边界)、攻击者画像、STRIDE,以及作为降低风险论证的防御阶梯。 - **[`COMPLIANCE_AND_GOVERNANCE.md`](COMPLIANCE_AND_GOVERNANCE.md)** — NIST AI RMF、EU AI Act、ISO/IEC 42001、数据最小化,以及 model card / 风险登记表。 - **[`CODE_WALKTHROUGH.md`](CODE_WALKTHROUGH.md)** — 关于如何使 agent 安全的通俗英语修改前后说明。 - **[`DEFENSES_explained.md`](DEFENSES_explained.md)** — 代码中的每种防御及其真实的局限性。 - **[`VIDEO_SCRIPT.md`](VIDEO_SCRIPT.md)** — 构建→破坏→防御→锁定视频脚本。 ## 安全评估报告(自动生成的证据) 这个仓库附带了一个真实的评估工具,而不仅仅是一篇报告。`generate_report.py` 执行确定性控制(input guard、context sanitizer、output filter、secret vault),记录每一项是 **作为实时证据通过还是失败**,然后生成一份映射到标准的报告: ``` python generate_report.py # -> reports/SECURITY_ASSESSMENT_REPORT.md ``` 该报告包含五项发现(**PA-001 … PA-005**),每一项都对照 **OWASP LLM Top 10 (2025)**、一项 **MITRE ATLAS** 技术和一项 **CWE**(针对 prompt injection 的 CWE-1427、针对信息泄露的 CWE-200、针对缺失授权的 CWE-862)进行分类,严重程度使用 **OWASP Risk Rating Methodology**(严重程度 = 可能性 × 影响)进行评分,并为 Agent A / B / C 提供了每项发现的状态。参见 [`reports/SECURITY_ASSESSMENT_REPORT.md`](reports/SECURITY_ASSESSMENT_REPORT.md)(PDF 也在 `reports/` 中)。 ## 三大防御机制如何运作(代码) 1. **Input guard** (`input_blocked`) — 一个 regex prompt-firewall,在 model 看到它*之前*阻止已知的攻击措辞。快速且低成本;可以通过改写来绕过(这就是我们要分层防御的原因)。 2. **Context sanitizer** (`sanitize_context`) — 从检索到的文档中剔除隐藏指令(HTML 注释、“system notice”行),并告诉 model CONTEXT 是不受信任的 DATA,而不是命令。可击败间接注入。 3. **Output filter** (`output_filter`) — 扫描 model 的回复以寻找密钥模式并将其编辑掉。无论 model 是如何被欺骗的,都能捕获泄露 —— 但仅限*精确*模式,因此编码/拼写的密钥可能会漏网(在 Agent B 中已演示)。 4. **架构控制 (Agent C)** — 密钥从 model 的 context 中移除,并存储在由经过身份验证的仅限员工使用的工具背后的服务端 vault 中。你无法泄露 model 从未获得过的内容。 Agent B 的 UI 显示了每条消息的完整 **security pipeline trace**,并诚实地标记出高级攻击何时 **绕过** 了 output filter —— 这正是 Agent C 存在的确切原因。 ## 运行 ``` # 1. 安装 Ollama (https://ollama.com) 并 pull model ollama pull llama3.2:3b # 2. Environment + deps python -m venv venv venv\Scripts\activate # macOS/Linux: source venv/bin/activate pip install -r requirements.txt # 3. 运行三个 agents 中的任意一个 python -m streamlit run app_a.py # Vulnerable — watch it leak python -m streamlit run app_b.py # Hardened — block -> catch -> bypass python -m streamlit run app_c.py # Locked-down — nothing to leak ``` ## 仓库结构 - `app_a.py` / `app_b.py` / `app_c.py` — 三个 agent(Streamlit UI)。 - `streamlit_app.py` — 合并的实时云演示(所有三个 agent,由 Groq 提供支持)。 - `generate_report.py` — 运行控制并输出映射到标准的评估报告。 - `reports/` — 生成的安全评估报告(Markdown + PDF)。 - `knowledge_base/` — RAG 文档(包括用于间接注入演示的有毒文档)。 - `DECISIONS.md` — 每一个工程/安全决策及其权衡。 - `FINDINGS_agent_a.md` — 记录的针对 Agent A 的红队测试结果。 - `DEFENSES_explained.md` — regex/output filtering 的工作原理。 ## 框架 映射到 **OWASP Top 10 for LLM Applications (2025)**、**MITRE ATLAS** 和 **NIST AI RMF**。在准备 **CompTIA SecAI+ (CY0-001)** 认证时构建。 ## 作者 Peace Maikasuwa — 我构建并保护 AI agent。Prompt injection · LLM red-teaming · guardrails。Patcy AISec 创始人。
regex firewall} IG -- attack pattern --> R1[Refuse politely] IG -- passes --> RET[RAG retrieval] RET --> CS[Context Sanitizer
strip hidden instructions] CS --> LLM[LLM · llama3.2:3b via Ollama] VAULT[(Server-side vault · secret
Agent C only)] -. authenticated staff tool .-> LLM LLM --> OF{Output Filter
regex redaction} OF -- secret detected --> RED[Redact -> serve] OF -- clean --> OUT[Serve reply] ``` **安全 pipeline(Agent B/C):** 每条用户消息都会通过 **input guard**,检索到的文档会被 **sanitize**(被视为不受信任的数据),model 运行后,其回复会通过 **output filter**。在 **Agent C** 中,密钥根本不在 model 中 —— 它存在于一个服务端 vault 中,只能由用户无法调用的、经过身份验证的员工工具释放。 ## 已测试的攻击,映射到行业标准框架 | 攻击 | 作用 | OWASP LLM Top 10 | MITRE ATLAS | |---|---|---|---| | 直接 prompt injection | 用户覆盖应用程序的指令 | LLM01 | Prompt injection | | 间接 prompt injection | 检索到的文档中隐藏的指令 | LLM01 | LLM prompt injection (indirect) | | System-prompt / 密钥提取 | model 暴露其隐藏的配置/密钥 | LLM07 / LLM02 | Exfiltration | | 越狱 / 绕过 guardrail | 精心构造的 prompt 绕过安全规则 | LLM01 | Evade ML model | | 不安全的输出处理(概念) | 在下游信任 model 的输出 | LLM05 | — | | 编码输出绕过 | 伪装的密钥击败了 regex output filter | LLM02 | Exfiltration via obfuscation | ## 文档 - **[`ATTACK_CATALOG.md`](ATTACK_CATALOG.md)** — 每一种攻击:精确输入 → 每个阶段 (A/B/C) 缺失了什么 → 修复方案 → OWASP LLM / MITRE ATLAS 映射。学习指南。 - **[`THREAT_MODEL.md`](THREAT_MODEL.md)** — 资产、信任边界(特别是 RAG 数据边界)、攻击者画像、STRIDE,以及作为降低风险论证的防御阶梯。 - **[`COMPLIANCE_AND_GOVERNANCE.md`](COMPLIANCE_AND_GOVERNANCE.md)** — NIST AI RMF、EU AI Act、ISO/IEC 42001、数据最小化,以及 model card / 风险登记表。 - **[`CODE_WALKTHROUGH.md`](CODE_WALKTHROUGH.md)** — 关于如何使 agent 安全的通俗英语修改前后说明。 - **[`DEFENSES_explained.md`](DEFENSES_explained.md)** — 代码中的每种防御及其真实的局限性。 - **[`VIDEO_SCRIPT.md`](VIDEO_SCRIPT.md)** — 构建→破坏→防御→锁定视频脚本。 ## 安全评估报告(自动生成的证据) 这个仓库附带了一个真实的评估工具,而不仅仅是一篇报告。`generate_report.py` 执行确定性控制(input guard、context sanitizer、output filter、secret vault),记录每一项是 **作为实时证据通过还是失败**,然后生成一份映射到标准的报告: ``` python generate_report.py # -> reports/SECURITY_ASSESSMENT_REPORT.md ``` 该报告包含五项发现(**PA-001 … PA-005**),每一项都对照 **OWASP LLM Top 10 (2025)**、一项 **MITRE ATLAS** 技术和一项 **CWE**(针对 prompt injection 的 CWE-1427、针对信息泄露的 CWE-200、针对缺失授权的 CWE-862)进行分类,严重程度使用 **OWASP Risk Rating Methodology**(严重程度 = 可能性 × 影响)进行评分,并为 Agent A / B / C 提供了每项发现的状态。参见 [`reports/SECURITY_ASSESSMENT_REPORT.md`](reports/SECURITY_ASSESSMENT_REPORT.md)(PDF 也在 `reports/` 中)。 ## 三大防御机制如何运作(代码) 1. **Input guard** (`input_blocked`) — 一个 regex prompt-firewall,在 model 看到它*之前*阻止已知的攻击措辞。快速且低成本;可以通过改写来绕过(这就是我们要分层防御的原因)。 2. **Context sanitizer** (`sanitize_context`) — 从检索到的文档中剔除隐藏指令(HTML 注释、“system notice”行),并告诉 model CONTEXT 是不受信任的 DATA,而不是命令。可击败间接注入。 3. **Output filter** (`output_filter`) — 扫描 model 的回复以寻找密钥模式并将其编辑掉。无论 model 是如何被欺骗的,都能捕获泄露 —— 但仅限*精确*模式,因此编码/拼写的密钥可能会漏网(在 Agent B 中已演示)。 4. **架构控制 (Agent C)** — 密钥从 model 的 context 中移除,并存储在由经过身份验证的仅限员工使用的工具背后的服务端 vault 中。你无法泄露 model 从未获得过的内容。 Agent B 的 UI 显示了每条消息的完整 **security pipeline trace**,并诚实地标记出高级攻击何时 **绕过** 了 output filter —— 这正是 Agent C 存在的确切原因。 ## 运行 ``` # 1. 安装 Ollama (https://ollama.com) 并 pull model ollama pull llama3.2:3b # 2. Environment + deps python -m venv venv venv\Scripts\activate # macOS/Linux: source venv/bin/activate pip install -r requirements.txt # 3. 运行三个 agents 中的任意一个 python -m streamlit run app_a.py # Vulnerable — watch it leak python -m streamlit run app_b.py # Hardened — block -> catch -> bypass python -m streamlit run app_c.py # Locked-down — nothing to leak ``` ## 仓库结构 - `app_a.py` / `app_b.py` / `app_c.py` — 三个 agent(Streamlit UI)。 - `streamlit_app.py` — 合并的实时云演示(所有三个 agent,由 Groq 提供支持)。 - `generate_report.py` — 运行控制并输出映射到标准的评估报告。 - `reports/` — 生成的安全评估报告(Markdown + PDF)。 - `knowledge_base/` — RAG 文档(包括用于间接注入演示的有毒文档)。 - `DECISIONS.md` — 每一个工程/安全决策及其权衡。 - `FINDINGS_agent_a.md` — 记录的针对 Agent A 的红队测试结果。 - `DEFENSES_explained.md` — regex/output filtering 的工作原理。 ## 框架 映射到 **OWASP Top 10 for LLM Applications (2025)**、**MITRE ATLAS** 和 **NIST AI RMF**。在准备 **CompTIA SecAI+ (CY0-001)** 认证时构建。 ## 作者 Peace Maikasuwa — 我构建并保护 AI agent。Prompt injection · LLM red-teaming · guardrails。Patcy AISec 创始人。
标签:AI安全, AI风险缓解, Chat Copilot, DLL 劫持, Kubernetes, LLM评估, Ollama, Python, RAG, 大语言模型, 无后门, 逆向工具, 配置审计