giselleevita/vendor-red-team-passport
GitHub: giselleevita/vendor-red-team-passport
针对 OpenAI 兼容 LLM API 的自动化红队安全评估工具,通过十类对抗性攻击测试生成可验证的合规报告。
Stars: 0 | Forks: 0
# AI 供应商红队护照
[](https://github.com/giselleevita/vendor-red-team-passport/actions/workflows/ci.yml)
[](https://github.com/giselleevita/vendor-red-team-passport/actions/workflows/deploy.yml)




Vendor Red-Team Passport 自动化执行针对 OpenAI 兼容 LLM API 的结构化对抗性测试,并生成可移植的 **Passport Report**:JSON + HTML 输出,包含攻击覆盖率、评分闸门、经过脱敏的证据,以及带有可选 HMAC 签名的防篡改清单。
专为需要对 LLM API 安全性进行可重现、供应商中立评估的安全团队、采购审核员和合规审计员而设计。
**运行时强制策略:**如需阻止已部署 agent 中的不安全工具调用,请参阅 [agent-security-gate](https://github.com/giselleevita/agent-security-gate) —— 这是此攻击性评估工具的防御性补充。

有关设计原理和评估权衡,请参阅 [docs/CASE_STUDY.md](docs/CASE_STUDY.md)。
## 安全控制
- JWT 身份验证和基于角色的授权保护非健康检查 endpoint。
- 在执行运行和访问护照前会检查租户所有权。
- `POST /runs` 受到速率限制,且请求体上限为 10 MB。
- 审计事件可使用 `VENDOR_RTP_MANIFEST_HMAC_KEY` 进行 HMAC 签名,并使用 `scripts/verify_audit_log.py` 进行验证。
- 启动时会拒绝在启用身份验证的情况下缺失或使用弱 HS256 密钥,并拒绝在没有 DSN 的情况下使用 SQL 作业存储。
仅在执行实时供应商评估时才需要 Featherless API key;离线测试和报告查看无需该 key 也可正常使用。
## 审核员快速入门
如需进行快速技术审核:
1. 运行 `pytest tests/ -v --tb=short --ignore=tests/e2e`,在没有供应商 API key 的情况下验证离线测试套件。
2. 设置 `AUTH_JWT_HS256_SECRET=local-demo-secret`,并使用 `python scripts/make_demo_jwt.py` 生成本地 bearer token。
3. 使用 `uvicorn apps.api.main:app --reload --port 8000` 启动 API。
4. 使用 `Authorization: Bearer ` 调用受保护的路由;有关 curl 示例,请参阅 `docs/demo-authz.md`。
5. 查看 `data/coverage.json` 和 `docs/CASE_STUDY.md` 以了解 OWASP/NIST 交叉映射和设计原理。
本项目旨在作为治理和采购工件:可重复的 LLM 供应商测试、确定性的评分闸门、脱敏的证据,以及无需暴露原始模型输出即可共享的 Passport Report。
## 核心功能
- 针对配置的 OpenAI 兼容 LLM API 运行 **10 种攻击类别 (A1–A10)**
- 根据确定性闸门对每个类别进行评分(通过 / 失败 / 部分)
- 生成 JSON + HTML 格式的 **Passport Report**,无需原始模型输出即可共享
- 提供服务器端渲染的仪表板页面(`/`、`/runs`、`/compare`),用于运行管理和比较
- 支持多模型基准比较 (`/compare`)
- 将结果映射到 OWASP Top 10 for LLMs 和 NIST AI RMF
## 攻击类别
| ID | 类别 | OWASP LLM | NIST | 描述 |
|---|---|---|---|---|
| A1 | Prompt Injection | LLM01 | SI-10 | 直接和间接的指令覆盖尝试 |
| A2 | Insecure Output Handling | LLM02 | SI-15 | 输出中的代码执行、XSS、markdown 注入 |
| A3 | Sensitive Information Disclosure | LLM06 | SC-28 | System prompt 泄露、PII、输出中的凭据 |
| A4 | Model Denial of Service | LLM04 | SC-5 | 资源耗尽、重复循环 |
| A5 | Training Data Poisoning | LLM03 | SI-3 | 成员推理、逐字复现 |
| A6 | Insecure Plugin Design | LLM07 | CM-7 | 第三方插件和工具信任滥用 |
| A7 | Excessive Agency | LLM08 | AC-6 | 未经授权的工具调用、范围蔓延 |
| A8 | Overreliance | LLM09 | RA-3 | 模型反演、fine-tuning 信号提取 |
| A9 | Output Schema Compliance | LLM10 | SI-7 | 结构化输出契约强制执行 |
| A10 | Supply Chain Vulnerabilities | LLM05 | SA-12 | 第三方模型和依赖项风险 |
有关完整的 OWASP × NIST × 测试交叉映射,请参阅 `data/coverage.json`。
## Passport 报告
每次运行会生成:
- `passport.json` — 包含分数、闸门结果、OWASP 交叉映射的机器可读结果
- `passport.html` — 面向利益相关者共享的人类可读报告
- `manifest.json` — 带有可选 HMAC 签名的工件哈希值(配置后)
- 仅包含脱敏证据 — 不持久化任何原始模型输出
生成的报告存储在 `reports/runs//` 下,并通过经过身份验证的运行范围路由提供服务。
## 架构
```
flowchart TD
Analyst[Analyst / CI] --> API[FastAPI API + dashboard]
API --> Profiles[Vendor profiles]
API --> Runs[Run manager]
Runs --> Attacks[Attack runner A1-A10]
Attacks --> Gates[Deterministic scoring gates]
Gates --> Coverage[OWASP / NIST crosswalk]
Gates --> Store[Job store]
Store --> Passport[Tamper-evident Passport Report]
Passport --> JSON[passport.json]
Passport --> HTML[passport.html]
```
## 快速入门
```
git clone https://github.com/giselleevita/vendor-red-team-passport
cd vendor-red-team-passport
python -m venv .venv
source .venv/bin/activate
pip install -e .[dev]
cp .env.example .env
export AUTH_JWT_HS256_SECRET=local-demo-secret
export TOKEN=$(python scripts/make_demo_jwt.py)
uvicorn apps.api.main:app --reload --port 8000
```
检查:
- `curl http://127.0.0.1:8000/health` — 健康检查
- `curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:8000/profiles` — 经过身份验证的配置文件列表
- `curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:8000/runs` — 经过身份验证的运行视图
### Docker
```
docker compose up -d --build
```
## API Endpoints
| 方法 | Endpoint | 描述 |
|---|---|---|
| `GET` | `/health` | 健康检查 |
| `POST` | `/runs` | 启动新的评估运行 |
| `GET` | `/runs/jobs/{job_id}` | 轮询运行状态 |
| `GET` | `/passports/{run_id}` | 获取 Passport Report |
| `GET` | `/profiles` | 列出可用的供应商配置文件 |
| `GET` | `/metrics` | 汇总的评分指标 |
| `GET` | `/compare` | 多模型基准比较 |
## 供应商配置文件
配置文件以 YAML 文件形式存放在 `profiles/` 中。每个配置文件定义:
- 目标 API endpoint 和身份验证
- 攻击类别选择(子集或全部 A1–A10)
- 评分闸门阈值
- OWASP/NIST 交叉映射覆盖
添加新的供应商目标无需修改代码 —— 只需将一个 YAML 文件放入 `profiles/`。
## 运行测试
```
# 所有单元测试(无需 API key — 完全离线)
pytest tests/ -v --tb=short --ignore=tests/e2e
# 仅覆盖 Attack class
pytest tests/api/test_attack_classes.py -v
# 包含覆盖率报告的完整套件
pytest tests/ --cov=apps --cov-report=term-missing
```
## 部署
有关 Railway/Render 环境变量,请参阅 [`SECRETS_SETUP.md`](SECRETS_SETUP.md);有关生产运维,请参阅 [`ops/runbook.md`](ops/runbook.md)。
要通过 Railway 启用自动部署:请将 `RAILWAY_TOKEN` 添加到 GitHub → Settings → Secrets → Actions。
Render 部署配置:`render.yaml`
## 合规交叉映射
| 框架 | 映射 |
|---|---|
| OWASP Top 10 for LLMs | A1–A10 映射到 LLM01–LLM10 |
| NIST AI RMF | 治理、映射、测量、管理 |
| ISO/IEC 42001 | AI 风险评估与文档记录 |
## 路线图
- [x] 10 种攻击类别框架 (A1–A10)
- [x] Passport Report (JSON + HTML)
- [x] FastAPI 后端 + 服务器端渲染的仪表板
- [x] Docker + Railway/Render 部署
- [x] 脱敏证据包(无原始输出)
- [x] 完整的 A1–A10 确定性测试用例 — 30 项测试 + OWASP×NIST 交叉映射 (`data/coverage.json`)
- [ ] `/compare` 上的多模型比较 UI (#3)
- [x] v0.1.0 发布标签 + 脱敏样本 Passport
- [ ] 用于 Passport 结果的 SIEM/webhook 导出
- [ ] CLI 运行器 (`passport run --profile vendor.yaml`)
## 道德与范围
此工具仅供**在授权的实验室环境中进行防御性测试**。
未经明确的书面授权,请勿针对 API 运行。
所有证据均已脱敏 —— 原始模型输出绝不会被持久化。
## 相关项目
| 层级 | 项目 |
|---|---|
| **强制策略**(运行时) | [agent-security-gate](https://github.com/giselleevita/agent-security-gate) — 用于工具调用决策的 OPA 策略网关 |
| **治理**(指导) | [security-compliance-copilot](https://github.com/giselleevita/security-compliance-copilot) — 带有引用的 NIST/CISA RAG 助手 |
| **证据** | [proofrail-evidence-api](https://github.com/giselleevita/proofrail-evidence-api) — 已签名的合规证据包 |
## 许可证
版权所有 (c) 2026 Giselle Evita Koch。 基于
[Apache License 2.0](LICENSE) 授权。
标签:API安全测试, CISA项目, DLL 劫持, 人工智能安全, 合规性, 大语言模型, 红队评估, 自动化攻防, 请求拦截, 逆向工具