trossitter/clinical-redteam
GitHub: trossitter/clinical-redteam
面向AI临床辅助系统的多智能体红队测试平台,通过协同攻击、独立裁决和自动化报告持续发现医疗AI工作流中的安全漏洞。
Stars: 1 | Forks: 0
# AgentForge
**面向 Clinical Co-Pilot 的对抗性 AI 安全平台**
Gauntlet AI — 第 3 周 · 由 Thalia Rossitter 构建 · 2026 年 5 月
AgentForge 持续对 [Clinical Co-Pilot](https://clinicalcopilot.org) 进行红队测试——这是一个内置于 OpenEMR 的 AI 聊天机器人,使医生能够通过自然语言界面访问患者病历数据和临床指南。这种在临床工作流中通过 AI 介导访问受保护健康信息 (PHI) 的组合,创造了一个高价值、高风险的攻击面,而静态安全扫描无法充分覆盖这一攻击面。
**实时平台:** https://clinicalcopilot.org/agentforge
**目标系统:** https://clinicalcopilot.org (演示模式,合成患者,无真实 PHI)
**代码库:** https://github.com/trossitter/clinical-redteam
https://clinicalcopilot.org/agentforge
https://x.com/TrossasaurusRex/status/2054283180702838963
https://www.loom.com/share/cad7c2b7c86d4438a5d553ef24024529
https://labs.gauntletai.com/thaliarossitter/clinical-redteam
https://labs.gauntletai.com/thaliarossitter/openemr
## 架构
AgentForge 是一个四智能体 [LangGraph](https://langchain-ai.github.io/langgraph/) 系统。每个智能体都具有有限的职责和带有独立上下文的独立模型调用——这正是将多智能体协作与线性流水线区分开来的关键。
```
+--------------------------------------------------+
| AgentForge Platform (Python / LangGraph) |
| |
| Orchestrator ←→ Red Team |
| ↕ ↕ |
| Documentation ← Judge |
| |
| SQLite (regression store) | Langfuse (traces) |
+--------------------------------------------------+
|
| HTTP (live traffic — same interface a browser uses)
↓
https://clinicalcopilot.org
(Clinical Co-Pilot / OpenEMR)
```
AgentForge 仅通过其公共 HTTP 接口与目标进行通信。没有特权访问,没有内部钩子——该平台测试的是对手所能看到的内容。
### 智能体
| 智能体 | 模型 | 职责 |
|---|---|---|
| **Orchestrator** | Claude Sonnet 4.6 | 读取 SQLite 覆盖率缺口,指挥 Red Team,管理 token 预算,触发回归运行 |
| **Red Team** | Groq llama-3.3-70b / Qwen2.5:32b | 生成和变异对抗性输入,针对实时目标执行多轮 HTTP 序列 |
| **Judge** | Claude Sonnet 4.6 | 独立裁决(成功 / 部分 / 失败 / 不确定),版本化评分标准,注入金丝雀用于漂移检测 |
| **Documentation** | Claude Sonnet 4.6 | 已确认的漏洞利用 → 结构化漏洞报告;针对“严重”级别设有审批门禁 |
**为什么 Red Team 运行开源权重模型:** 前沿商业模型(Claude、GPT-4)经过安全训练,会拒绝攻击性安全工作流。通过 Ollama(本地)运行的 Qwen2.5:32b 或通过 Groq(部署版)运行的 llama-3.3-70b 能够完全投入于 prompt 注入、PHI 泄露和角色提权任务。Judge 和 Documentation 智能体使用 Claude Sonnet 4.6——它们不执行攻击性工作,并且需要精确、一致的结构化输出。
### 智能体交互
```
graph TD
ORC[Orchestrator\nClaude Sonnet 4.6]
RT[Red Team\nQwen2.5:32b / llama-3.3-70b]
JG[Judge\nClaude Sonnet 4.6]
DOC[Documentation\nClaude Sonnet 4.6]
HG[Human Approval Gate]
DB[(SQLite)]
OBS[Langfuse]
TGT[clinicalcopilot.org]
ORC -->|attack category + budget| RT
RT -->|multi-turn HTTP sequences| TGT
TGT -->|response payloads| RT
RT -->|attack + response record| JG
JG -->|partial / uncertain| RT
JG -->|confirmed exploit| DOC
JG -->|uncertain verdict| HG
DOC -->|Critical report| HG
DOC -->|High and below| DB
HG -->|approved report| DB
ORC -->|coverage + cost data| DB
DB -->|session state| ORC
RT -->|traces| OBS
JG -->|traces| OBS
DOC -->|traces| OBS
ORC -->|traces| OBS
```
核心攻击循环是 `Orchestrator → Red Team → Judge`。当 Judge 返回部分裁决时,它会直接反馈给 Red Team 进行变异——这种循环边缘正是将多智能体协作与顺序流水线区分开来的关键。
## 部署模式
| 模式 | Red Team 模型 | 用例 |
|---|---|---|
| **本地开发** | 通过 Ollama 运行 Qwen2.5:32b | 开发、测试、完全隐私 |
| **部署版** | 通过 Groq API 运行 llama-3.3-70b | 生产环境、常驻运行、无需笔记本电脑 |
通过 `RED_TEAM_PROVIDER` 环境变量进行切换:`groq` 或 `ollama`。
### 部署基础设施
- 作为 Docker 服务运行在 DigitalOcean 上(与目标在同一 droplet 上)
- Apache 将 `/agentforge` 代理到 8500 端口的 FastAPI
- 一键部署:`./deploy.sh`
## 代码库布局
```
agents/
orchestrator.py — coverage-driven task assignment, budget control, regression triggers
red_team.py — attack generation, mutation loop, multi-turn HTTP execution
judge.py — independent verdict engine, canary drift detection
documentation.py — exploit → structured vulnerability report, human gate for Critical
graph/
state.py — AgentForgeState TypedDict (shared across all agents)
graph.py — LangGraph node + edge wiring
harness/
db.py — SQLite regression store (coverage, findings, verdicts, budget)
evals/cases/
prompt_injection.json — seed attack cases: direct, indirect, multi-turn
phi_exfiltration.json — cross-patient exposure, authorization bypass, inference leakage
dos_patterns.json — token exhaustion, loop amplification
reports/ — vulnerability reports (auto-generated by Documentation Agent)
observability/
langfuse_client.py — trace emission for all agents
server.py — FastAPI dashboard (gate animation, verdict feed, run trigger)
main.py — CLI entry point (run_session())
Dockerfile — Python 3.12-slim, port 8500
deploy.sh — rsync + docker compose up --build to DigitalOcean
ARCHITECTURE.md — full multi-agent design, agent specs, trust boundaries, cost analysis
THREAT_MODEL.md — attack surface map of Clinical Co-Pilot (~500-word executive summary)
```
## 设置 — 本地开发
**要求:** Python 3.12+,已拉取 `qwen2.5:32b` 的 [Ollama](https://ollama.com),Anthropic API 密钥
```
git clone https://github.com/trossitter/clinical-redteam
cd clinical-redteam
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
# 填写: ANTHROPIC_API_KEY, COPILOT_SECRET
# RED_TEAM_PROVIDER 默认为 ollama
ollama serve &
ollama pull qwen2.5:32b
python main.py
```
## 设置 — 部署版
**要求:** Anthropic API 密钥,Groq API 密钥(通过 [console.groq.com](https://console.groq.com) 获取免费额度)
```
cp .env.example .env
# 设置:
# RED_TEAM_PROVIDER=groq
# GROQ_API_KEY=gsk_...
# ANTHROPIC_API_KEY=sk-ant-...
# COPILOT_SECRET=...
./deploy.sh
```
### 环境变量
| 变量 | 默认值 | 描述 |
|---|---|---|
| `ANTHROPIC_API_KEY` | — | 必填。由 Orchestrator、Judge、Documentation 智能体使用 |
| `GROQ_API_KEY` | — | 当 `RED_TEAM_PROVIDER=groq` 时必填 |
| `RED_TEAM_PROVIDER` | `ollama` | `ollama` 或 `groq` |
| `COPILOT_SECRET` | — | Clinical Co-Pilot API 的共享密钥 |
| `TARGET_URL` | `https://clinicalcopilot.org/copilot` | 攻击目标端点 |
| `SESSION_BUDGET_TOKENS` | `100000` | Orchestrator 停止前每个会话的最大 token 数 |
| `MAX_MUTATIONS` | `3` | 每次部分结果允许的 Red Team 最大变异迭代次数 |
## 运行攻击
**通过 Dashboard:**
```
https://clinicalcopilot.org/agentforge
```
点击 **Run Attack Session** 以触发一个完整的周期。
**通过 API:**
```
curl -X POST https://clinicalcopilot.org/agentforge/run
```
**通过 CLI (本地):**
```
source .venv/bin/activate
python main.py
```
## 攻击类别
| 类别 | 子类别 |
|---|---|
| **Prompt 注入** | 直接指令覆盖,通过患者笔记/RAG 间接注入,多轮角色漂移,临床权威注入 |
| **PHI 泄露** | 跨患者暴露,授权绕过,从会话历史中推断泄露 |
| **状态破坏** | 上下文投毒,对话历史篡改,虚假临床事实注入 |
| **工具滥用** | 参数篡改,递归工具调用,摄入端点滥用 |
| **拒绝服务** | Token 耗尽,通过无限制的工具调用序列进行循环放大 |
| **身份利用** | 权限提升,角色劫持,PID 字段篡改 |
初始用例以结构化 JSON 的形式存放在 `evals/cases/` 中——具有确定性、可复现、可扩展。
## Dashboard
位于 `/agentforge` 的平台展示以下内容:
- **覆盖率表格** — 每个攻击类别的用例数及其成功 / 部分 / 失败的计数
- **实时 Judge 裁决信息流** — 每次攻击的完整裁决和依据文本,按结果进行颜色编码
- **漏洞报告浏览器** — 由 Documentation 智能体自动生成
- 每 20 秒自动刷新
## 人机协同审批门禁
有两个点需要人工审批——所有其他决策都是自动化的:
1. **严重级别报告** — 在提交前暂留(HIPAA 义务)
2. **不确定的 Judge 裁决** — 升级到人工队列,绝不自动归档
此范围是有意设定的:足够窄以避免审查疲劳,足够广以在最高风险层级保持问责。
## 可观测性
所有智能体通过 `observability/langfuse_client.py` 向 [Langfuse](https://langfuse.com) 发送追踪数据。每次追踪包括每轮的输入、输出、延迟和 token 使用情况。SQLite 数据库 (`agentforge.db`) 是覆盖率、发现和会话状态的权威记录——它是可查询、可版本化的,并且不需要云基础设施。
## 成本
| 组件 | 每次攻击周期的成本 |
|---|---|
| Red Team 推理(Groq 免费额度) | $0 |
| Orchestrator + Judge + Documentation (Claude Sonnet 4.6) | ~$0.01–0.02 |
| **总计** | **~$0.01–0.02** |
## 核心文档
| 文档 | 内容 |
|---|---|
| [`ARCHITECTURE.md`](ARCHITECTURE.md) | 完整的多智能体设计:智能体规格、信任边界、LangGraph 布线、成本分析、权衡取舍 |
| [`THREAT_MODEL.md`](THREAT_MODEL.md) | Clinical Co-Pilot 的攻击面图谱:组件信任级别、按类别划分的攻击向量、利用难度评级 |
| [`evals/cases/`](evals/cases/) | 结构化 JSON 格式的初始对抗性测试用例——Red Team 扩展的基础库 |
| [`reports/`](reports/) | 由 Documentation 智能体生成的漏洞报告 |
## 技术栈
- **编排:** [LangGraph](https://langchain-ai.github.io/langgraph/) 1.1+
- **LLM 客户端:** `langchain-anthropic`、`langchain-ollama`、`langchain-groq`
- **攻击执行:** `httpx` (异步 HTTP)
- **持久化:** SQLite (无外部依赖)
- **可观测性:** Langfuse
- **API 服务器:** FastAPI + Uvicorn
- **容器:** Docker (Python 3.12-slim)
- **部署:** DigitalOcean,Apache 反向代理
标签:AI红队, AI风险缓解, Chatbot安全, CISA项目, HIPAA合规, IP 地址批量处理, Langfuse, LangGraph, LLM评估, Ollama, OpenEMR, PyRIT, Python, SQLite, 临床副驾驶, 医疗AI, 医疗IT, 医疗信息安全, 受保护健康信息(PHI), 多智能体系统, 大语言模型安全, 对抗性AI, 文档安全, 无后门, 机密管理, 网络安全测试, 自动化渗透测试, 请求拦截, 运行时操纵, 逆向工具