自动从 SBOM 生成已签名的 CycloneDX VEX 文档,使用安全的多元人工智能管道,依照 OWASP GenAI 安全项目指南构建。
生成一份 SBOM 会发现数百个 CVE。实际上,超过 90% 在特定产品的运行时环境中不可利用。如果没有漏洞可利用性交换(VEX)文档,每个下游工具 —— Dependency-Track、发布闸门、采购清单 —— 都会被误报淹没。
更多技术细节和测试结果请查阅 WIKI。
手动生成 VEX 耗时且无法规模化。一名熟练分析员可能花费数小时评估单个组件。一份生产环境的 SBOM 可能包含 500 到 2000 个组件。
本项目自动化了这一推理管道——安全、无供应商锁定,所有数据保留在你的基础设施中。
实际动机: 2024 年,安全研究员 Johanna Curiel 在分析 Kubernetes Java 客户端时记录了这一问题(LinkedIn 文章)。OSV 扫描器在几秒内识别出
com.diffplug.spotless:spotless-maven-plugin 1.17.0中存在高风险 CVE。确定其为not_affected(构建时插件,运行时从不执行)却花费了数小时手动分析。本项目自动化了这一推理步骤。
四个安全区域。没有经过显式验证,任何边界不会被跨越。
┌─────────────────────────────────────────────────────────────────┐
│ 区域 1 —— 输入接收(无LLM) │
│ SBOM上传 → 模式验证 → 清理 → SHA-256审计哈希 │
└────────────────────────────┬────────────────────────────────────┘
│
┌────────────────────────────▼────────────────────────────────────┐
│ 区域 2 —— OWASP护栏中间件 │
│ 提示词护栏 (LLM01) · 输出过滤器 (LLM02/05) │
│ 代理限制器 (LLM06) · 令牌预算 (LLM10) │
└────────────────────────────┬────────────────────────────────────┘
│
┌────────────────────────────▼────────────────────────────────────┐
│ 区域 3 —— 多元代理管道 (AutoGen AgentChat) │
│ │
│ 编排器 │
│ ├── CVE分析员 每个组件的 NVD v2 + OSV + EPSS │
│ ├── 可利用性推理器 调用图 · LLM推理 · RAG │
│ └── VEX编写器 CycloneDX 1.6 模式验证 │
│ │
│ 向量存储 (Qdrant) —— 已签名的历史VEX决策 │
└────────────────────────────┬────────────────────────────────────┘
│
┌────────────────────────────▼────────────────────────────────────┐
│ 区域 4 —— 输出、签名、审计 │
│ 人机交互闸门 → cosign/GPG签名 → 审计日志 │
└─────────────────────────────────────────────────────────────────┘
本项目依照 OWASP Top 10 for LLM Applications 2025 和 OWASP Top 10 for Agentic Applications 2026 设计。
人机交互是强制性的。 对高危 CVE 做出
not_affected的 VEX 声明是一种法律级别的断言。没有人类评审员批准,VEX 不会签名。此选项不可配置。
一切运行在本地。没有数据离开你的基础设施。
硬件(生产环境):
硬件(开发 / 小型 SBOM):
llama3.1:8b软件:
git clone https://github.com/your-org/sbom-vex-agent
cd sbom-vex-agent
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
# 开发环境 —— Ollama(CPU/GPU,任何笔记本)
ollama pull llama3.1
ollama serve
# 生产环境 —— vLLM(需要 GPU)
python -m vllm.entrypoints.openai.api_server \
--model Qwen/Qwen2.5-Coder-32B-Instruct \
--gpu-memory-utilization 0.90 \
--host 0.0.0.0 --port 8000
docker compose up -d # 启动 Qdrant + PostgreSQL
python -m vex_agent analyse \
--sbom path/to/your-sbom.cdx.json \
--output path/to/output.vex.json
管道将:
复制 .env.example 为 .env 并设置:
# LLM 后端
VLLM_BASE_URL=http://localhost:8000/v1 # 或 Ollama: http://localhost:11434/v1
LLM_MODEL=Qwen2.5-Coder-32B-Instruct # 开发时使用 llama3.1
# 服务
QDRANT_URL=http://localhost:6333
AUDIT_DB_URL=postgresql://audit:secret@localhost:5432/audit
# 签名(留空则使用 cosign keyless 通过 Sigstore OIDC)
GPG_KEY_ID= # 可选:改用 GPG
sbom-vex-agent/
├── vex_agent/
│ ├── ingest.py # 区域 1:SBOM 验证和清理
│ ├── guardrails.py # 区域 2:OWASP 中间件(GuardrailedAgent)
│ ├── agents/
│ │ ├── orchestrator.py
│ │ ├── cve_analyst.py
│ │ ├── exploit_reasoner.py
│ │ └── vex_writer.py
│ ├── tools/
│ │ ├── nvd.py # NVD v2 API 客户端
│ │ ├── osv.py # OSV.dev 客户端
│ │ └── epss.py # EPSS 评分
│ ├── vector_store.py # Qdrant 集成 + 来源签名
│ ├── hitl.py # 人机交互评审闸门
│ └── sign.py # 区域 4:cosign / GPG 签名
├── schemas/
│ ├── cdx-1.6.schema.json
│ └── cdx-1.6-vex.schema.json
├── tests/
├── docker-compose.yml
├── .env.example
└── requirements.txt
代理产生 CycloneDX 1.6 VEX 文档。单个组件的示例输出:
{
"bomFormat": "CycloneDX",
"specVersion": "1.6",
"version": 1,
"metadata": {
"timestamp": "2026-04-26T10:00:00Z",
"tools": [{ "name": "sbom-vex-agent", "version": "1.0.0" }]
},
"vulnerabilities": [
{
"id": "CVE-2021-37714",
"affects": [{ "ref": "pkg:maven/com.diffplug.spotless/[email protected]" }],
"analysis": {
"state": "not_affected",
"justification": "vulnerable_code_not_in_execute_path",
"detail": "插件仅在构建时执行;部署的运行时中不存在。"
}
}
]
}
有效的 state 值:affected · not_affected · fixed · under_investigation
适用于 not_affected 的有效 justification 值:
component_not_presentvulnerable_code_not_presentvulnerable_code_not_in_execute_pathvulnerable_code_cannot_be_controlled_by_adversaryinline_mitigations_already_exist欢迎贡献。请在提交拉取请求前先提出 issue,并注明重大更改。
安全问题应私下报告 —— 见 SECURITY.md。
MIT —— 见 LICENSE。
依照 OWASP GenAI Security Project 构建。并非官方 OWASP 项目。
| OWASP 风险 | 编号 | 本项目中的缓解措施 |
|---|
| 提示注入 | LLM01 | 所有 SBOM 字段在注入 LLM 前已清理;注入模式黑名单 |
| 敏感信息泄露 | LLM02 | 所有代理输出的 PII 清洗器;内部路径过滤器 |
| 不当输出处理 | LLM05 | 签名前的 CycloneDX 模式验证;失败时重试 |
| 过度代理 | LLM06 | 分析期间只读工具;所有 CVSS ≥ 7.0 的裁定需人机交互闸门 |
| 系统提示泄露 | LLM07 | 内部策略与系统提示分离 |
| 向量/嵌入弱点 | LLM08 | 存储的向量已签名;上下文注入前校验来源 |
| 无限制消耗 | LLM10 | MaxMessageTermination(20);每个组件的令牌预算;NVD 超时 |
| 组件 | 工具 | 备注 |
|---|
| 代理编排 | AutoGen AgentChat v0.4 | 多代理、工具使用、消息钩子 |
| LLM(推荐) | Qwen2.5-Coder-32B | 最佳结构化 JSON + 安全推理 |
| LLM 服务 | vLLM(生产)/ Ollama(开发) | OpenAI 兼容 API |
| CVE 数据 | NVD v2 API + OSV.dev + EPSS | 全部免费,无需 API 密钥 |
| 向量存储 | Qdrant | 自托管,历史 VEX 决策 |
| 嵌入 | all-MiniLM-L6-v2(sentence-transformers) | 完全本地 |
| SBOM 格式 | CycloneDX 1.4–1.7(JSON/XML),SPDX 2.3/3.0 | 接收时模式验证 |
| VEX 输出 | CycloneDX 1.6 VEX | 签名前模式验证 |
| 签名 | cosign(Sigstore keyless) | 时间戳,审计日志记录 |
| 审计日志 | PostgreSQL(仅追加,pgaudit) | 记录每个代理决策 |