Auro-rium/canary
GitHub: Auro-rium/canary
基于 LangGraph 多 Agent 流水线的自主 AI 红队平台,对任意 HTTP 接口的 AI Agent 自动执行对抗性安全测试并生成分类审计报告。
Stars: 0 | Forks: 0
# Agent Canary
[](https://www.python.org/)
[](https://react.dev/)
[](https://aws.amazon.com/bedrock/)
[](https://github.com/langchain-ai/langgraph)
[](https://fastapi.tiangolo.com/)
[](https://docs.docker.com/compose/)
[](https://opensource.org/licenses/MIT)
自主 AI 红队平台。将其指向任何基于 HTTP 的 AI agent,一个由 4 个 agent 组成的 LangGraph pipeline 就会对其进行攻击,评估其发现,并将所有内容实时流式传输到 React 仪表板。发现的漏洞需要人工分诊——该平台负责报告漏洞,但不会自动修复它们。
## 仓库布局
```
canary/
├── docker-compose.yml # Orchestrates all 3 services
├── canary/ # React 19 + TypeScript + Vite 8 dashboard → canary/README.md
├── cyber-redteam-foundry/ # FastAPI + LangGraph red-team engine → cyber-redteam-foundry/README.md
│ └── target_agent/ # LangChain ReAct victim agent (port 9000) → cyber-redteam-foundry/target_agent/README.md
├── runs/ # SQLite DBs, logs (git-ignored)
└── reports/ # Generated audit reports (git-ignored)
```
## 架构
四个专用 agent 在 AWS Bedrock 上作为有状态的 LangGraph pipeline 运行。
```
graph TD
START([Start Campaign]) --> strategist["1 · Strategist
Picks strategies, dispatches ≤3 parallel branches"] strategist -.->|Send| attacker["2 · Attacker branch
DeepSeek V3
Builds & fires adversarial prompts"] attacker --> target["Target Agent
HTTP endpoint under test"] target --> evaluator["3 · Evaluator
Qwen3 480b
Det. detectors + LLM judge"] evaluator --> branch{Vulnerability found
and iterations remain?} branch -->|Yes — re-dispatch| strategist branch -->|No| reporter["4 · Reporter
Qwen3 480b
Markdown + JSON audit report"] reporter --> END([Persist findings]) style START fill:#10b981,stroke:#047857,color:#fff style END fill:#6366f1,stroke:#4f46e5,color:#fff style target fill:#f59e0b,stroke:#d97706,color:#fff style branch fill:#3b82f6,stroke:#2563eb,color:#fff ``` ### Agent 角色 | Agent | Model | 职责 | |---|---|---| | Strategist | — (无 LLM 调用) | 每次迭代随机分配最多 3 种攻击策略,作为并行分支执行 | | Attacker | DeepSeek V3 | 构建对抗性 prompt,并针对目标执行 | | Evaluator | Qwen3 480b | 确定性检测器 + LLM 评判;生成 4 种情况的一致性裁决;负责“迭代-还是-报告”的路由决策 | | Reporter | Qwen3 480b | 结构化的 Markdown 和 JSON 审计报告,包含针对单个漏洞的证据 | ## 针对任何 HTTP Agent Agent Canary 提供了一个 `HttpTargetAdapter`,可以包装任何实现了简单聊天接口的 HTTP endpoint。通过 `--target-id` 传递 URL: ``` cyber-rt run --target-id http://your-agent.internal/chat --strategies prompt_injection,tool_misuse ``` 该适配器会: - 向该 endpoint POST `{"message": ""}`
- 将可选的 `TARGET_API_KEY` 作为 `Authorization: Bearer ` 转发
- 从首次出现的以下字段中读取响应文本:`response`、`output`、`content` 或 `text`
无需更改 SDK。任何接受带有 `message` 字段的 POST 请求并返回包含上述任一字段的 JSON 响应的 agent 都是有效的目标。
## 攻击策略
共 12 种策略,每种策略都通过 `configs/asi_taxonomy.yaml` 映射到 ASI 和 MITRE ATLAS 分类法:
| 策略 | 描述 |
|---|---|
| `prompt_injection` | 直接指令劫持、系统 prompt 提取 |
| `indirect_injection` | 通过工具输出(文档、API、数据库记录)传递 payload |
| `jailbreak` | 绕过 LLM 级别的安全防护 |
| `tool_misuse` | 通过计算器函数、shell 命令、路径遍历实现 RCE |
| `memory_poisoning` | 向 agent 内存中插入虚假前提或恶意规则 |
| `retrieval_poisoning` | 从 vector store 中提取索引凭证、文档 ID 或原始源数据块 |
| `sensitive_data_exposure` | 提取 PII、SSN、连接字符串、API 密钥 |
| `workflow_manipulation` | 迫使 agent 跳过授权步骤或批准未经授权的操作 |
| `agent_handoff_corruption` | 劫持多 agent pipeline 中 sub-agent 之间的消息 |
| `authorization_boundary` | 权限提升、跨账户数据访问 |
| `instruction_hierarchy` | 使用用户级输入覆盖开发者的系统指令 |
| `context_isolation` | 破坏文档上下文以访问未授权文件 |
**分类法映射:** ASI01–ASI10(AI 安全智能类别)和 ATLAS 技术(例如 `AML.T0051.002`)。查找表:`configs/asi_taxonomy.yaml`。各类别的置信度阈值:`configs/thresholds.yaml`。
## 评估系统
两层评估机制针对每次尝试生成 4 种情况的一致性裁决:
**第 1 层 — 确定性检测器**
针对 PII、凭证、prompt 注入特征、工具滥用、内存违规、RAG 探测进行 Regex 和模式匹配。
**第 2 层 — LLM 评判 (Qwen3 480b)**
根据攻击策略的成功标准进行语义置信度评分。
| 检测器结果 | LLM 结果 | 裁决 |
|---|---|---|
| 命中 | 命中 | `confirmed / high` |
| 命中 | 不确定 | `confirmed / medium` |
| 未命中 | 命中 | `unconfirmed / low` |
| 未命中 | 未命中 | `inconclusive` |
## 存储
位于 `runs/redteam.db` 的 SQLite 数据库,包含三个表:
| 表 | 用途 |
|---|---|
| `findings` | 通过 `sha256(target:component:strategy:asi_class)[:16]` 去重。生命周期:`open → wont_fix \| false_positive`(人工分诊,需要 reviewer_id + 理由) |
| `evaluator_verdicts` | 完整的审计跟踪 —— 每次尝试、评分、置信度、裁决 |
| `attack_traces` | 原始对抗性输入(未经清洗)、工具调用、完整响应 |
通过 `sentence-transformers all-MiniLM-L6-v2` 进行语义去重(余弦相似度 ≥ 0.92 会抑制近似重复的漏洞发现)。
## REST API
后端运行在端口 **8001**。所有 endpoint 都需要 `Authorization: Bearer `。
| 方法 | 路径 | 描述 |
|---|---|---|
| `GET` | `/api/status` | 健康检查 —— API、数据库、报告输出 |
| `POST` | `/api/runs` | 启动活动 |
| `GET` | `/api/runs/{run_id}` | 活动状态和遥测数据 |
| `GET` | `/api/runs/{run_id}/analysis-report` | 面向前端的结构化分析及跟踪记录 |
| `GET` | `/api/runs/{run_id}/findings` | 特定运行的漏洞发现 |
| `GET` | `/api/open-findings` | 跨所有运行的未解决漏洞 |
| `GET` | `/api/incidents` | 实时事件流 |
| `GET` | `/api/findings` | 分页显示的漏洞(过滤器:`severity`、`status`、`asi_class`) |
| `GET` | `/api/findings/{finding_id}` | 单个漏洞详情 |
| `GET` | `/api/findings/{finding_id}/attempts` | 单个漏洞的所有尝试记录 |
| `PUT` | `/api/findings/{finding_id}/status` | 更新漏洞生命周期状态 |
| `GET` | `/api/targets/{target_id}/coverage` | 目标的 ASI 覆盖图 |
| `GET` | `/api/targets/{target_id}/trends` | 目标的攻击趋势数据 |
| `POST` | `/api/campaigns/run` | 启动带有 SSE 流式传输的活动 |
Swagger UI:`http://localhost:8001/docs`(或通过 nginx proxy 访问 `http://localhost:8000/api/docs`)。
## 仪表板
React 19 SPA 运行在端口 **8000**,包含三个页面:
| 页面 | 描述 |
|---|---|
| Run Audit | 配置并启动活动。带有 agent 拓扑图的实时 SSE 流。 |
| Findings | 分页形式的漏洞表,带有裁决徽章、严重性、状态生命周期控制。 |
| Red Team | 实时事件流、运行详情面板、策略标签。 |
## 快速开始 (Docker)
**前提条件:** Docker Desktop(或 Engine + Compose 插件),拥有 AWS 账户且在您所在的区域启用了对 Qwen3 模型的 Bedrock 访问权限。
```
# 1. Clone
git clone canary && cd canary
# 2. Backend 环境
cp cyber-redteam-foundry/.env.example cyber-redteam-foundry/.env
# 编辑 cyber-redteam-foundry/.env — 参见下方的 Environment Variables 部分
# 3. Frontend token(必须与上方的 API_SECRET_KEY 匹配)
echo 'VITE_API_TOKEN=your-api-secret-key' > .env
# 4. 构建并启动
docker compose up -d --build
# 5. 打开 dashboard
open http://localhost:8000
```
### Docker 服务
| 服务 | 宿主机端口 | 描述 |
|---|---|---|
| `canary-frontend` | 8000 | nginx 托管 React SPA;将 `/api/*` 代理到后端 |
| `redteam-backend` | 8001 | FastAPI + LangGraph orchestrator |
| `target-agent` | 9000 | CompanyBot —— 用于测试的 LangChain ReAct agent |
## 环境变量
### `cyber-redteam-foundry/.env`
```
# AWS Bedrock — 凭证通过标准 boto3 chain 解析
AWS_REGION="us-east-1"
AWS_ACCESS_KEY_ID="" # or use ~/.aws/credentials / instance role
AWS_SECRET_ACCESS_KEY=""
AWS_SESSION_TOKEN="" # optional, for temporary credentials
# API 认证 — 所有 /api/* endpoints 使用 Bearer token
API_SECRET_KEY="change-me"
# Authorization scope — 运行允许的逗号分隔 target_ids
# 留空 = 未强制执行 allowlist
ALLOWED_TARGETS=""
# Target 配置
TARGET_MODE="sandbox" # sandbox | http
TARGET_ENDPOINT="" # e.g. http://localhost:9000/chat
TARGET_API_KEY="" # forwarded as Bearer token to target
# 日志记录
LOG_LEVEL="INFO"
LOG_FILE="runs/cyber_redteam.log"
# 存储
DB_PATH="runs/redteam.db"
# 报告
REPORT_OUTPUT_DIR="reports"
REPORT_FORMAT="markdown" # markdown | json | both
# 运行限制
MAX_RETRIES=3
TIMEOUT_SECONDS=30
DETERMINISTIC_SEED=42
```
### 根目录 `.env` (前端构建参数)
```
# 必须与 cyber-redteam-foundry/.env 中的 API_SECRET_KEY 匹配
VITE_API_TOKEN="change-me"
```
## 本地开发 (不使用 Docker)
**后端**
```
cd cyber-redteam-foundry
uv venv --python 3.11 && source .venv/bin/activate
uv pip install -e ".[dev]"
cp .env.example .env # fill in credentials
cyber-rt init # create DB, directories, log config
cyber-rt server --port 8001
```
**前端**
```
cd canary
npm install
echo 'VITE_API_TOKEN=change-me' > .env
npm run dev
# → http://localhost:5173
```
**目标 agent (可选 —— 用于针对 CompanyBot 进行测试)**
```
cd cyber-redteam-foundry && source .venv/bin/activate
python -m target_agent.server --host 0.0.0.0 --port 9000
```
**从 CLI 运行活动**
```
# 单一 strategy
cyber-rt run --target-id http://localhost:9000/chat --strategies prompt_injection
# 多 strategy
cyber-rt run \
--target-id http://localhost:9000/chat \
--strategies prompt_injection,tool_misuse,retrieval_poisoning \
--max-attempts 5 \
--max-iterations 3
# Diagnostics
cyber-rt doctor # verify AWS Bedrock connectivity
cyber-rt list-strategies # show all strategies with severity defaults
cyber-rt status # summary of last run
cyber-rt graph # print Mermaid diagram of the LangGraph workflow
```
## 子项目文档
- [`canary/README.md`](canary/README.md) — React 仪表板:组件映射、Vite 配置、nginx 代理设置
- [`cyber-redteam-foundry/README.md`](cyber-redteam-foundry/README.md) — 后端引擎:LangGraph 状态机、agent 实现、CLI 参考、API 详情
- [`cyber-redteam-foundry/target_agent/README.md`](cyber-redteam-foundry/target_agent/README.md) — CompanyBot 受害者 agent:工具、endpoints、配置
## 许可证
[MIT](https://opensource.org/licenses/MIT)
Picks strategies, dispatches ≤3 parallel branches"] strategist -.->|Send| attacker["2 · Attacker branch
DeepSeek V3
Builds & fires adversarial prompts"] attacker --> target["Target Agent
HTTP endpoint under test"] target --> evaluator["3 · Evaluator
Qwen3 480b
Det. detectors + LLM judge"] evaluator --> branch{Vulnerability found
and iterations remain?} branch -->|Yes — re-dispatch| strategist branch -->|No| reporter["4 · Reporter
Qwen3 480b
Markdown + JSON audit report"] reporter --> END([Persist findings]) style START fill:#10b981,stroke:#047857,color:#fff style END fill:#6366f1,stroke:#4f46e5,color:#fff style target fill:#f59e0b,stroke:#d97706,color:#fff style branch fill:#3b82f6,stroke:#2563eb,color:#fff ``` ### Agent 角色 | Agent | Model | 职责 | |---|---|---| | Strategist | — (无 LLM 调用) | 每次迭代随机分配最多 3 种攻击策略,作为并行分支执行 | | Attacker | DeepSeek V3 | 构建对抗性 prompt,并针对目标执行 | | Evaluator | Qwen3 480b | 确定性检测器 + LLM 评判;生成 4 种情况的一致性裁决;负责“迭代-还是-报告”的路由决策 | | Reporter | Qwen3 480b | 结构化的 Markdown 和 JSON 审计报告,包含针对单个漏洞的证据 | ## 针对任何 HTTP Agent Agent Canary 提供了一个 `HttpTargetAdapter`,可以包装任何实现了简单聊天接口的 HTTP endpoint。通过 `--target-id` 传递 URL: ``` cyber-rt run --target-id http://your-agent.internal/chat --strategies prompt_injection,tool_misuse ``` 该适配器会: - 向该 endpoint POST `{"message": "
标签:AI红队, CISA项目, 反取证, 多智能体, 安全评估, 版权保护, 网络测绘, 自动化渗透测试, 逆向工具