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, 文档安全, 无后门, 机密管理, 网络安全测试, 自动化渗透测试, 请求拦截, 运行时操纵, 逆向工具