lucamedeaa/trident
GitHub: lucamedeaa/trident
TRIDENT 是一个面向生成式 AI 系统的黑盒多 Agent 红队加速器,通过声明式策略将自然语言目标转化为受治理、可审计的标准化安全演练。
Stars: 1 | Forks: 2
# TRIDENT
**用于生成式 AI 系统的黑盒、多 Agent AI 红队加速器。**
TRIDENT 将纯英文目标 —— *“越狱聊天机器人”*、*“证明它会泄露数据”*、
*“仅仅映射攻击面”* —— 转化为一场受治理、可审计的红队演练。它从一个经过精心筛选且映射到标准(**OWASP LLM Top 10 (2025)** × **MITRE ATLAS** v6)的目录中选择技术,通过隔离的 Agent 将它们分派到三个攻击层执行,使用确定性预言机 (oracles) 和 LLM 评判器对每个结果进行评分,并输出一个独立的 HTML 报告和不可变的追踪记录。
基于 **GitHub Copilot SDK**(Agent 编排)、**Microsoft Foundry**(所有模型调用)和 **PyRIT**(执行面 —— 转换器、评分器、编排器)构建。
## 为什么选择 TRIDENT
对 GenAI 应用进行红队测试很难*一致地*执行 —— 发现取决于测试者的创造力,覆盖范围不均匀,结果不可复现,并且很容易超出交战规则。TRIDENT 使整个演练过程变得**声明式且受治理**:
- **黑盒** —— 只需要一个 endpoint 和简短的目标配置文件;不需要权重,也不需要源码。
- **标准映射** —— 每项技术都标记有 OWASP LLM Top 10 和 MITRE ATLAS。
- **Agent 只做选择,绝不凭空发明** —— 它们仅从固定的、经过审查的目录中进行选择。
- **由代码治理** —— manifest 就是你的*代码即交战规则*(模式、主机 allowlist、技术 denylist、查询预算、HITL 门控)。每一个动作在接触目标之前都会通过一个 policy gate。
- **可审计** —— 一个不可变的追踪记录会记录下每一个 prompt、响应、判定和证据。
## 工作原理
```
NL prompt ("prove it leaks the planted secret")
│
▼ Phase 1 — Package advisor (conversational, Foundry-backed; or --package)
Chosen package (e.g. PKG-EXFIL)
│
▼ Phase 2 — scope_to_scan (gating: capabilities, allow/denylist, mode, status)
ScanPlan(verticals = [1 or 3], skipped = [...])
│
▼ Phase 3 — Coordinator (Copilot SDK, agents-as-tools)
├── dispatch_prompt_agent ─► fenced Prompt session ─►┐
├── dispatch_app_agent ─► fenced App session ─►├─► Scorecards
└── dispatch_model_agent ─► fenced Model session ─►┘
│ each skill handler:
│ 1. PolicyGate.check(action)
│ 2. PyritRunner.execute(technique, params, target)
│ 3. SuccessOracle / LLM judge → verdict
│ 4. Trace.append_*
│
▼ Phase 4 — reports.correlator + reports.html_report
output/.html + output/.trace.jsonl
```
四个协作角色:
1. **NL→scope advisor** (`src/nl/`) —— 会话式 package 选择器;仅在提示模糊时要求澄清。
2. **Coordinator** (`src/orchestrator/`) —— 顶层 Agent;为范围内的每个层级开启一个*隔离的*垂直会话,仅暴露该层级的技能。
3. **Vertical agents** (`src/agents/`) —— Prompt / 应用 / 模型专家。
4. **Runner + oracle + trace** (`src/skills/`, `src/targets/`, `src/core/`) —— 确定性的主骨架:policy gate、通过 PyRIT 执行、评分、记录。
一次演练以**一个层级或全部三个层级为目标 —— 绝对不会恰好是两个**(ADR-021)。
## 目录:3 个层级,20 项技术
该目录是唯一的真理来源。每一项技术都是一个文件 —— `catalog/skills_catalog//SKILL.md` —— 其 **YAML frontmatter 是机器配置**,其 **Markdown 正文是面向 Agent 的操作流程**。注册表从这些文件中加载技术,并在加载时根据 `catalog/schema/catalog.schema.json` 验证每一项(快速失败)。
| 层级 | 攻击对象 | 技术 |
|---|---|---|
| **Prompt** (`TRD-PRM-*`) | 输入 / prompt 面 | 5 项 —— 系统提示词提取、直接注入、多轮越狱、混淆注入、护栏侦测 |
| **Application** (`TRD-APP-*`) | RAG、工具、编排 | 9 项 —— 间接/RAG 注入、信息泄露、输出处理 (XSS)、工具滥用、记忆投毒、通过工具窃取、凭证收集、工具投毒、表面枚举 |
| **Model** (`TRD-MOD-*`) | 通过其 API 的模型 | 6 项 —— 指纹识别、数据提取、错误信息、+ 成员推理 / 提取 / 反演 (post-MVP) |
覆盖范围是实事求是的:LLM03 (Supply Chain) 和 LLM10 (Unbounded Consumption) 被标记为 ⚔ 无法进行黑盒攻击,并附带了明确的原因。完整的矩阵和每项技术的详细信息卡片位于 [`catalog/CATALOG.md`](backend/catalog/CATALOG.md) 中。
## 攻击 package
一个 **package** 将技术 ID 与安全限制(`max_intensity`、`query_budget`)及其运行模式捆绑在一起。advisor 会将提示词解析为一个 package。共有 12 个 package(`catalog/packages.yaml`):
- **配置文件(一键式):** `PKG-QUICK` · `PKG-OWASP` · `PKG-ATLAS` · `PKG-360`。
- **按层级:** `PKG-PROMPT` · `PKG-APP` · `PKG-MODEL`。
- **按焦点:** `PKG-GUARDRAIL`(越狱)· `PKG-EXFIL`(数据窃取)· `PKG-RAG`(检索)· `PKG-AGENTIC`(工具滥用)· `PKG-RECON`(非侵入式)。
## 评分:已确认 vs 已评估
每个结果都带有一个判定*类型*,让你知道应该对其信任的程度:
| 判定 | 含义 | 产生方式 |
|---|---|---|
| **`confirmed`** | 确定性的基本事实,在追踪记录中带有证据 | `exfil_canary` / `leak_detector` (honeytoken)、`output_markup` (regex)、`categorical_match` (指纹) |
| **`assessed`** | LLM 的判断,而非基本事实 | `refusal_judge` / `judged_objective` (LLM 评判器,离线启发式降级方案) |
确定性检测器由每个目标的 **SuccessOracle** (`src/targets/oracle.py`) 提供支持。关键机制是 **canary honeytoken**:每次演练生成一次,通过适配器的 `plant_surface` 植入,并通过 `{planted_secret}` 注入到目标中。当模型输出该确切的 token 时,泄露即被*确认*,并且 canary 的 `data_classification` 会驱动 **MSRC AI bug-bar** 的严重程度。参见
[`catalog/severity.md`](backend/catalog/severity.md)、
[`catalog/oracle.md`](backend/catalog/oracle.md) 和
[`catalog/scorers.md`](backend/catalog/scorers.md)。
## 安装
```
cd backend
pip install -e ".[sdk,ranker,real,dev]" # full install; extras compose as needed
```
| 扩展 | 引入 | 用途 |
|---|---|---|
| `sdk` | `github-copilot-sdk`, `azure-identity` | Agent 化的 Coordinator + 垂直会话 |
| `ranker` | `openai`, `azure-identity` | 第一阶段 NL→scope advisor |
| `real` | `pyrit` | PyRIT 执行面 |
| `bridge` | `fastapi`, `uvicorn` | 可选的 `server.py` 前端桥接 |
| `dev` | `pytest`, `build` | 测试 + 打包 |
**基础安装**(无扩展)可运行确定性核心和离线 Web 引擎。`requirements.txt` 是已知良好环境的固定锁定文件。
## 配置 Microsoft Foundry
Coordinator 和 advisor 都会**通过 Microsoft Foundry 路由每一次模型调用**(向 Foundry 额度计费,从不消耗 Copilot token)。`FOUNDRY_ENDPOINT` 启用完整的 Agent 化路径;如果没有它,advisor 将降级为确定性 package,评判器将降级为离线启发式 —— 运行仍然有效。
```
$env:FOUNDRY_ENDPOINT = "https://.cognitiveservices.azure.com/"
$env:FOUNDRY_MODEL_DEPLOYMENT = "gpt-4o-mini"
az login # DefaultAzureCredential (preferred); or set $env:FOUNDRY_API_KEY for BYOK
```
将 `.env.example` 复制到 `.env` 以获取完整的变量列表。`TridentClient`
(`src/core/client.py`) 和 ranker 从环境中读取 `FoundrySettings` (`src/core/config.py`) —— 无需修改代码。
## 运行
### Web UI
`frontend/frontend.html` 是一个单文件控制台(规划器、实时终端、报告查看器),由标准库 Web 桥接 (`src/web/`) 提供服务 —— 除了基础安装外,不需要任何额外依赖。它开箱即用地运行进程内的 **Echo** 目标,因此你可以在没有外部目标的情况下演练完整的 规划 → 分派 → 评分 → 报告 流程。
```
run_web.cmd # http://localhost:8765
run_web.cmd --port 9000
```
| Endpoint | 用途 |
|---|---|
| `GET /api/health` | 能力探测(目录计数,foundry/pyrit/sdk 标志) |
| `GET /api/packages`, `/api/techniques` | 用于 UI 的目录数据 |
| `POST /api/plan` | 一次 advisor 轮次 —— 提出 package 或进行澄清 |
| `POST /api/campaign` | 运行侦测/攻击演练;返回追踪记录 + 报告 |
| `GET /api/logstream` | Server-Sent Events:实时引擎日志 |
### CLI
将其指向一个 manifest(交战规则)和一个 prompt;advisor(或 `--package`)会选择范围。
```
python -m src.cli `
--manifest manifests/aigoat.yaml `
--catalog catalog --targets-dir targets --out output `
--prompt "direct prompt injection: override the bot and exfiltrate the secret"
# 跳过 advisor 并 pin 一个 package:
python -m src.cli --manifest manifests/aigoat.yaml --package PKG-GUARDRAIL `
--prompt "bypass the guardrails"
```
有用的标志 (`python -m src.cli --help`):`--package `、`--confirm-chain`(每个层级的人工介入)、`--targets-dir`、`--catalog`、`--out`。运行会写入 `output/.html` 和 `output/.trace.jsonl`。
manifest 是微小且声明式的 —— `manifests/aigoat.yaml`:
```
campaign_id: aigoat
mode: attack # recon | attack — gate-enforced (ADR-018)
target_profile_id: aigoat # resolves targets/aigoat.yaml by its `id`
technique_denylist: []
host_allowlist: [127.0.0.1] # attack traffic stays here
query_budget_per_vertical: 5
hitl_techniques: []
```
## 接入目标
核心是**与目标无关的** —— 只有 `src/targets/*.py` 可以知道 endpoint 的具体细节。目标通过 YAML **profile** 和 `success_oracle` 块插入;**可目标化能力是计算出来的**(只有在目标的 `capabilities` 满足其 `needs_capabilities` 时,技术才会运行)。
```
id: my-target
name: "My GenAI app"
base_url: "https://my-target.invalid"
capabilities: [has_chat] # drives targetability
surfaces:
chat: { method: POST, path: /api/chat }
auth: { type: none } # none | bearer | apikey | cookie
success_oracle:
canary: # → exfil_canary / leak_detector
prefix: TRIDENT
plant_surface: chat # chat | retrieval_ingest | search | tool
data_classification: Confidential
expected_model_set: [GPT, Llama, Mistral, Phi] # → categorical_match
```
| 检测器 | 判定 | profile 中需要的配置 |
|---|---|---|
| `exfil_canary` / `leak_detector` | `confirmed` | `success_oracle.canary` + 植入它的适配器 |
| `output_markup` | `confirmed` | 无需配置 —— 通用 regex |
| `categorical_match` | `confirmed` | `success_oracle.expected_model_set` |
| `refusal_judge` / `judged_objective` | `assessed` | 无需配置 —— LLM 评判器,离线降级方案 |
目前内置了两个适配器:**`echo`**(进程内)和 **`aigoat`**(HTTP,参考易受攻击目标)。一个新的 `id` 需要一个实现 `send()` 的小型适配器(如果是 canary,还需实现 `plant()`)。参见
[`targets/target_profile.example.yaml`](backend/targets/target_profile.example.yaml) 和
[`targets/aigoat.yaml`](backend/targets/aigoat.yaml)。
## 项目结构
```
backend/ # all Python: engine, API, catalog, profiles
├── src/
│ ├── core/ # client (Foundry), models, policy_gate, trace, config
│ ├── nl/ # advisor + scope_to_scan
│ ├── skills/ # base, registry, pyrit_runner, judge
│ ├── agents/ # vertical-session factory + briefs
│ ├── orchestrator/ # coordinator, dispatch (agents-as-tools), scope_tool
│ ├── targets/ # adapter Protocol, oracle, echo, aigoat
│ ├── reports/ # correlator + html_report
│ ├── web/ # stdlib HTTP server + engine + SSE logbus
│ └── cli.py # python -m src.cli
├── catalog/ # 20 techniques + 12 packages + JSON Schema + design docs
├── targets/ # declarative target profiles
├── manifests/ # Rules of Engagement as Code
├── run_web.cmd · requirements.txt · pyproject.toml · .env.example
frontend/frontend.html # single-file TRIDENT console
server.py # optional FastAPI bridge (frontend/index.html ↔ campaign)
output/ # generated reports (.html) + traces (.trace.jsonl)
```
## 设计不变量与关键 schema
四项规则保持了系统的可审计性和目标无关性:
1. **技能永远不直接调用 PyRIT** —— 它们通过 `skills.pyrit_runner.PyritRunner` 进行。
2. **每一个动作都在 skill handler 内部通过 `core.policy_gate.PolicyGate.check`**。
3. **只有不可变的 `core.trace.Trace`** 会反馈给报告 —— 没有共享黑板。
4. **与目标无关的核心** —— 只有 `src/targets/*.py` 可以知道 endpoint 的具体细节。
| 概念 | 类型 | 备注 |
|---|---|---|
| `mode` | `recon` / `attack` | 演练级别(manifest)。由门控强制执行 (ADR-018)。 |
| `phase` | `recon` / `exploit` / `both` | 技术级别;recon 模式保持 `phase ∈ {recon, both}`。 |
| `severity_base` | `critical`…`info` | MSRC AI bug bar。 |
| `scorer` | enum | 确定性 → SuccessOracle (`confirmed`);评判 → LLM judge (`assessed`)。 |
| 层级基数 | `1` 或 `3`,绝不是 `2` | ADR-021:一个层级或所有三个层级。 |
## 路线图
- 自动技术合成 —— 起草新 `SKILL.md` 技术的工具。
- 重新配置 `pytest` 套件(policy gate、ranker、端到端分派)。
- 将真实的 PyRIT 作为默认评判器(取代今天的离线启发式)。
- 累积范围的模型技术 (`TRD-MOD-004/005/006`)。
- Foundry 托管部署(使用 Key Vault + Managed Identity 的 `azd up`)。
- 更丰富的 HTML 报告 —— 攻击链可视化和 ATLAS 热力图。
## License
MIT © Nikita Litovchenko, Luca Medea, Lorenzo Albani, Riccardo Ponte, Changchen Yu, Alp Bayrak. 参见 [`pyproject.toml`](backend/pyproject.toml)。
标签:DLL 劫持, Python, 人工智能, 反取证, 后端开发, 域名收集, 多智能体, 大语言模型, 安全评估, 无后门, 用户模式Hook绕过, 逆向工具, 配置审计