
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.0en quelques secondes. Déterminer qu’elle étaitnot_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.
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.
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.
| 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 |
| 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 |