
Genera automaticamente documenti VEX CycloneDX firmati a partire dagli SBOM utilizzando una pipeline AI multi-agente sicura, realizzata in conformità con le linee guida dell'OWASP GenAI Security Project.
La generazione di un SBOM fa emergere centinaia di CVE. In pratica, oltre il 90% non è sfruttabile nel contesto di runtime di uno specifico prodotto. Senza un documento Vulnerability Exploitability eXchange (VEX), ogni strumento a valle — Dependency-Track, release gate, checklist di approvvigionamento — viene sommerso dai falsi positivi.
Leggi la WIKI per maggiori dettagli tecnici e risultati dei test.
La generazione manuale dei VEX richiede tempo e non scala. Un analista esperto può impiegare ore per valutare un singolo componente. Un SBOM di produzione può contenere da 500 a 2.000 componenti.
Questo progetto automatizza quel processo di analisi — in modo sicuro, senza vendor lock-in, con tutti i dati che rimangono sulla tua infrastruttura.
Motivazione reale: Nel 2024, la ricercatrice di sicurezza Johanna Curiel ha documentato esattamente questo problema mentre analizzava il Kubernetes Java Client (articolo LinkedIn). Lo scanner OSV ha identificato in pochi secondi una CVE ad alto rischio in
com.diffplug.spotless:spotless-maven-plugin 1.17.0. Determinare che eranot_affected(plugin solo in build, mai eseguito a runtime) ha richiesto ore di analisi manuale. Questo progetto automatizza quel passaggio di analisi.
Quattro zone di sicurezza. Nulla attraversa un confine senza una validazione esplicita.
┌─────────────────────────────────────────────────────────────────┐
│ 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 │
└─────────────────────────────────────────────────────────────────┘
Questo progetto è progettato in base alla OWASP Top 10 per le applicazioni LLM 2025 e alla OWASP Top 10 per le applicazioni agentiche 2026.
L'human-in-the-loop è obbligatorio. Una dichiarazione VEX
not_affectedper una CVE ad alta gravità è un'affermazione con valenza legale. Nessun VEX viene firmato senza l'approvazione del revisore umano. Questo non è configurabile.
Tutto viene eseguito on-premises. Nessun dato lascia la tua infrastruttura.
Hardware (produzione):
Hardware (sviluppo / SBOM di piccole dimensioni):
llama3.1:8b tramite 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
# Development — Ollama (CPU/GPU, any laptop)
ollama pull llama3.1
ollama serve
# Production — vLLM (GPU required)
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 # starts Qdrant + PostgreSQL
python -m vex_agent analyse \
--sbom path/to/your-sbom.cdx.json \
--output path/to/output.vex.json
La pipeline eseguirà le seguenti operazioni:
Copia .env.example in .env e imposta:
# LLM backend
VLLM_BASE_URL=http://localhost:8000/v1 # or Ollama: http://localhost:11434/v1
LLM_MODEL=Qwen2.5-Coder-32B-Instruct # or llama3.1 for dev
# Services
QDRANT_URL=http://localhost:6333
AUDIT_DB_URL=postgresql://audit:secret@localhost:5432/audit
# Signing (leave blank to use cosign keyless via Sigstore OIDC)
GPG_KEY_ID= # optional: use GPG instead
sbom-vex-agent/
├── vex_agent/
│ ├── ingest.py # Zone 1: SBOM validation and sanitisation
│ ├── guardrails.py # Zone 2: OWASP middleware (GuardrailedAgent)
│ ├── agents/
│ │ ├── orchestrator.py
│ │ ├── cve_analyst.py
│ │ ├── exploit_reasoner.py
│ │ └── vex_writer.py
│ ├── tools/
│ │ ├── nvd.py # NVD v2 API client
│ │ ├── osv.py # OSV.dev client
│ │ └── epss.py # EPSS scoring
│ ├── vector_store.py # Qdrant integration + provenance signing
│ ├── hitl.py # Human-in-the-loop review gate
│ └── sign.py # Zone 4: cosign / GPG signing
├── schemas/
│ ├── cdx-1.6.schema.json
│ └── cdx-1.6-vex.schema.json
├── tests/
├── docker-compose.yml
├── .env.example
└── requirements.txt
L'agente produce documenti VEX in formato CycloneDX 1.6. Esempio di output per un singolo 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."
}
}
]
}
Valori state validi: affected · not_affected · fixed · under_investigation
Valori justification validi (per not_affected):
component_not_presentvulnerable_code_not_presentvulnerable_code_not_in_execute_pathvulnerable_code_cannot_be_controlled_by_adversaryinline_mitigations_already_existI contributi sono benvenuti. Apri una issue prima di inviare una pull request per modifiche significative.
I problemi di sicurezza devono essere segnalati privatamente — vedi SECURITY.md.
MIT — vedi LICENSE.
Realizzato in linea con l'OWASP GenAI Security Project. Non è un progetto ufficiale OWASP.
| Rischio OWASP | ID | Mitigazione in questo progetto |
|---|
| Iniezione di prompt | LLM01 | Tutti i campi SBOM sanitizzati prima dell'iniezione nel LLM; blocklist dei pattern di iniezione |
| Divulgazione di informazioni sensibili | LLM02 | PII scrubber su tutti gli output degli agenti; filtro dei percorsi interni |
| Gestione impropria degli output | LLM05 | Validazione dello schema CycloneDX prima della firma; nuovo tentativo in caso di errore |
| Agenzia eccessiva | LLM06 | Strumenti di sola lettura durante l'analisi; gate HITL per tutte le decisioni con CVSS ≥ 7.0 |
| Perdita del prompt di sistema | LLM07 | Policy interne separate dal prompt di sistema |
| Debolezza di vettori/embedding | LLM08 | Vettori memorizzati firmati; provenienza verificata prima dell'iniezione nel contesto |
| Consumo illimitato | LLM10 | MaxMessageTermination(20); budget di token per componente; timeout NVD |
| Componente | Strumento | Note |
|---|
| Orchestrazione degli agenti | AutoGen AgentChat v0.4 | Multi-agente, uso di strumenti, message hook |
| LLM (consigliato) | Qwen2.5-Coder-32B | Miglior JSON strutturato + ragionamento di sicurezza |
| Server LLM | vLLM (prod) / Ollama (dev) | API compatibile con OpenAI |
| Dati CVE | API NVD v2 + OSV.dev + EPSS | Tutti gratuiti, nessuna API key richiesta |
| Archivio vettoriale | Qdrant | Self-hosted, decisioni VEX passate |
| Embedding | all-MiniLM-L6-v2 (sentence-transformers) | Completamente locale |
| Formati SBOM | CycloneDX 1.4–1.7 (JSON/XML), SPDX 2.3/3.0 | Validati rispetto allo schema all'acquisizione |
| Output VEX | CycloneDX 1.6 VEX | Validato rispetto allo schema prima della firma |
| Firma | cosign (Sigstore keyless) | Con timestamp, registrato nell'audit log |
| Registro di audit | PostgreSQL (append-only, pgaudit) | Ogni decisione degli agenti viene registrata |