
Pipeline automatizado de SBOM a VEX que utiliza un sistema de IA multiagente seguro para analizar CVEs, razonar sobre la explotabilidad y generar documentos VEX CycloneDX firmados en cumplimiento con las directrices OWASP GenAI.
Genere automáticamente documentos CycloneDX VEX firmados a partir de SBOM utilizando un pipeline de IA multiagente seguro, construido de acuerdo con las directrices del proyecto OWASP GenAI Security.
Generar un SBOM revela cientos de CVEs. En la práctica, más del 90% no son explotables en el contexto de ejecución de un producto específico. Sin un documento Vulnerability Exploitability eXchange (VEX), todas las herramientas posteriores (Dependency‑Track, compuertas de lanzamiento, listas de verificación de adquisiciones) se ahogan en falsos positivos.
Lea la WIKI para más detalles técnicos y resultados de pruebas.
La generación manual de VEX consume mucho tiempo y no escala. Un analista experimentado puede pasar horas evaluando un solo componente. Un SBOM de producción puede contener entre 500 y 2000 componentes.
Este proyecto automatiza ese pipeline de razonamiento, de forma segura, sin dependencia del proveedor, con todos los datos en su infraestructura.
En 2024, la investigadora de seguridad Johanna Curiel documentó exactamente este problema al analizar el cliente Java de Kubernetes (). El escáner OSV identificó un CVE de alto riesgo en en segundos. Determinar que era (plugin en tiempo de compilación, nunca se ejecuta en tiempo de ejecución) tomó horas de análisis manual. Este proyecto automatiza ese paso de razonamiento.
com.diffplug.spotless:spotless-maven-plugin 1.17.0not_affectedCuatro zonas de seguridad. Nada cruza un límite sin validación explícita.
┌─────────────────────────────────────────────────────────────────┐
│ ZONE 1 — Input ingestion (no LLM) │
│ SBOM upload → Schema validate → Sanitise → SHA-256 audit hash │
└────────────────────────────┬────────────────────────────────────┘
│
┌────────────────────────────▼────────────────────────────────────┐
│ ZONE 2 — OWASP guardrail middleware │
│ Prompt guard (LLM01) · Output filter (LLM02/05) │
│ Agency limiter (LLM06) · Token budget (LLM10) │
└────────────────────────────┬────────────────────────────────────┘
│
┌────────────────────────────▼────────────────────────────────────┐
│ ZONE 3 — Multi-agent pipeline (AutoGen AgentChat) │
│ │
│ Orchestrator │
│ ├── CVE Analyst NVD v2 + OSV + EPSS per component │
│ ├── Exploit Reasoner Call graph · LLM reasoning · RAG │
│ └── VEX Writer CycloneDX 1.6 schema-validated │
│ │
│ Vector store (Qdrant) — signed past VEX decisions │
└────────────────────────────┬────────────────────────────────────┘
│
┌────────────────────────────▼────────────────────────────────────┐
│ ZONE 4 — Output, signing, audit │
│ Human-in-the-loop gate → cosign/GPG sign → audit log │
└─────────────────────────────────────────────────────────────────┘
Este proyecto está diseñado según OWASP Top 10 for LLM Applications 2025 y OWASP Top 10 for Agentic Applications 2026.
| Riesgo OWASP | ID | Mitigación en este proyecto |
|---|---|---|
| Inyección de prompt | LLM01 | Todos los campos del SBOM se sanitizan antes de inyectarlos al LLM; lista de bloqueo de patrones de inyección |
| Divulgación de información sensible | LLM02 | Depurador de PII en todas las salidas del agente; filtro de rutas internas |
| Manejo incorrecto de salidas | LLM05 | Validación del esquema CycloneDX antes de firmar; reintento en caso de fallo |
| Agencia excesiva | LLM06 | Herramientas de solo lectura durante el análisis; puerta HITL para todos los fallos con CVSS ≥ 7.0 |
| Fuga de prompt del sistema | LLM07 | Políticas internas separadas del prompt del sistema |
| Debilidad en vectores/embeddings | LLM08 | Vectores almacenados firmados; procedencia verificada antes de inyectar contexto |
| Consumo sin límites | LLM10 | MaxMessageTermination(20); presupuesto de tokens por componente; timeout de NVD |
Humano en el bucle es obligatorio. Una declaración VEX
not_affectedpara un CVE de alta gravedad es una afirmación de nivel legal. Ningún VEX se firma sin la aprobación de un revisor humano. Esto no es configurable.
| Componente | Herramienta | Notas |
|---|---|---|
| Orquestación de agentes | AutoGen AgentChat v0.4 | Multiagente, uso de herramientas, hooks de mensajes |
| LLM (recomendado) | Qwen2.5-Coder-32B | Mejor JSON estructurado + razonamiento de seguridad |
| Servidor LLM | vLLM (prod) / Ollama (dev) | API compatible con OpenAI |
| Datos de CVE | API NVD v2 + OSV.dev + EPSS | Todos gratuitos, sin necesidad de clave API |
| Almacén de vectores | Qdrant | Autoalojado, decisiones VEX anteriores |
| Embeddings | all-MiniLM-L6-v2 (sentence-transformers) | Completamente local |
| Formatos SBOM | CycloneDX 1.4–1.7 (JSON/XML), SPDX 2.3/3.0 | Validado por esquema al ingerir |
| Salida VEX | CycloneDX 1.6 VEX | Validado por esquema antes de firmar |
| Firma | cosign (Sigstore keyless) | Con marca de tiempo, registrado en auditoría |
| Registro de auditoría | PostgreSQL (solo anexar, pgaudit) | Cada decisión del agente registrada |
Todo se ejecuta en las instalaciones. Ningún dato sale de su infraestructura.
Hardware (producción):
Hardware (desarrollo / SBOM pequeños):
llama3.1:8b mediante OllamaSoftware:
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
# Desarrollo — Ollama (CPU/GPU, cualquier portátil)
ollama pull llama3.1
ollama serve
# Producción — vLLM (GPU requerida)
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 # inicia Qdrant + PostgreSQL
python -m vex_agent analyse \
--sbom ruta/a/tu-sbom.cdx.json \
--output ruta/a/salida.vex.json
El pipeline:
Copie .env.example a .env y establezca:
# Backend LLM
VLLM_BASE_URL=http://localhost:8000/v1 # o Ollama: http://localhost:11434/v1
LLM_MODEL=Qwen2.5-Coder-32B-Instruct # o llama3.1 para desarrollo
# Servicios
QDRANT_URL=http://localhost:6333
AUDIT_DB_URL=postgresql://audit:secret@localhost:5432/audit
# Firma (dejar en blanco para usar cosign keyless mediante OIDC de Sigstore)
GPG_KEY_ID= # opcional: usar GPG en su lugar
sbom-vex-agent/
├── vex_agent/
│ ├── ingest.py # Zona 1: Validación y sanitización del SBOM
│ ├── guardrails.py # Zona 2: Middleware OWASP (GuardrailedAgent)
│ ├── agents/
│ │ ├── orchestrator.py
│ │ ├── cve_analyst.py
│ │ ├── exploit_reasoner.py
│ │ └── vex_writer.py
│ ├── tools/
│ │ ├── nvd.py # Cliente API NVD v2
│ │ ├── osv.py # Cliente OSV.dev
│ │ └── epss.py # Puntuación EPSS
│ ├── vector_store.py # Integración con Qdrant + firma de procedencia
│ ├── hitl.py # Puerta de revisión humano en el bucle
│ └── sign.py # Zona 4: Firma con cosign / GPG
├── schemas/
│ ├── cdx-1.6.schema.json
│ └── cdx-1.6-vex.schema.json
├── tests/
├── docker-compose.yml
├── .env.example
└── requirements.txt
El agente produce documentos CycloneDX 1.6 VEX. Ejemplo de salida para un solo componente:
{
"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": "Plugin executes only at build time; not present in deployed runtime."
}
}
]
}
Valores válidos para state: affected · not_affected · fixed · under_investigation
Valores válidos para justification (para not_affected):
component_not_presentvulnerable_code_not_presentvulnerable_code_not_in_execute_pathvulnerable_code_cannot_be_controlled_by_adversaryinline_mitigations_already_existLas contribuciones son bienvenidas. Por favor, abra un issue antes de enviar un pull request para cambios significativos.
Los problemas de seguridad deben reportarse de forma privada — ver SECURITY.md.
MIT — ver LICENSE.
Construido en alineación con el OWASP GenAI Security Project. No es un proyecto oficial de OWASP.