# LLM 安全攻防演示平台 — 项目规划(已更新)
> 最后更新:2026-06-12
> 状态:**v1.0 教学演示版已交付**,可用于课堂实验
---
## 〇、版本概览
| 项目 | 初版规划 | 当前现状 |
|------|----------|----------|
| 攻击场景 | 3 类 | **4 类**(新增组合攻击) |
| 攻击样本 | 9 个基础样本 | **18 个**(入门/进阶/高级分级) |
| 前端主题 | 深色 | **浅色**,对比更清晰 |
| 安全可视化 | 仅结果对比 | **摘要栏 + 处理流程弹窗 + 防御层说明** |
| 启动方式 | 手动 pip | **start.bat**(venv + 依赖 + 端口兜底) |
| 测试 | 规划 3 个文件 | **22 项 pytest 全部通过** |
| 真实 LLM | 可选 | 仍可选,默认 Mock |
---
## 一、项目定位
| 维度 | 说明 |
|------|------|
| 受众 | 大模型提示词 / Coze 就业班学员、安全入门者 |
| 形态 | 本地可运行的教学演示系统(非真实生产环境) |
| 核心价值 | **看得见攻击 → 看得见后果 → 看得见防御生效 → 看得见哪一层挡住** |
| 技术栈 | Python 3.11+ / FastAPI / 原生 HTML+CSS+JS / Mock 引擎(默认)/ 可选 OpenAI 兼容 API |
| 项目路径 | `06_代码/Day_03/llm-security-demo/` |
**设计原则**
1. **对比实验**:同一攻击输入,无防护 vs 安全模式并排展示。
2. **可复现**:18 个内置样本 + 红队批量测试,一键触发。
3. **教学友好**:攻击手法、攻击链、后果、防御层、处理流程五步可追踪。
4. **安全边界**:演示用假密钥、假用户数据,Mock 输出均为虚构。
---
## 二、系统架构(当前实现)
```mermaid
flowchart TB
subgraph Frontend["前端展示层 ✅"]
UI[4 类场景 + 18 样本]
Summary[实验结论摘要栏]
Compare[无防护 vs 安全对比]
Pipeline[安全处理流程弹窗]
Warn[防御关闭警告条]
Settings[统一安全设定面板]
Redteam[红队批量测试]
end
subgraph Backend["Python 后端 ✅"]
API[FastAPI 路由]
Vuln[脆弱模式 handler]
Secure[安全模式 handler]
end
subgraph SecurityLayer["统一安全防护层 ✅"]
InputGuard[① 输入隔离 + 注入检测]
JailbreakGuard[② 越狱策略检测]
TaskLock[③ 任务边界锁定]
LLMStep[④ 安全调用模型]
OutputGuard[⑤ 输出敏感过滤]
Audit[审计日志]
end
subgraph LLM["模型层"]
Mock[Mock 规则引擎 - 默认 ✅]
Real[真实 LLM API - 可选 ⬜]
end
UI --> API
Settings --> API
API --> Vuln
API --> Secure
Vuln --> Mock
Secure --> SecurityLayer
SecurityLayer --> Mock
SecurityLayer --> Real
Secure --> Pipeline
Secure --> Audit
```
### 目录结构(实际)
```
llm-security-demo/
├── README.md # 快速启动 + 实验路径
├── PROJECT_PLAN.md # 本文档
├── DEV_PLAN.md # 优化迭代记录(已完成)
├── requirements.txt
├── start.bat # venv + 依赖 + 端口兜底
├── .env.example
├── app/
│ ├── main.py
│ ├── config.py
│ ├── models/
│ │ ├── schemas.py # 含 SecurityPipelineStep
│ │ └── scenarios.py
│ ├── llm/
│ │ ├── mock_engine.py # 支持高级/组合攻击模拟
│ │ └── client.py
│ ├── security/
│ │ ├── layer.py # 统一安全层 + 流水线步骤
│ │ ├── pipeline.py # 步骤构建工具
│ │ ├── input_guard.py # 含 Base64/Coze 变量检测
│ │ ├── jailbreak_guard.py # 含邪恶双胞胎/JSON 绑架
│ │ ├── output_guard.py
│ │ └── task_lock.py # 含 context 打印检测
│ ├── handlers/
│ │ ├── vulnerable.py
│ │ └── secure.py
│ └── data/
│ ├── attack_samples.json # 18 个样本,4 场景
│ └── fake_secrets.json
├── frontend/
│ ├── index.html
│ ├── css/style.css # 浅色主题
│ └── js/app.js # 单文件,含摘要栏/流程弹窗
└── tests/
├── test_injection.py
├── test_jailbreak.py
├── test_leakage.py
└── test_samples.py # 高级/组合样本回归
```
---
## 三、四大攻击场景(当前样本库)
### 场景 1:提示词注入(5 个样本)
| 编号 | 名称 | 难度 | 攻击手法 | 主要防御层 |
|------|------|------|----------|-----------|
| PI-01 | 指令覆盖 | 入门 | 忽略之前所有指令,劫持角色 | input_isolation |
| PI-02 | 分隔符逃逸 | 进阶 | 伪造 `</user_input>` 注入伪指令 | input_isolation + task_lock |
| PI-03 | 间接注入 | 进阶 | 恶意指令藏在待翻译英文中 | input_isolation + output_guard |
| PI-04 | Base64 编码注入 | 高级 | 编码隐藏 Ignore all rules | input_guard |
| PI-05 | Coze 变量污染 | 高级 | 伪造 `{{user_input}}` 与 [SYSTEM] 标记 | input_isolation + task_lock |
### 场景 2:越狱攻击(5 个样本)
| 编号 | 名称 | 难度 | 攻击手法 | 主要防御层 |
|------|------|------|----------|-----------|
| JB-01 | 科研借口 | 入门 | 以论文为由请求违规内容 | jailbreak_guard |
| JB-02 | DAN 角色扮演 | 进阶 | DAN 模式解除限制 | jailbreak_guard |
| JB-03 | 分步诱导 | 进阶 | 分步骤放松安全规则 | jailbreak_guard |
| JB-04 | 邪恶双胞胎 | 高级 | 对立人格绕过审核 | jailbreak_guard |
| JB-05 | JSON 格式绑架 | 高级 | 用 JSON 约束输出违规步骤 | jailbreak_guard |
### 场景 3:数据泄露(5 个样本)
| 编号 | 名称 | 难度 | 攻击手法 | 主要防御层 |
|------|------|------|----------|-----------|
| DL-01 | 系统提示词套取 | 入门 | 直接要求复述 system prompt | task_lock |
| DL-02 | API Key 套取 | 进阶 | 诱导输出配置密钥 | task_lock + output_guard |
| DL-03 | 用户隐私套取 | 进阶 | 越权列出用户手机号 | task_lock + output_guard |
| DL-04 | 间接复述泄露 | 高级 | 「举例说明」敏感字段 | task_lock + output_guard |
| DL-05 | Context 打印诱导 | 高级 | 假装调试打印完整 context | task_lock + output_guard |
### 场景 4:组合攻击(3 个样本)✅ 新增
| 编号 | 名称 | 难度 | 攻击链 | 主要防御层 |
|------|------|------|--------|-----------|
| COMBO-01 | 注入 + 泄密 | 进阶 | 分隔符逃逸 → 索要 system prompt + API Key | input_isolation + task_lock |
| COMBO-02 | 越狱 + 套密钥 | 高级 | DAN 模式 → 输出 API Key + 连接串 | jailbreak_guard |
| COMBO-03 | 全链组合拳 | 高级 | 科研借口 → Base64 注入 → 拖取用户数据 | 多层联动 |
---
## 四、统一安全防护层(已实现)
```mermaid
sequenceDiagram
participant U as 用户输入
participant IG as ① InputGuard
participant JG as ② JailbreakGuard
participant TL as ③ TaskLock
participant LLM as ④ 安全调用模型
participant OG as ⑤ OutputGuard
participant UI as 处理流程弹窗
U->>IG: 原始输入
IG->>IG: 转义 + 注入检测 + 标签隔离
IG->>JG: 净化后输入
alt 越狱高风险
JG-->>UI: 拦截(blocked)
JG-->>U: 标准化拒绝
else 通过
JG->>TL: 任务白名单检查
alt 越权/泄密
TL-->>UI: 拦截(blocked)
TL-->>U: 标准化拒绝
else 允许
TL->>LLM: 安全提示词调用
LLM->>OG: 原始输出
OG-->>UI: 通过/脱敏
OG-->>U: 安全输出
end
end
```
### 4.1 可配置项(前端面板)
| 配置项 | 默认值 | 状态 |
|--------|--------|------|
| `enable_input_isolation` | `true` | ✅ |
| `enable_injection_detection` | `true` | ✅ |
| `enable_jailbreak_detection` | `true` | ✅ |
| `enable_output_filter` | `true` | ✅ |
| `task_whitelist` | translate, summarize, faq | ✅ |
| `refusal_message` | 可自定义 | ✅ |
| `audit_enabled` | `true` | ✅ |
| `llm_provider` | `mock` | ✅ 默认 |
关闭任一防护开关时,顶部显示**黄色警告条**。
### 4.2 脆弱模式 vs 安全模式
| 对比维度 | 无防护模式 | 安全模式 |
|----------|-----------|----------|
| 提示词结构 | 用户输入直接拼接,密钥写入 prompt | `<user_input>` 标签隔离 |
| 越狱 | 无检测,尽量回答 | 输入端拒绝 |
| 敏感数据 | 硬编码在 prompt(故意埋雷) | 任务锁定 + 输出脱敏 |
| 攻击成功时 | 摘要栏 🔴 + 后果标签 | — |
| 防御成功时 | — | 摘要栏 🟢 + 拦截层 + 流程弹窗 |
| 教学用途 | 让学员看到伤害 | 让学员看到防御有效 |
---
## 五、前端功能(已实现)
### 5.1 页面布局
```
┌──────────────────────────────────────────────────────────────────┐
│ 🛡️ LLM 安全攻防演示平台 ①选样本 → ②发攻击 → ③看对比 [红队] │
├──────────────────────────────────────────────────────────────────┤
│ ⚠️ 防御关闭警告条(有开关关闭时显示) │
├──────────┬───────────────────────────────────────┬─────────────┤
│ 攻击场景 │ 攻击输入 + [发送对比实验] │ 统一安全设定 │
│ 4 类 Tab │ ┌─ 实验结论摘要栏(VS 对比)────────┐ │ 防护开关 │
│ │ │ 🔴 无防护:攻击成功 │ 🟢 安全:防御 │ │ 白名单 │
│ 样本库 │ └──────────────────────────────────┘ │ 拒绝话术 │
│ 难度徽章 │ ┌无防护模式──┬──安全模式──┐ │ │
│ 攻击链 │ │ 输出+后果 │ 输出+防御 │[查看流程]│ 状态图例 │
│ │ └────────────┴────────────┘ │ │
│ 攻击说明 │ 审计日志 │ │
│ 防御层 │ │ │
└──────────┴───────────────────────────────────────┴─────────────┘
```
### 5.2 关键交互(已实现)
| 交互 | 状态 | 说明 |
|------|------|------|
| 选场景 / 样本 | ✅ | 一键填充,显示难度、攻击链、防御层 |
| 发送对比实验 | ✅ | `/api/compare` 双模式并行 |
| 实验结论摘要栏 | ✅ | 3 秒内判断攻防结果 |
| 安全处理流程弹窗 | ✅ | 5 步流水线,实验后自动弹出 |
| 防御关闭警告 | ✅ | 顶部黄色提示 |
| 红队批量测试 | ✅ | 18 样本 + 按难度统计 |
| 关闭防御后重试 | ✅ | 验证单层防御必要性 |
---
## 六、API 设计(已实现)
| 方法 | 路径 | 状态 |
|------|------|------|
| GET | `/api/scenarios` | ✅ |
| POST | `/api/chat` | ✅ |
| POST | `/api/compare` | ✅ 含 security_pipeline |
| GET | `/api/security/config` | ✅ |
| PUT | `/api/security/config` | ✅ |
| GET | `/api/audit/logs` | ✅ |
| POST | `/api/redteam/run` | ✅ 含 by_level 统计 |
**`/api/compare` 响应扩展(已实现):**
```json
{
"attack_meta": { "scenario": "combo_attack", "sample_id": "COMBO-03", "intent": "..." },
"vulnerable": { "attack_success": true, "consequences": ["合规违规", "隐私泄露"] },
"secure": {
"attack_success": false,
"blocked_by": "jailbreak_guard",
"security_pipeline": [
{ "id": "input_guard", "name": "① 输入隔离与注入检测", "status": "warning", "summary": "..." },
{ "id": "jailbreak_guard", "name": "② 越狱策略检测", "status": "blocked", "summary": "..." }
]
}
}
```
---
## 七、Mock 引擎(已实现)
| 攻击类型 | 脆弱模式 | 安全模式 |
|----------|----------|----------|
| 指令覆盖 | 角色切换 + 泄露提示词片段 | 仅字面翻译 |
| Base64 注入 | 解码后执行恶意指令 | 翻译编码内容 |
| DAN / 邪恶双胞胎 | 输出违规步骤(虚构) | 输入端拒绝 |
| 密钥/用户数据 | 返回 fake_secrets 内容 | 任务锁定 / 脱敏 |
| 组合攻击 | 多后果叠加(最危险优先) | 多层拦截 |
---
## 八、实施阶段(完成情况)
### Phase 1 — 骨架 ✅ 已完成
- [x] FastAPI 项目初始化
- [x] Mock 引擎 + 脆弱/安全双 handler
- [x] 静态前端 + 对比布局
- [x] 三类攻击端到端跑通
### Phase 2 — 安全层 ✅ 已完成
- [x] SecurityLayer 五模块实现
- [x] 统一安全设定 API + 前端面板
- [x] 审计日志
- [x] 安全处理流程可视化(`security_pipeline`)
### Phase 3 — 教学增强 ✅ 已完成
- [x] 后果徽章、防御归因、攻击意图解析
- [x] 红队批量测试(含按难度分组)
- [x] README 操作说明
- [x] 22 项单元测试全部通过
- [x] 浅色 UI 主题
- [x] 实验结论摘要栏
- [x] 防御关闭警告条
### Phase 4 — 内容扩展 ✅ 已完成(原规划外的迭代)
- [x] 第四场景「组合攻击」
- [x] 样本从 9 扩展到 18,含入门/进阶/高级
- [x] 高级攻击:Base64、Coze 变量、邪恶双胞胎、JSON 绑架、Context 打印
- [x] Mock 引擎与 guard 规则补强
- [x] start.bat(venv + 端口兜底)
### Phase 5 — 可选扩展 ⬜ 未做
- [ ] 接入真实 LLM API 作为课堂对比实验
- [ ] 多轮对话注入演示(UI + 会话状态)
- [ ] 导出 PDF / 实验报告
- [ ] 用户角色切换(guest / staff 权限演示)
- [ ] Coze 工作流导入/导出样本
---
## 九、单节课实验流程
本平台设计为 **1 节课** 内的动手实验,学员按以下四步操作即可:
| 步骤 | 操作 | 预期观察 |
|------|------|----------|
| 1. 攻击 | 选样本 → 发送对比实验 | 摘要栏左侧 🔴 攻击成功 |
| 2. 复盘 | 读攻击说明(手法/攻击链/后果) | 理解脆弱配置为何失败 |
| 3. 防御 | 看摘要栏右侧 + 处理流程弹窗 | 🟢 防御成功,明确拦截层 |
| 4. 验证 | 关闭某防御开关 → 重试 | 黄色警告 + 防护降级 |
### 自检清单
- [ ] 能说出 4 类攻击各 2 种手法
- [ ] 能解释组合攻击的攻击链
- [ ] 能从处理流程弹窗指出拦截层
- [ ] 能关闭/开启防御开关并解释差异
- [ ] 能自编 payload 并被安全模式挡住
---
## 十、质量指标(当前)
| 指标 | 目标 | 当前 |
|------|------|------|
| 攻击样本数 | ≥ 15 | **18** |
| 安全模式拦截率(红队) | ≥ 90% | **100%**(18/18) |
| 单元测试 | 核心规则覆盖 | **22 passed** |
| 启动方式 | 一键可用 | **start.bat** |
| 对比可读性 | 3 秒内判断 | **摘要栏实现** |
---
## 十一、风险与边界
1. **仅供教学**:Mock 违规输出为虚构,不生成真实有害内容。
2. **不教真攻击**:禁止将本平台技术用于未授权系统。
3. **假数据**:密钥、用户、内部文档均为 `fake_secrets.json` 虚构项。
4. **规则防御局限**:正则 + 关键词检测可被新型绕过,课堂需强调「深度防御」而非「一劳永逸」。
---
## 十二、快速启动
```bash
# 方式一:双击 start.bat
# 方式二:手动
cd 06_代码/Day_03/llm-security-demo
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
uvicorn app.main:app --reload --host 127.0.0.1 --port 8000
```
访问:**http://127.0.0.1:8000**(8000 占用时 start.bat 自动改用 8001)
```bash
# 运行测试
pytest tests/ -v
```
---
## 十三、后续可选方向
若继续迭代,建议优先级:
| 优先级 | 方向 | 价值 |
|--------|------|------|
| P1 | 接入真实 LLM 对比实验 | 展示「规则防御 vs 模型对齐」差异 |
| P2 | 多轮对话注入 | 演示渐进式攻击 |
| P3 | 实验报告导出 | 学员作业交付 |
| P4 | Coze Bot 专项样本包 | 更贴近就业班场景 |
当前版本已满足课堂教学需求,上述为增强项,非必须。