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, 域名收集, 无后门, 逆向工具