
Pipeline automatisé SBOM-to-VEX utilisant un système d'IA multi-agent sécurisé pour analyser les CVE, raisonner sur l'exploitabilité et générer des documents VEX CycloneDX signés conformément aux directives OWASP GenAI.
Générez automatiquement des documents VEX CycloneDX signés à partir de SBOM en utilisant un pipeline multi-agent IA sécurisé, conçu conformément aux directives du projet OWASP GenAI Security.
Générer un SBOM fait remonter des centaines de CVE. En pratique, plus de 90 % ne sont pas exploitables dans le contexte d'exécution d'un produit spécifique. Sans document VEX (Vulnerability Exploitability eXchange), chaque outil en aval — Dependency‑Track, portes de release, listes de contrôle d’approvisionnement — se noie dans les faux positifs.
Consultez le WIKI pour plus de détails techniques et les résultats des tests.
La génération manuelle de VEX prend du temps et ne passe pas à l’échelle. Un analyste expérimenté peut passer des heures à évaluer un seul composant. Un SBOM de production peut contenir 500 à 2 000 composants.
Ce projet automatise ce pipeline de raisonnement — de manière sécurisée, sans dépendance propriétaire, toutes les données restant sur votre infrastructure.
Motivation réelle : En 2024, la chercheuse en sécurité Johanna Curiel a documenté exactement ce problème en analysant le client Java Kubernetes (article LinkedIn). Le scanner OSV a identifié une CVE à haut risque dans com.diffplug.spotless:spotless-maven-plugin 1.17.0 en quelques secondes. Déterminer qu’elle était not_affected (plugin de construction, jamais exécuté à l’exécution) a nécessité des heures d’analyse manuelle. Ce projet automatise cette étape de raisonnement.
Quatre zones de sécurité. Rien ne franchit une frontière sans validation explicite.
┌─────────────────────────────────────────────────────────────────┐
│ ZONE 1 — Ingestion des entrées (pas de LLM) │
│ Upload SBOM → Validation schéma → Assainissement → Hachage audit SHA-256 │
└────────────────────────────┬────────────────────────────────────┘
│
┌────────────────────────────▼────────────────────────────────────┐
│ ZONE 2 — Middleware OWASP │
│ Garde de prompt (LLM01) · Filtre de sortie (LLM02/05) │
│ Limiteur d’agence (LLM06) · Budget de jetons (LLM10) │
└────────────────────────────┬────────────────────────────────────┘
│
┌────────────────────────────▼────────────────────────────────────┐
│ ZONE 3 — Pipeline multi-agent (AutoGen AgentChat) │
│ │
│ Orchestrateur │
│ ├── Analyste CVE NVD v2 + OSV + EPSS par composant │
│ ├── Raisonneur d'exploit Graphe d’appels · Raisonnement LLM · RAG │
│ └── Rédacteur VEX CycloneDX 1.6 validé par schéma │
│ │
│ Magasin vectoriel (Qdrant) — décisions VEX antérieures signées │
└────────────────────────────┬────────────────────────────────────┘
│
┌────────────────────────────▼────────────────────────────────────┐
│ ZONE 4 — Sortie, signature, audit │
│ Porte Humain dans la boucle → Signature cosign/GPG → Journal d’audit │
└─────────────────────────────────────────────────────────────────┘
Ce projet est conçu en regard de l’OWASP Top 10 for LLM Applications 2025 et de l’OWASP Top 10 for Agentic Applications 2026.
| Risque OWASP | ID | Mesure d’atténuation dans ce projet |
|---|---|---|
| Injection de prompt | LLM01 | Tous les champs SBOM sont assainis avant injection LLM ; liste de blocage des motifs d’injection |
| Divulgation d’informations sensibles | LLM02 | Nettoyeur de données personnelles sur toutes les sorties des agents ; filtre de chemins internes |
| Gestion inappropriée des sorties | LLM05 | Validation du schéma CycloneDX avant signature ; nouvelle tentative en cas d’échec |
| Agence excessive | LLM06 | Outils en lecture seule pendant l’analyse ; porte HITL pour toute décision CVSS ≥ 7.0 |
| Fuite du prompt système | LLM07 | Politiques internes séparées du prompt système |
| Faiblesse vectorielle / d’embedding | LLM08 | Vecteurs stockés signés ; provenance vérifiée avant injection de contexte |
| Consommation non bornée | LLM10 | MaxMessageTermination(20) ; budget de jetons par composant ; délai d’expiration NVD |
L’humain dans la boucle est obligatoire. Une déclaration VEX
not_affectedpour une CVE de haute sévérité est une assertion de niveau juridique. Aucun VEX n’est signé sans approbation d’un relecteur humain. Ceci n’est pas configurable.
| Composant | Outil | Notes |
|---|---|---|
| Orchestration des agents | AutoGen AgentChat v0.4 | Multi-agent, utilisation d’outils, hooks de messages |
| LLM (recommandé) | Qwen2.5-Coder-32B | Meilleur rapport structuré JSON + raisonnement sécurité |
| Serveur LLM | vLLM (prod) / Ollama (dév) | API compatible OpenAI |
| Données CVE | API NVD v2 + OSV.dev + EPSS | Toutes gratuites, aucune clé API requise |
| Magasin vectoriel | Qdrant | Auto-hébergé, décisions VEX antérieures |
| Embeddings | all-MiniLM-L6-v2 (sentence-transformers) | Entièrement local |
| Formats SBOM | CycloneDX 1.4–1.7 (JSON/XML), SPDX 2.3/3.0 | Validé par schéma à l’ingestion |
| Sortie VEX | CycloneDX 1.6 VEX | Validé par schéma avant signature |
| Signature | cosign (Sigstore keyless) | Horodaté, journalisé |
| Journal d’audit | PostgreSQL (append‑only, pgaudit) | Chaque décision d’agent enregistrée |
Tout fonctionne sur site. Aucune donnée ne quitte votre infrastructure.
Matériel (production) :
Matériel (développement / petits SBOM) :
llama3.1:8b via OllamaLogiciel :
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
# Développement — Ollama (CPU/GPU, n’importe quel ordinateur portable)
ollama pull llama3.1
ollama serve
# Production — vLLM (GPU requis)
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 # démarre Qdrant + PostgreSQL
python -m vex_agent analyse \
--sbom chemin/vers/votre-sbom.cdx.json \
--output chemin/vers/sortie.vex.json
Le pipeline :
Copiez .env.example en .env et définissez :
# 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 pour le développement
# Services
QDRANT_URL=http://localhost:6333
AUDIT_DB_URL=postgresql://audit:secret@localhost:5432/audit
# Signature (laisser vide pour utiliser cosign keyless via Sigstore OIDC)
GPG_KEY_ID= # optionnel : utiliser GPG à la place
sbom-vex-agent/
├── vex_agent/
│ ├── ingest.py # Zone 1 : validation et assainissement SBOM
│ ├── guardrails.py # Zone 2 : middleware OWASP (GuardrailedAgent)
│ ├── agents/
│ │ ├── orchestrator.py
│ │ ├── cve_analyst.py
│ │ ├── exploit_reasoner.py
│ │ └── vex_writer.py
│ ├── tools/
│ │ ├── nvd.py # Client API NVD v2
│ │ ├── osv.py # Client OSV.dev
│ │ └── epss.py # Score EPSS
│ ├── vector_store.py # Intégration Qdrant + signature de provenance
│ ├── hitl.py # Porte de relecture Humain dans la boucle
│ └── sign.py # Zone 4 : signature cosign / GPG
├── schemas/
│ ├── cdx-1.6.schema.json
│ └── cdx-1.6-vex.schema.json
├── tests/
├── docker-compose.yml
├── .env.example
└── requirements.txt
L’agent produit des documents VEX CycloneDX 1.6. Exemple de sortie pour un seul composant :
{
"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": "Le plugin s’exécute uniquement à la construction ; non présent dans l’exécution déployée."
}
}
]
}
Valeurs valides pour state : affected · not_affected · fixed · under_investigation
Valeurs valides pour justification (pour not_affected) :
component_not_presentvulnerable_code_not_presentvulnerable_code_not_in_execute_pathvulnerable_code_cannot_be_controlled_by_adversaryinline_mitigations_already_existLes contributions sont les bienvenues. Veuillez ouvrir une issue avant de soumettre une pull request pour des changements importants.
Les problèmes de sécurité doivent être signalés de manière privée — voir SECURITY.md.
MIT — voir LICENSE.
Construit en alignement avec le Projet OWASP GenAI Security. Ce n’est pas un projet officiel OWASP.