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 中展示**测量出的**前后对比。 **核心结果(测量得出,非估算):** ![Dashboard](https://raw.githubusercontent.com/tsh52110/llm-redteam-harness/main/docs/dashboard.png) ## 按 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, 大语言模型, 安全规则引擎, 无后门, 红队评估, 逆向工具