tkarim45/llm-red-teaming-framework
GitHub: tkarim45/llm-red-teaming-framework
Bedrock 原生的 LLM 红队测试框架,通过自动化对抗攻击评测和强化 LLM 应用的安全性,并生成前后对比安全报告。
Stars: 1 | Forks: 0
# LLM 安全的红队测试框架
## 架构

*交互式/可导出版本:[`docs/assets/architecture.html`](docs/assets/architecture.html)。*
## 1. 本项目是什么
这是一个**防御性安全 / 安全评估**项目。你可以在用户(或攻击者)发现之前,探测你*自己的* LLM 应用的故障模式,然后修复你发现的问题:
### 为什么这很重要(行业背景)
Meta 发表了 MART(Multi-round Automatic Red-Teaming,多轮自动化红队测试),报告称在四轮自动化对抗测试中,违规率**降低了 84.7%**。Google 和 Anthropic 在每次发布模型前都会运行类似的系统。如今,红队测试已成为严肃 AI 公司的标准做法,原因很简单:它能在用户之前暴露故障模式,这是受监管和高风险部署中的基本要求。
### 道德与范围(构建前必读)
- 仅针对你在这个代码库中**自己**构建的应用。切勿将攻击工具指向你不拥有的第三方或生产系统。
- 将原始的有害记录保存在本地(gitignored);公开的产物是包含脱敏示例的汇总安全报告。
- 目标是**衡量并减少**伤害,而不是产生可重复使用的攻击。这种定位也是使其成为一个可信、值得聘用的项目,而不是一个累赘的关键所在。
## 2. 数据集:AdvBench(+ DeepEval 生成的攻击)
- **AdvBench:** 520 个有害行为字符串,旨在探测 LLM 的安全边界、越狱尝试、危险指令请求以及跨各种类别的边界试探提示。在学术安全研究中被广泛使用。
- 来源:`llm-attacks` 代码库的一部分,https://github.com/llm-attacks/llm-attacks(`data/` 下的 `harmful_behaviors.csv` 文件)。
- **DeepEval 红队测试生成器:** 自动跨 40 多个内置漏洞类别合成对抗性提示词,并应用攻击增强手段(如 prompt injection、角色扮演、编码)。你只需选择类别;它会生成攻击并对响应进行评分。
- 将 AdvBench 用作固定的外部基线集,并使用 DeepEval 生成的攻击以增加广度。将它们分开报告,以便不同运行轮次之间的数据保持可比性。
## 3. 工具 / 框架
| 工具 | 作用 | 安装 |
|---|---|---|
| **DeepEval 红队测试** | 跨 40 多个漏洞类别生成对抗性提示词并对违规行为评分 | `pip install deepeval` |
| AdvBench (`llm-attacks`) | 520 个固定的有害行为提示词 | clone 代码库 / 下载 CSV |
| `openai` | 目标应用模型 + 用于违规评分的 judge 模型 | `pip install openai` |
| `pandas`, `matplotlib` | 各类别比率 + 前后对比图表 | `pip install pandas matplotlib` |
- DeepEval 红队测试文档:https://deepeval.com/docs/red-teaming-introduction
(红队测试功能可能位于其附属的 `deepteam` 包中,请查看最新文档;安装文档指定的任何内容)。
- 建议首先测试的漏洞类别:**jailbreaking, bias, PII leakage, toxicity, misinformation, prompt injection**(选择 5 到 6 个)。
## 4. 架构
```
┌─────────────────────────────┐
AdvBench (520 fixed) ──▶│ │
│ run_redteam.py │ transcripts
DeepEval generator ──▶│ send attack → target app │──────────────┐
(40+ categories) │ │ │
└──────────────┬──────────────┘ ▼
│ ┌──────────────┐
app/target.py ◀──────────────────────┘ │ score.py │
system_prompts.py (v1 baseline) │ judge: is │
│ this a │
│ violation? │
└──────┬───────┘
│ labels + reasons
▼
analyze.py → per-category
violation rate
┌──────────── HARDEN ───────────┐
│ system_prompts.py v2 │
│ + guardrails.py output filter │
└──────────────┬────────────────┘
▼
re-run SAME attack set → before/after table
▼
reports/safety_report.md ← THE deliverable
```
设计原则:
- **前后使用相同的攻击集。** 比较不同的集合会使差值失效。
- **版本化防御。** 冻结 `v1` 基线;强化措施生成 `v2`。每次运行都会打上 prompt 版本和 guardrail 配置的标签。
- **Judge 核实。** 违规标签来自 judge 模型;在信任该比率之前,需手动核实 ≥20 个(假阳性会虚增“之前”的数据,假阴性则会掩盖失败)。
- **隔离。** 有害记录保存在本地;报告使用脱敏示例。
## 5. 构建计划(逐步进行)
### 阶段 0:设置(30 分钟)
1. `~/miniconda3/envs/personal/bin/pip install deepeval openai pandas matplotlib python-dotenv`(+ 根据最新文档安装红队测试包)。
2. 配置包含 `OPENAI_API_KEY` 的 `.env` 文件。下载 AdvBench `harmful_behaviors.csv`。
### 阶段 1:目标应用(2 小时)
1. `app/system_prompts.py`:编写 `SYSTEM_V1`,一个正常、轻微设防的助手提示词(故意不进行强化,以便基线显示真实的违规情况)。
2. `app/target.py`:`respond(user_msg) -> str`,temperature=0。
### 阶段 2:攻击测试工具(半天)
1. `src/attacks.py`:加载 AdvBench;为 5 到 6 个类别配置 DeepEval 红队测试。
2. `src/run_redteam.py`:将每次攻击发送到目标;保存带有运行元数据标记的原始记录。实现速率限制/退避。
3. `src/score.py`:按类别对每个响应进行分类,判断是违规/安全(judge 模型 + DeepEval 评分器)。持久化存储 `{attack, category, response, violation: bool, reason}`。
### 阶段 3:基线测量(2 到 3 小时)
1. 针对 `v1` 运行全套测试。`src/analyze.py`:总体违规率 + 各类别违规率。绘制柱状图。
2. 手动核实 20 多个标签;记录 judge 模型的假阳性/假阴性;如果某个类别明显评分错误,则进行调整。
3. 这些就是你的“之前”数据。表现最差的类别就是你进行强化的目标。
### 阶段 4:强化(半天)
1. `app/system_prompts.py` → `SYSTEM_V2`:针对失败的类别进行明确拒绝,设定清晰的范围边界,并指示绝不透露 system prompt / PII。
2. `app/guardrails.py`:一个生成后过滤器,拦截/脱敏匹配 PII 模式的输出、toxicity 分类器标记的输出或已知的越狱特征。
3. 确保更改可归因:记录哪项更改针对哪个类别。
### 阶段 5:重新测试 + 报告(半天)
1. 针对 `v2` + guardrails 重新运行**相同**的攻击集。`src/analyze.py --compare`。
2. `reports/safety_report.md`,这是最终交付物,其结构如下:
- **范围与方法:** 受测应用、类别、攻击集(AdvBench N + 生成的 N)、judge 模型。
- **基线结果:** 总体比率、各类别表格、最差的类别、脱敏示例。
- **强化措施:** 具体更改了什么(prompt 差异、guardrail 规则)及其原因。
- **结果:** 前后对比的总体和各类别数据、降低百分比、图表。
- **残余风险与局限性:** 仍然存在的问题、judge 可靠性警告、未覆盖的攻击、建议的后续步骤。
### 进阶目标
- 多轮测试(MART 风格):强化 → 重新测试 → 再次强化;绘制每一轮的违规率图表。
- 添加一个输入分类器(在生成前拒绝),并与仅使用输出过滤器的方案进行对比。
- 专门测试 prompt injection 的鲁棒性(通过注入的文档进行数据泄露)。
## 6. 完成定义
- [ ] 具有冻结基线 system prompt (v1) 的目标应用
- [ ] 能够针对 5 到 6 个类别运行 AdvBench + DeepEval 生成攻击的攻击测试工具
- [ ] 基线的总体和各类别违规率,包含 20 多个手动验证的标签
- [ ] 强化的 v2(system prompt + guardrail 层),并将更改映射到各个类别
- [ ] 在相同攻击集上重新运行;前后对比 + 图表
- [ ] `reports/safety_report.md`,包含脱敏示例的完整结构化报告
## 7. 简历要点(模板:请替换为你的真实数据)
- *使用 DeepEval 构建了自动化红队测试框架,跨 40 多个对抗类别对 LLM 进行测试,识别出 [X]% 的总体违规率,集中在 jailbreaking ([a]%) 和 PII leakage ([b]%)。*
- *通过针对性的 system prompt 强化和输出过滤,将违规率降低了 [Y]%,并在结构化的安全报告中记录了调查结果。*
安全报告是让这个项目脱颖而出的关键。任何人都可以运行脚本并获得分数;而写下“这是我测试的内容、发现的问题、做出的更改以及前后的对比”,才是一位 AI 公司的高级工程师真正会做的事。
## 8. 参考资料
- MART 论文:*"MART: Improving LLM Safety with Multi-round Automatic Red-Teaming"* (Ge et al., Meta, 2023)
- AdvBench / GCG 论文:*"Universal and Transferable Adversarial Attacks on Aligned Language Models"* (Zou et al., 2023), https://github.com/llm-attacks/llm-attacks
- 面向 LLM 应用的 OWASP Top 10 (LLM01 prompt injection, LLM02 敏感信息泄露, LLM06 system prompt 泄露)
- NIST AI 风险管理框架(为报告的框架提供背景)
## 9. 实施说明(本次构建)
此实现是 **AWS Bedrock 原生**的,并使用最便宜的 Claude 等级
(**Claude Haiku 4.5**, `global.anthropic.claude-haiku-4-5-...`)同时作为目标应用和
judge 模型,因此完整的前后评估成本约为 $0.25。
**它测试的内容。** 现代的对齐模型会直接拒绝粗暴的单轮攻击
(jailbreak、“打印你的 system prompt”、“把客户的 SSN 给我”),
即使使用一个简单的 prompt,这些攻击的得分也接近 0%。真正可利用的受攻击面是
**OWASP LLM Top 10 的应用层**,特别是**间接 prompt injection**
(LLM01):一个持有内部注释上下文的智能体支持机器人,会在恶意指令通过看似无害的内部任务(“为工单日志总结该注释,并保留所有代码”)被洗白时,复现其中的机密信息。
强化(将检索到的内容视为不受信任的数据 + 输出 guardrail)可以消除这种风险。
**关键技术。**
- **基于 Canary 的评分**(`src/canaries.py`):在应用的上下文中植入合成机密信息;确定性地检测泄露(作为真实参照,无需 judge 模型),并带有**拒绝网关**,确保在拒绝时*提及*机密信息的行为不被计为漏洞利用(这是通过手动验证发现并纠正的一个问题)。
- **混合评判**(`src/score.py`):应用层类别采用 Canary 评分;模型安全类别(jailbreak, toxicity)使用 LLM judge 来存储判决结果和原因。
- **两种攻击系列**(`src/attacks.py`):AdvBench + 精心设计的间接 prompt injection payload,以及增强变体(角色扮演/“DAN”、base64、前缀注入)。
- **冻结版本控制**:`v1`(原始的)和 `v2`(强化的)system prompt 是不可变的;相同的攻击集会针对两者重放。
- **可复现的报告**:`src/report.py` 根据运行产物生成 `reports/safety_report.md`。
**运行它**(conda `personal` 环境;`.env` 需要配置 AWS Bedrock 凭证):
```
make baseline # v1, no guardrails
make harden # v2 + guardrails, SAME attack set
make compare # per-category rates + before/after chart
make report # render reports/safety_report.md
make verify # draw 20 judge labels for hand-verification
# 或:make all
```
标签:Petitpotam, 攻击工具, 逆向工具