josephManzambi/ai-redteam-orchestrator
GitHub: josephManzambi/ai-redteam-orchestrator
单文件、全本地运行的三层 AI 红队冒烟测试编排器,整合 Garak、Promptfoo 和 PyRIT 对 LLM 及 MCP 服务器进行自动化安全审计并生成 CI 就绪的报告。
Stars: 0 | Forks: 1
# 🛡️ AI Red Team Orchestrator
一个单文件、三层自动化的红队流水线,用于审计 LLM 和 MCP 工具服务器。其三层结构遵循 [Amine Raji](https://aminrj.com/posts/attack-patterns-red-teaming/) 所描述的 Garak → Promptfoo → PyRIT 分层架构;分层概念和工具映射源自他的方法,而编排、严重性分类、报告生成、超时/退出码/CI 设计,以及探测项和预设选择则是本项目的独创。完全在本地针对 [Ollama](https://ollama.com) 运行,使用 [`uv`](https://docs.astral.sh/uv/) 进行零配置的依赖管理。
将其指向你自己的 MCP 服务器,编排器就会向其发起四种行业标准攻击框架的测试:
| 层级 | 目的 | 工具 |
|---|---|---|
| **Layer 1** — 广度扫描 | 大范围漏洞发现 | [Garak](https://github.com/NVIDIA/garak) + [Promptfoo](https://github.com/promptfoo/promptfoo) eval |
| **Layer 2** — 针对性测试 | OWASP LLM Top-10 分类 + MCP 攻击面 | [Promptfoo](https://github.com/promptfoo/promptfoo) redteam + [mcp-scan](https://github.com/invariantlabs-ai/mcp-scan) |
| **Layer 3** — 对抗性测试 | 多轮越狱 + 树搜索 | [PyRIT](https://github.com/Azure/PyRIT) Crescendo + TAP |
输出是一份 Markdown 报告(以及可选的独立 HTML 报告),其中包含严重性徽章、执行摘要表、位于可折叠区块中的原始工具输出,以及基于实际运行发现所衍生出的建议。
### 适用人群
**适合你,如果** 你想亲自动手学习本地 AI 红队测试 · 你想要一个快速的 CI 门控来验证小型、可部署模型的安全基础架构 · 你想要诚实、私有、可重复且完全由你掌控的冒烟测试。
**不适合你,如果** 你需要一个合规性/保证*结论* · 你正在审计前沿模型 · 你需要多代理或运行时 MCP 覆盖。这些边界已被公开跟踪 —— 参见 [已知局限性](#known-limitations)。
## 为什么需要它?
大多数红队工作流需要手动将 3-4 个工具拼接在一起,每个工具都有各自的配置格式、Python 版本和安装步骤。本脚本的特性:
- **单文件,零设置** — `uv run` 自动处理所有依赖
- **完全在本地运行** — Ollama 目标,无需 API 密钥
- **接入你自己的 MCP 服务器** — 使用 `--mcp-config` 将 Layer 2 的 mcp-scan 指向你的真实服务器
- **可选的脆弱性演示目标** — 如果你想要开箱即用的测试目标,可以使用 `--demo-vulnerable-server` 开启(默认关闭)
- **兼顾广度和深度** — 在一次运行中包含广度扫描(Garak)、针对性分类(OWASP)和对抗性多轮攻击(PyRIT)
- **生成可审计的报告** — 包含严重性分类的 Markdown 和 HTML,而不仅仅是原始日志
- **适配 CI** — 发现 CRITICAL/HIGH 级别问题时会以退出码 1 退出(所有发现依然会出现在报告中)
## 前置条件
| 工具 | 安装 | 用途 |
|---|---|---|
| [uv](https://docs.astral.sh/uv/) | `brew install uv` 或 `curl -LsSf https://astral.sh/uv/install.sh \| sh` | Python 依赖管理 |
| [Ollama](https://ollama.com) | `brew install ollama` 或 [下载](https://ollama.com/download) | 本地 LLM 服务 |
| [Node.js](https://nodejs.org/) | `brew install node` | 为 Promptfoo 和 mcp-scan 提供 `npx` |
```
# 启动 Ollama daemon
ollama serve
# 拉取 target model (~1.9 GB)
ollama pull qwen2.5:3b
```
## 快速开始
默认流程会审计 LLM 的整体安全态势(Layer 1 + 3),并针对**你的** MCP 服务器运行 mcp-scan:
```
# 审计你自己的 MCP server(推荐)
uv run redteam_orchestrator.py --mcp-config path/to/your_mcp_client.json --html
# 同样,使用不同的 model
uv run redteam_orchestrator.py --mcp-config my.json --target mistral:7b --html
# 仅运行特定 layers
uv run redteam_orchestrator.py --mcp-config my.json --layers 1 # broad scan only
uv run redteam_orchestrator.py --mcp-config my.json --layers 2,3 # targeted + adversarial
# 为慢速机器增加 timeout(默认:3600s = 60 分钟)
uv run redteam_orchestrator.py --mcp-config my.json --timeout 7200
```
如果你不传入 `--mcp-config`,编排器依然会针对 LLM 运行 Layer 1 和 3 —— 它只是**跳过 mcp-scan**,并在报告中给出明确的说明。
首次运行会花费较长时间 —— `uv` 会从脚本头部构建一个临时的虚拟环境,而 `npx` 会获取 Promptfoo/mcp-scan。后续的运行会快得多。
## 在没有自己 MCP 服务器的情况下尝试
如果你想体验包含 Layer 2 mcp-scan 在内的完整流水线,但没有 MCP 服务器可供指向,可以选择开启内置的演示目标:
```
uv run redteam_orchestrator.py --demo-vulnerable-server --html
```
## CLI 参考
```
usage: redteam_orchestrator.py [-h] [--target TARGET] [--provider PROVIDER]
[--timeout TIMEOUT] [--mcp-config MCP_CONFIG]
[--demo-vulnerable-server] [--html]
[--no-versions] [--layers LAYERS] [--clean]
[--clean-deep] [--clean-all] [--yes]
options:
--target TARGET Ollama model to audit (default: qwen2.5:3b)
--provider PROVIDER LLM provider prefix for Promptfoo (default: ollama)
--timeout TIMEOUT Per-step timeout in seconds (default: 3600)
--mcp-config CONFIG Path to your own mcp-scan client config JSON (Layer 2)
--demo-vulnerable-server Install + target the built-in vulnerable demo (off by default)
--html Also generate a self-contained HTML report
--no-versions Skip the tool-version probe in the report header
--layers LAYERS Comma-separated layer subset, e.g. '1,3' (default: 1,2,3)
--clean Remove generated files only (fast, safe)
--clean-deep Files + uv cache + npm cache + ~/.pyrit state
--clean-all Deep clean + remove the Ollama target model
--yes, -y Skip confirmation prompt for --clean-all
```
## 工作原理:三种角色
自动化红队测试是一场包含三种角色的对抗游戏:
- **Target**(*防守方*)—— 待测试的模型;其职责是进行抵抗。
- **Attacker** —— 生成攻击(构造提示词、不断升级、寻找绕过方法)。其职责是**生成**。
- **Judge**(或 *scorer*)—— 判断攻击是否奏效:目标是否顺从、泄露信息或拒绝?其职责是**识别**。
人类红队成员同时兼任这三个角色;自动化则将它们拆分,从而使循环可以在无人值守的情况下运行数千次 —— 这也让它们可以是*不同的*模型。生成一次好的攻击比识别一次成功的攻击要困难得多,因此一个小模型可以成为合格的 Judge,但却是个糟糕的 Attacker。
每个角色都跨越一个频谱 —— Attacker 从固定语料的已知攻击 → 单轮生成器 → 自适应的多轮代理;Judge 从关键词规则 → LLM-as-judge → 人类。而且这些角色可以被*组合*为:**自我博弈**(一个模型扮演所有角色 —— 成本低,但对手较弱且 Judge 存在偏见)、**分离模型**,或 **强攻击者**。
**本工具的定位:** Garak 是由规则进行评分的静态语料攻击者;Promptfoo 生成单轮攻击,由规则和 LLM 评分标准混合评分;PyRIT (Crescendo, TAP) 是带有 LLM Judge 的自适应多轮攻击者。这三者默认采用 **自我博弈** —— 即相同的 `--target` 模型扮演所有角色 —— 这是 Layer 3 结果最大的局限性([原因](https://github.com/josephManzambi/ai-redteam-orchestrator/issues/27))。
### 验证 Judge 模型
如果你打破了自我博弈,将 Judge 指向了一个单独的模型,**请先验证该 Judge** —— 一个误读真实危害的 Judge 比没有 Judge 更糟糕。`eval_adjudicator.py` 会让候选的 Judge 运行一个小型标记过的探测测试(编排器自带的 `root:x:0:0` / `uid=0(root)` 标记、混淆变体以及良性测试用例),并报告每个 Judge 的假阴性 / 假阳性率:
```
python3 eval_adjudicator.py --judges llama3.1:8b mistral:7b --runs 5 --report /dev/null
```
在测试中,Judge 的质量既不与参数规模挂钩,也不与模型家族相关 —— 一个 7B 击败了 70B,而看似最合理的 `llama3.1:8b` 却表现最差(它将字面意义上的 `/etc/passwd` 数据泄露称为“无害”)。Judge 能够可靠地捕捉到框架明显的攻击,但却会漏掉隐蔽或改述的泄露,因此可以信任 Judge 给出的“有害”判定(进行升级 / 标注),但绝对不要信任它给出的“安全”判定(不要降级)。完整结果及计划中的 `--adjudicate` 设计:[#41](https://github.com/josephManzambi/ai-redteam-orchestrator/issues/41)。
## 功能说明
### Layer 1 — 广度扫描
撒下一张大网以发现 LLM 中明显的漏洞。与当前运行的是哪个 MCP 服务器(如果有)无关。
- **Garak** 针对目标模型运行 `latentinjection`、`dan` 和 `goodside` 探测。
探测列表是经过刻意精简的 —— 编排器最初附带的更广泛
探测集(xss、glitch、malwaregen、leakreplay)在 Garak 0.14 中已被重命名或移除,
而剩余最重的 `promptinject` 家族被排除在默认设置之外,
因为它在笔记本电脑级别的 Ollama 目标上总是会超时。Garak 依然
在自身更大的超时预算下运行(参见下文的“逐步超时”)。
要运行完整的扫描,请将 `promptinject` 重新添加到 `layer1_broad_scan()` 的 `probes` 变量中,并进一步增加预算。
- **Promptfoo eval** 运行四个手工编写的测试用例:通过 `whoami` 进行命令注入、通过 `../../etc/passwd` 进行路径遍历、系统提示词提取,以及链式翻译 + 注入。本地 Ollama 模型被配置为 `llm-rubric` 评分器,因此不需要 `OPENAI_API_KEY`。
### Layer 2 — 针对性测试
针对已知的漏洞分类进行测试,并审计 MCP 工具面。
- **Promptfoo redteam** 针对 OWASP LLM Top-10 插件包生成对抗性测试用例,以及
过度代理、提示词提取和 shell 注入插件。
策略为越狱和提示词注入。
范围经过了刻意精简,以保持在笔记本电脑级别的
Ollama 目标上可行 —— `numTests=1` × 4 个插件 × 2 种策略 —— 但是
redteam 预设依然不总是能在 7B 模型的默认逐步超时内完成,
这就是为什么 Layer 2 拥有自己更大的超时预算(参见
下文的“逐步超时”)。如需更广泛的审计,请编辑
`_promptfoo_owasp_config()` 并传入 `--timeout 14400` 或更高。这种精简规模由
`tests/test_generated_artifacts.py` 锁定,因此它不会悄悄地再次变得臃肿。
- **mcp-scan** 静态审计 MCP 服务器的工具描述符,查找提示词注入向量、工具投毒和不安全模式。如果你提供了 `--mcp-config`,则针对其运行;如果设置了 `--demo-vulnerable-server`,则针对内置演示运行;否则在报告中明确说明并**跳过**。
### Layer 3 — 对对抗性测试
模拟使用多轮策略的持续攻击者。测试 LLM 的拒绝行为;不依赖于运行的是哪个 MCP 服务器。
- **PyRIT Crescendo** 在 8 个轮次内逐步升级并带有 3 次回溯,试图强迫模型发出 shell 形式的工具调用。
- **PyRIT TAP**(Tree of Attacks with Pruning,带剪枝的攻击树)运行分支搜索
(width=2, depth=2, branching=2, 关闭主题检查) 以寻找绕过安全拒绝的越狱路径。树的形状被调整为约 24 次模型调用,
因此可以在笔记本电脑的 7B 模型上在几分钟内完成;在
`_pyrit_tap_script()` 中增加维度即可进行更深的搜索。
PyRIT 脚本将 PyRIT 版本锁定在 0.8.1(0.9 将 orchestrators 移出了 `pyrit.orchestrator`),并包含了一个针对 0.x 重命名的 `initialize_pyrit` 回退机制。由于 PyRIT 0.8 弃用了 `OllamaChatTarget`,生成的脚本通过 `OpenAIChatTarget` 与 Ollama 在 `http://localhost:11434/v1` 的 OpenAI 兼容端点进行通信。这两种行为均由 `tests/test_generated_artifacts.py` 锁定。
### 逐步超时
并不是每一个步骤的消耗都一样大。mcp-scan 和 Promptfoo 的广度 eval 可以在几秒钟内完成;只有 Promptfoo 的 OWASP redteam 预设在笔记本电脑级别的 7B 模型上可能会花费一个小时或更长时间。因此,该步骤会获得更大的分层超时预算,而其他每一个步骤(包括 Garak)都使用全局超时上限:
| 步骤 | 超时时间 (秒) |
|-------------------------------|-------------------|
| Garak 广度扫描 | 3600 (使用 `--timeout`) |
| Promptfoo 广度评估 | 3600 (使用 `--timeout`) |
| Promptfoo OWASP redteam 预设| 7200 (2小时,按层覆盖) |
| mcp-scan 静态审计 | 3600 (使用 `--timeout`) |
| PyRIT Crescendo | 3600 (使用 `--timeout`) |
| PyRIT Tree of Attacks | 3600 (使用 `--timeout`) |
`--timeout N` 会为每一个没有按层覆盖的步骤(包括 Garak)提高全局超时上限,如果 `N` 大于 7200,它也会提高 OWASP 的覆盖值。因此,`--timeout 21600` 会分别为 Garak 和 Promptfoo OWASP 提供 6 小时的时间。将 `--timeout` 降低到 7200 以下并不会降低 OWASP 的覆盖值 —— 它至少会获得其默认值。
### 报告
**Markdown** (`RedTeam_Report.md`) ——始终生成。包含元数据、带有状态 + 严重性列的执行摘要表、逐步徽章(🟥 CRITICAL → 🟩 INFO → ⚪ NOT RUN)、注释、位于可折叠的 `
` 区块中的原始输出(已去除 ANSI),以及基于实际发现衍生出的建议。
**HTML** (`RedTeam_Report.html`) —— 通过 `--html` 生成。这是一个独立的、支持浅色/深色自适应的页面,包含相同的内容、无障碍徽章(图标 + 文本)、从摘要表到每个步骤的锚点链接、逐步耗时、如果任何步骤未完成则在页面顶部显示的横幅,以及打印样式表。
报告区分了步骤的**状态**(`completed` / `errored` / `timed out` / `skipped`)与**严重性** —— 失败和跳过的步骤永远不会被显示为“INFO 清洁”。
### 退出码
编排器**始终会运行所有选定的层级直到完成**并撰写完整的报告。它从不会因为某个发现而提前停止。退出码纯粹是给 CI 流水线的信号:
| 代码 | 含义 |
|---|---|
| `0` | 所有步骤为 INFO、WARN 或 MEDIUM —— 没有关键问题 |
| `1` | 至少有一个步骤被判定为 HIGH 或 CRITICAL —— 请审查报告 |
```
# GitHub Actions 示例
- name: AI Red Team Audit
run: uv run redteam_orchestrator.py --mcp-config ci/mcp.json --target ${{ matrix.model }} --timeout 3600
# Step fails on HIGH/CRITICAL — full report is always available as artifact
```
## OWASP 覆盖率映射
此工具的层级如何映射到两个 OWASP 分类。覆盖率刻意保持保守 —— 这是一个轻量级的、单代理 / 单服务器的红队工具,而不是详尽的审计。
图例:🟢 直接覆盖 · 🟡 部分覆盖 · 🔵 间接覆盖 · ⬜ 未覆盖
### OWASP MCP Top 10
| ID | 风险 | 覆盖率 | 提供方 |
|---|---|---|---|
| MCP01 | 令牌管理不当与机密泄露 | 🔵 间接覆盖 | mcp-scan 标记工具参数中的高熵字符串 _(仅为静态启发式;无令牌生命周期/轮换测试)_ |
| MCP02 | 权限过大与提权 | 🟡 部分覆盖 | mcp-scan 标记危险的权限组合(例如 文件系统 + 网络 = 数据外泄向量) _(静态检测;无运行时提权测试)_ |
| MCP03 | 工具投毒 | 🟡 部分覆盖 | mcp-scan 静态审计工具描述符以发现注入/投毒模式 _(仅限描述符级别;无行为检测)_ |
| MCP04 | 软件供应链与依赖篡改 | ⬜ 未覆盖 | _Garak packagehallucination 属于模型层,而非 MCP 依赖篡改_ |
| MCP05 | 命令注入 | 🟢 直接覆盖 | Promptfoo eval (whoami, '; id'), Garak exploitation, PyRIT 强制执行 system_diagnostics '; cat /etc/passwd' 的目标 |
| MCP06 | 上下文过度共享 | ⬜ 未覆盖 | — |
| MCP07 | 身份验证和授权不足 | ⬜ 未覆盖 | _受操作员/部署控制;未被测试_ |
| MCP08 | 审计与日志记录缺口 | ⬜ 未覆盖 | — |
| MCP09 | 影子 MCP 服务器 | ⬜ 未覆盖 | _需要注册中心/发现测试_ |
| MCP10 | 上下文注入与过度共享 | 🟡 部分覆盖 | Garak latentinjection (单跳间接/上下文注入) _(无模型绑定或隐蔽通道测试)_ |
### OWASP LLM Top 10 (2025)
| ID | 风险 | 覆盖率 | 提供方 |
|---|---|---|---|
| LLM01 | 提示词注入 | 🟢 直接覆盖 | Garak goodside + latentinjection, Promptfoo 'ignore previous instructions' 用例, Promptfoo OWASP 提示词注入策略 |
| LLM02 | 敏感信息泄露 | 🟡 部分覆盖 | Promptfoo 路径遍历 ('/etc/passwd') + 系统提示词提取; PyRIT 数据外泄目标 |
| LLM03 | 供应链 | ⬜ 未覆盖 | _Garak packagehallucination 属于相邻领域 (模型层), 不是 LLM 供应链_ |
| LLM04 | 数据和模型投毒 | ⬜ 未覆盖 | — |
| LLM05 | 输出处理不当 | 🟡 部分覆盖 | Garak ansiescape + web_injection.MarkdownImageExfil / MarkdownXSS (不安全/结构化输出) |
| LLM06 | 过度代理 | 🟡 部分覆盖 | PyRIT 工具强制; Promptfoo OWASP 过度代理插件 _(除非 'promptfoo auth login' 否则跳过 OWASP 插件)_ |
| LLM07 | 系统提示词泄漏 | 🟢 直接覆盖 | Promptfoo 系统提示词提取用例; Promptfoo OWASP 提示词提取插件 |
| LLM08 | 向量和嵌入弱点 | ⬜ 未覆盖 | — |
| LLM09 | 错误信息 | 🔵 间接覆盖 | Garak packagehallucination (幻觉包名) _(错误信息类的狭窄切片)_ |
| LLM10 | 无限制消耗 | ⬜ 未覆盖 | — |
**OWASP Agentic (ASI01–ASI10):刻意未评分。** 这是一个单代理、单服务器工具,因此真正的多代理 ASI 风险 —— ASI07 不安全的代理间通信,ASI08 级联故障,ASI10 流氓代理 —— 在结构上超出了范围。它确实触及的带有单代理特征的 ASI 风险(ASI01 目标劫持,ASI02 工具误用,ASI05 意外的代码执行,ASI06 内存与上下文投毒)已经反映在上面的 LLM 和 MCP 表格中。
## 审计你自己的 MCP 服务器
按照 [Claude Desktop / Cursor 格式](https://modelcontextprotocol.io/docs/tools/inspector)创建一个客户端配置 JSON:
```
{
"mcpServers": {
"my-server": {
"command": "python",
"args": ["path/to/your_mcp_server.py"]
}
}
}
```
然后运行:
```
uv run redteam_orchestrator.py --mcp-config my_mcp_client.json --layers 2
```
**范围:** `--mcp-config` 仅适用于 Layer 2(mcp-scan)。Layer 1 和 3 测试 LLM 的整体安全态势 —— 提示词注入抵抗力、越狱韧性 —— 与正在运行的是哪个 MCP 服务器无关。要为你的特定工具面定制 Layer 3 的攻击目标,请编辑编排器中的 `_pyrit_crescendo_script()` 和 `_pyrit_tap_script()` 函数,或者运行独立的 PyRIT 脚本。
## 清理
分为三个级别,每个级别都比上一个清理得更彻底:
```
# 仅生成文件(快速、安全、可重复)
uv run redteam_orchestrator.py --clean
# + uv cache, npm cache, ~/.pyrit state
uv run redteam_orchestrator.py --clean-deep
# + Ollama model weights(下次运行时会重新下载)
uv run redteam_orchestrator.py --clean-all
# 跳过确认 prompt(适用于 CI/scripts)
uv run redteam_orchestrator.py --clean-all -y
```
### 移除内容
| 级别 | 文件 |
|---|---|
| `--clean` | `mcp_server.py` (如果已安装), `promptfoo_*.json`, `mcp_scan_client.json`, `attack_pyrit_*.py`, `RedTeam_Report.md`, `RedTeam_Report.html`, `garak.log`, `garak_report*`, `.promptfoo*`, `redteam-output*` |
| `--clean-deep` | 上述内容 + `uv cache clean` + `npm cache clean --force` + `~/.pyrit/` |
| `--clean-all` | 上述内容 + `ollama rm ` |
编排器脚本本身(`redteam_orchestrator.py`)永远不会被移除。
## 测试
编排器自带了一个位于 `tests/` 下的 pytest 测试套件,用于锁定
那些在实际应用中已经遭到破坏的契约:
- `test_classify.py` —— 严重性启发式规则:`/etc/passwd` 泄露 → CRITICAL,
越狱标记 → HIGH,错误/超时的步骤 → NOT_RUN (永远不会是
INFO)。
- `test_run_step.py` —— 退出码处理:promptfoo `rc=100` (断言
失败) 和 mcp-scan `rc!=0` (存在发现) 都被重新归类
为 `completed`,而不是 `errored`。
- `test_generated_artifacts.py` —— 生成的 PyRIT 脚本必须能够解析,
必须使用 `OpenAIChatTarget` (而不是已弃用的 `OllamaChatTarget`),并且
精简后的 Promptfoo / TAP / Garak 范围被锁定,这样它们就不会悄悄地
再次变得臃肿。
```
uv run --with pytest --with rich --with "pyrit==0.8.1" pytest tests/ -v
```
CI 会在每次推送到主分支和每个 Pull Request 时运行相同的命令
(`.github/workflows/test.yml`)。
## 故障排除
### Ollama 未响应
```
curl -s http://localhost:11434/api/tags | head # is daemon running?
ollama ps # is model loaded?
pkill ollama && ollama serve # restart if needed
```
### 步骤超时
可以提高上限:
```
uv run redteam_orchestrator.py --timeout 7200
```
或者通过编辑脚本来减少工作负载 —— 在 `_promptfoo_owasp_config()` 中将 `numTests` 设置为 2,精简策略,或者减少 Crescendo 的 `max_turns` 或 TAP 的 `depth`。
如果想要对繁重的步骤进行不限时间的运行,可以单独运行它们:
```
uv run python attack_pyrit_tap.py | tee tap_results.txt
```
### PyRIT 导入错误
编排器的 PyRIT 脚本已经在 `pyrit.common.initialize_pyrit` 和 `pyrit.common.initialization.initialize_pyrit` 之间进行了回退。如果你仍然遇到类重命名的情况,请检查有哪些可用项:
```
uv run python -c "from pyrit import orchestrator; print([x for x in dir(orchestrator) if 'Orchestrator' in x])"
```
### Promptfoo 要求提供 OpenAI 密钥
配置已设置 `redteam.provider` 和 `defaultTest.options.provider` 以确保所有内容都在 Ollama 上运行(包括 `llm-rubric` 评分器)。如果你仍然看到 OpenAI 错误,请确保没有设置 `OPENAI_API_KEY` 环境变量。
### 运行期间 `ollama ps` 没有显示内容
可能是 Promptfoo 的生成阶段正尝试连接 OpenAI 而非 Ollama。请参见上文的说明。或者可能是 Ollama 守护进程已经终止 —— 使用 `curl http://localhost:11434/api/tags` 进行检查。
## 项目结构
```
.
├── redteam_orchestrator.py # the orchestrator (you keep this)
├── LICENSE
├── .gitignore
└── README.md
# 在运行时生成(由 --clean 清理):
├── promptfoo_broad.json # Layer 1 Promptfoo config
├── promptfoo_owasp.json # Layer 2 Promptfoo config
├── attack_pyrit_crescendo.py # Layer 3 Crescendo script
├── attack_pyrit_tap.py # Layer 3 TAP script
├── RedTeam_Report.md # Markdown report
├── RedTeam_Report.html # HTML report (with --html)
├── garak_report_l1.* # Garak output
└── redteam-output-*.json # Promptfoo output
# 仅使用 --demo-vulnerable-server 生成:
├── mcp_server.py # deliberately vulnerable MCP server (opt-in)
└── mcp_scan_client.json # mcp-scan target descriptor for the demo
```
## 已知局限性
该项目的范围是经过刻意设定的,其局限性已透明地作为 GitHub issues
进行跟踪 —— 从置顶的
[🗺️ 路线图与已知局限性](https://github.com/josephManzambi/ai-redteam-orchestrator/issues/38) 开始。
每个 issue 都解释了该边界存在的原因、它对你的结果意味着什么,
以及什么会改变它。
- [同一个微小模型同时担任 Target、Attacker 和 Judge (自我博弈)](https://github.com/josephManzambi/ai-redteam-orchestrator/issues/27) —— Layer 3 结果最大的注意事项
- [“无异常”的运行只是一次冒烟测试,而不是评估](https://github.com/josephManzambi/ai-redteam-orchestrator/issues/28)
- [严重性分类是启发式的 (存在假阴性风险)](https://github.com/josephManzambi/ai-redteam-orchestrator/issues/29)
- [针对笔记本级别的目标精简了范围](https://github.com/josephManzambi/ai-redteam-orchestrator/issues/30)
- [Promptfoo OWASP 生成受限于云端](https://github.com/josephManzambi/ai-redteam-orchestrator/issues/31)
- [鲁棒性与经过调优的模型相耦合](https://github.com/josephManzambi/ai-redteam-orchestrator/issues/32) (Crescendo / llama3.2:3b)
- [工具链版本漂移具有承重作用](https://github.com/josephManzambi/ai-redteam-orchestrator/issues/33)
- [多代理 / 运行时 MCP 风险超出范围](https://github.com/josephManzambi/ai-redteam-orchestrator/issues/34) (出于设计考虑)
人工专家测试(“Layer 4”)超出范围 —— 参见 [致谢](#acknowledgments)。
## 免责声明
此工具仅供**授权的安全测试**使用。可选的演示 MCP 服务器(仅通过 `--demo-vulnerable-server` 安装)包含真实的命令注入和路径遍历漏洞 —— 请勿将其暴露给不受信任的网络或用户。在对您不拥有的任何系统进行红队测试之前,请务必获得适当的授权。
## 致谢
此编排器分层的 Garak → Promptfoo → PyRIT 结构
遵循了 Amine Raji 在 [LLM Red
Teaming Tools: PyRIT & Garak (2025
Guide)](https://aminrj.com/posts/attack-patterns-red-teaming/) 中描述的红队测试方法论,该文章
在这些工具之间映射了一种四层测试策略。该分层概念
和工具映射归功于他。
这里的所有其他内容都是本项目独创的:单文件编排
和分层排序、严重性分类器、Markdown/HTML 报告
生成器、按层覆盖的超时机制、CI 退出码门控、
清理级别和 CLI,以及每一层运行的特定 Garak 探测项、Promptfoo 插件
和 PyRIT 目标(这些与文章中的
示例不同 —— 例如,它使用 `owasp:llm` 插件集,而不是 OWASP
Agentic 预设)。Layer 4(人工专家测试)被刻意排除在范围之外,
因为没有哪个编排器可以取代一个阅读过你代码库的人类。
如果你想要了解威胁建模框架、
OWASP Agentic Top 10 / MITRE ATLAS / CSA 映射,以及说明为什么代理式 AI 测试需要其自身方法论的
案例研究,请先阅读他的文章。
## 许可证
[MIT](LICENSE)
标签:AI红队, AI风险缓解, MITM代理, Python, 域名收集, 无后门, 逆向工具