tsh52110/llm-redteam-harness
GitHub: tsh52110/llm-redteam-harness
一个可复现的 LLM 红队测试框架,通过确定性探测对 LLM agent 进行 OWASP Top 10 前后对比扫描,量化评估四种安全缓解措施的实际效果。
Stars: 0 | Forks: 0
# LLM Red-Team Harness — Prompt-Injection / Guardrails 前后对比
一个可复现的 red-team harness,它针对 **OWASP LLM Top 10** 探测 LLM agent,应用四种
命名的缓解措施,使用相同的探测进行重新扫描,并在
执行级 Streamlit dashboard 中展示**测量出的**前后对比。
**核心结果(测量得出,非估算):**

## 按 OWASP 类别划分的前后对比
| OWASP | 类别 | 之前 | 之后 | 主要缓解措施 |
|-------|----------|:------:|:-----:|--------------------|
| LLM01 | Prompt Injection | 9/10 | **0/10** | System-prompt 加固 |
| LLM01 | Jailbreak | 7/8 | **2/8** | Injection 输入过滤器(残余 2 项) |
| LLM02 | PII 泄露 | 6/7 | **0/7** | 输出验证 |
| LLM05 | 不当输出处理 | 1/2 | **0/2** | 输入过滤器 + 输出验证 |
| LLM06 | 过度授权(工具滥用) | 4/5 | **0/5** | Tool-call 白名单 |
| LLM07 | System Prompt 泄露 | 7/8 | **0/8** | 输入过滤器 + 输出验证 |
| | **总计** | **34/40** | **2/40** | |
修复归因**通过单一缓解措施消融实验进行测量**(即单独运行哪个防御手段能阻止每个探测),
而不是人工断言的 —— 详见 `reports/summary.json`。
**残余风险(已接受并跟踪):** `JB-003`、`JB-004` —— 新型人格 jailbreak,它们只会改变 agent 的
语气,但不会泄露机密、PII 或触发工具。关键词过滤器会漏掉这种新型表述;真实的
系统需要添加语义 jailbreak 分类器。并非所有攻击都能被拦截,dashboard 中对此有明确说明。
## 工作原理(以及为什么这些数据值得信赖)
`promptfoo redteam` 和 `garak` 都需要一个**运行中的 LLM provider + grader key** 来生成和评分
对抗性探测。为了使前后对比**可复现且免费**(无需 key、无成本、无非确定性),
这个可复现的核心是一个确定性的 harness:
- **Target** (`src/target/agent.py`) —— `SupportBot`,其“LLM 核心”是一个*天真且无 guardrail* 模型的
确定性模拟器。破坏性工具(`delete_account`、`read_file`)是**被模拟的**
(仅作记录) —— 不会触及任何真实的文件系统或账户。
- **Probes** (`probes/probes.yaml`) —— 涵盖 5 个 OWASP 类别的 40 个 payload,根据下方的参考
集进行了改写。有些是故意设计的“险些命中”,天真的 bot 能够抵御(真实的测试集也会包含未奏效的攻击)。
- **Oracles** (`src/harness/oracles.py`) —— 确定性的字符串/结构检查(机密泄露了?输出中包含
PII?触发了禁用的工具?),因此通过/失败是一项客观测量,而非 LLM 的主观判断。
- **缓解措施** (`src/mitigations/`) —— 在实际的拦截点应用了四种防御。
同一个 target 通过 REST (`src/target/server.py`) 暴露,以便**业界工具层** ——
`promptfoo/redteam.yaml`(OWASP LLM 预设)和 `garak/run_garak.sh` —— 能够使用您的 provider key 对其进行评估。
## 四种缓解措施
| # | 缓解措施 | OWASP | 阻止的问题 |
|---|-----------|-------|----------------|
| 1 | Injection 输入过滤器 | LLM01 | 在模型处理前拦截重写/jailbreak 关键词 |
| 2 | System-prompt 加固 | LLM07 | Spotlighting/定界;抵御“重复上面的文本”泄露 |
| 3 | Tool-call 白名单 | LLM06 | 在执行前剔除破坏性工具 |
| 4 | 输出验证 | LLM02/05 | 作为最后一道防线,对机密/PII 进行脱敏 |
每项措施都作为独立的 commit 提交,并附带了一行说明理由(参见 `git log`)。
## 运行
```
python -m venv .venv && source .venv/bin/activate # or: uv venv --python 3.11 .venv
pip install -r requirements.txt
# 复现测量前/后(无需 API key)
python -m src.harness.run_scan baseline # -> reports/baseline.json (34/40 vulnerable)
python -m src.harness.run_scan hardened # -> reports/hardened.json (2/40 vulnerable)
python -m src.harness.compare # -> reports/summary.json + before/after table
# 执行 dashboard
streamlit run dashboard/app.py # http://localhost:8501
# regression gate
pytest tests/ # 40 passed, 2 skipped (accepted residuals)
```
### 业界工具层(需要 provider key)
```
MITIGATIONS=off uvicorn src.target.server:app --port 8000 # target
npx promptfoo@latest redteam run -c promptfoo/redteam.yaml # OWASP LLM preset
./garak/run_garak.sh # focused garak probes
```
## CI 门禁
`.github/workflows/redteam-ci.yml` 会在每次 push/PR 时运行确定性回归测试套件,并且**一旦
发现任何未被接受的关键/高危项就会失败**。这是门禁成功拦截被还原缓解措施的证明:
```
pytest tests/ # 40 passed, 2 skipped
REDTEAM_DISABLE=output_validation pytest tests/ # 7 failed — 6 PII probes regress to critical/high
```
当将 `OPENAI_API_KEY` 设置为仓库 secret 时,`promptfoo-action` 作业会运行 OWASP LLM 预设,
否则将自动跳过,因此它永远不会阻碍门禁。
## 部署 dashboard (Streamlit Cloud)
1. 将此 repo 推送到 GitHub(公开)。
2. 前往 [share.streamlit.io](https://share.streamlit.io) → **New app** → 选择此 repo/branch。
3. 主文件路径:`dashboard/app.py`。部署。(`requirements.txt` + `.streamlit/config.toml` 已预先配置好。)
在线应用:_连接后在此处添加 Streamlit Cloud URL。_
## 致谢与许可
仅使用了遵循其各自许可的公共工具/数据集:
- [promptfoo/promptfoo](https://github.com/promptfoo/promptfoo) (MIT) —— `owasp:llm` redteam 预设与 action
- [NVIDIA/garak](https://github.com/NVIDIA/garak) (Apache-2.0) —— LLM 漏洞扫描器
- [Azure/PyRIT](https://github.com/Azure/PyRIT) (MIT) —— 可选的 red-team 框架
- [swisskyrepo/PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings) —— Prompt Injection payload 模式(已改写)
- [verazuo/jailbreak_llms](https://github.com/verazuo/jailbreak_llms) (MIT) —— jailbreak 人格模式(已改写)
**仅供授权测试。** 存在漏洞的 target 属于自有且已被隔离;切勿将这些探测指向
您不拥有或缺乏书面测试许可的系统。
标签:AI安全, Chat Copilot, DLL 劫持, Kubernetes, LLM护栏, Python, 大语言模型, 安全规则引擎, 无后门, 红队评估, 逆向工具