
Pipeline automatizada de SBOM para VEX usando um sistema seguro de IA multiagente para analisar CVEs, raciocinar sobre explorabilidade e gerar documentos VEX CycloneDX assinados em conformidade com as diretrizes OWASP GenAI.
Gere automaticamente documentos VEX CycloneDX assinados a partir de SBOMs utilizando um pipeline seguro de múltiplos agentes de IA, construído em conformidade com as diretrizes do Projeto OWASP GenAI Security.
Gerar um SBOM revela centenas de CVEs. Na prática, mais de 90% não são exploráveis no contexto de execução de um produto específico. Sem um documento Vulnerability Exploitability eXchange (VEX), todas as ferramentas a jusante — Dependency-Track, portões de release, listas de verificação de procurement — são inundadas por falsos positivos.
Leia a WIKI para mais detalhes técnicos e resultados de testes
A geração manual de VEX consome tempo e não escala. Um analista qualificado pode gastar horas avaliando um único componente. Um SBOM de produção pode conter de 500 a 2.000 componentes.
Este projeto automatiza esse pipeline de raciocínio — de forma segura, sem dependência de fornecedor, com todos os dados permanecendo na sua infraestrutura.
Motivação real: Em 2024, a pesquisadora de segurança Johanna Curiel documentou exatamente este problema ao analisar o Kubernetes Java Client (artigo no LinkedIn). O scanner OSV identificou em segundos um CVE de alto risco em
com.diffplug.spotless:spotless-maven-plugin 1.17.0. Determinar que eranot_affected(plugin de compilação, nunca executado em tempo de execução) exigiu horas de análise manual. Este projeto automatiza essa etapa de raciocínio.
Quatro zonas de segurança. Nada cruza um limite sem validação explícita.
┌─────────────────────────────────────────────────────────────────┐
│ ZONE 1 — Entrada de dados (sem LLM) │
│ Upload do SBOM → Validação de esquema → Sanitização → Hash SHA-256 │
└────────────────────────────┬────────────────────────────────────┘
│
┌────────────────────────────▼────────────────────────────────────┐
│ ZONE 2 — Middleware de guardrails OWASP │
│ Guardião de prompt (LLM01) · Filtro de saída (LLM02/05) │
│ Limitador de agência (LLM06) · Orçamento de tokens (LLM10) │
└────────────────────────────┬────────────────────────────────────┘
│
┌────────────────────────────▼────────────────────────────────────┐
│ ZONE 3 — Pipeline multiagente (AutoGen AgentChat) │
│ │
│ Orquestrador │
│ ├── Analista de CVEs NVD v2 + OSV + EPSS por componente │
│ ├── Raciocinador de Exploração Grafo de chamadas · Raciocínio LLM · RAG │
│ └── Escritor VEX Validado pelo esquema CycloneDX 1.6 │
│ │
│ Armazenamento vetorial (Qdrant) — decisões VEX assinadas anteriores │
└────────────────────────────┬────────────────────────────────────┘
│
┌────────────────────────────▼────────────────────────────────────┐
│ ZONE 4 — Saída, assinatura, auditoria │
│ Portão humano-no-circuito → assinatura cosign/GPG → registro de auditoria │
└─────────────────────────────────────────────────────────────────┘
Este projeto foi projetado de acordo com o OWASP Top 10 for LLM Applications 2025 e o OWASP Top 10 for Agentic Applications 2026.
Humano-no-circuito é obrigatório. Uma declaração VEX
not_affectedpara um CVE de alta severidade é uma afirmação de nível legal. Nenhum VEX é assinado sem aprovação do revisor humano. Isto não é configurável.
Tudo executa localmente. Nenhum dado sai da sua infraestrutura.
Hardware (produção):
Hardware (desenvolvimento / SBOMs pequenos):
llama3.1:8b via 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
# Desenvolvimento — Ollama (CPU/GPU, qualquer laptop)
ollama pull llama3.1
ollama serve
# Produção — vLLM (GPU necessária)
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 path/to/your-sbom.cdx.json \
--output path/to/output.vex.json
O pipeline irá:
Copie .env.example para .env e defina:
# Backend LLM
VLLM_BASE_URL=http://localhost:8000/v1 # ou Ollama: http://localhost:11434/v1
LLM_MODEL=Qwen2.5-Coder-32B-Instruct # ou llama3.1 para desenvolvimento
# Serviços
QDRANT_URL=http://localhost:6333
AUDIT_DB_URL=postgresql://audit:secret@localhost:5432/audit
# Assinatura (deixe em branco para usar cosign keyless via Sigstore OIDC)
GPG_KEY_ID= # opcional: usar GPG
sbom-vex-agent/
├── vex_agent/
│ ├── ingest.py # Zona 1: Validação e sanitização de SBOM
│ ├── guardrails.py # Zona 2: Middleware OWASP (GuardrailedAgent)
│ ├── agents/
│ │ ├── orchestrator.py
│ │ ├── cve_analyst.py
│ │ ├── exploit_reasoner.py
│ │ └── vex_writer.py
│ ├── tools/
│ │ ├── nvd.py # Cliente da API NVD v2
│ │ ├── osv.py # Cliente OSV.dev
│ │ └── epss.py # Pontuação EPSS
│ ├── vector_store.py # Integração com Qdrant + assinatura de proveniência
│ ├── hitl.py # Portão de revisão humano-no-circuito
│ └── sign.py # Zona 4: Assinatura cosign / GPG
├── schemas/
│ ├── cdx-1.6.schema.json
│ └── cdx-1.6-vex.schema.json
├── tests/
├── docker-compose.yml
├── .env.example
└── requirements.txt
O agente produz documentos VEX CycloneDX 1.6. Exemplo de saída para um único 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 executa apenas em tempo de compilação; não está presente no runtime implantado."
}
}
]
}
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_existContribuições são bem-vindas. Por favor, abra uma issue antes de enviar um pull request para alterações significativas.
Problemas de segurança devem ser reportados de forma privada — consulte SECURITY.md.
MIT — veja LICENSE.
Construído em conformidade com o OWASP GenAI Security Project. Não é um projeto oficial da OWASP.
| Risco OWASP | ID | Mitigação neste projeto |
|---|
| Injeção de Prompt | LLM01 | Todos os campos do SBOM sanitizados antes da injeção no LLM; lista de bloqueio de padrões de injeção |
| Divulgação de Informações Sensíveis | LLM02 | Removedor de PII em todas as saídas dos agentes; filtro de caminhos internos |
| Manipulação Incorreta da Saída | LLM05 | Validação do esquema CycloneDX antes da assinatura; repetição em caso de falha |
| Agência Excessiva | LLM06 | Ferramentas somente leitura durante a análise; portão humano-no-circuito para todas as decisões com CVSS ≥ 7,0 |
| Vazamento de Prompt de Sistema | LLM07 | Políticas internas separadas do prompt de sistema |
| Fraqueza de Vetores / Embeddings | LLM08 | Vetores armazenados assinados; proveniência verificada antes da injeção de contexto |
| Consumo Ilimitado | LLM10 | MaxMessageTermination(20); orçamento de tokens por componente; timeout da NVD |
| Componente | Ferramenta | Notas |
|---|
| Orquestração de agentes | AutoGen AgentChat v0.4 | Multiagente, uso de ferramentas, hooks de mensagens |
| LLM (recomendado) | Qwen2.5-Coder-32B | Melhor JSON estruturado + raciocínio de segurança |
| Servidor LLM | vLLM (prod) / Ollama (dev) | API compatível com OpenAI |
| Dados de CVE | API NVD v2 + OSV.dev + EPSS | Todos gratuitos, sem necessidade de chave de API |
| Armazenamento vetorial | Qdrant | Auto-hospedado, decisões VEX anteriores |
| Embeddings | all-MiniLM-L6-v2 (sentence-transformers) | Totalmente local |
| Formatos de SBOM | CycloneDX 1.4–1.7 (JSON/XML), SPDX 2.3/3.0 | Validados pelo esquema na ingestão |
| Saída VEX | CycloneDX 1.6 VEX | Validado pelo esquema antes da assinatura |
| Assinatura | cosign (Sigstore keyless) | Com timestamp, registrado em auditoria |
| Registro de auditoria | PostgreSQL (append-only, pgaudit) | Cada decisão do agente registrada |