Capitole du Libre 2026

Le CVSS ne voit pas votre déploiement : trier ses CVE avec un LLM et le contexte
14/11/2026 , A302

Description (détaillée)

Je montre deux runs CI sur la même image, avec deux fichiers de contexte différents : l'un casse le build, l'autre passe. Même liste de CVE, même scanner. Et je ne cache pas là où ça casse.

D'abord le mécanisme, parce qu'il est plus honnête qu'il n'en a l'air. Le modèle ne note que quatre facteurs, entre 0 et 9, dans un schéma qui lui interdit structurellement d'écrire un score. La composition, le clamp et la bande de sévérité sont du Go déterministe. Et le fichier de contexte ne touche jamais l'arithmétique : il part en prose dans le prompt. C'est voulu, ça garde le score auditable, et ça pose la vraie question du talk : est-ce que le LLM gagne son coût, ou est-ce qu'une table de correspondance ferait pareil ?

Le modèle se trompe sur certaines classes de CVE, et avec le même aplomb que quand il a raison. Il n'est pas déterministe non plus : le même scan peut ressortir avec des scores différents. Un contexte précis et l'épinglage du seed et de la température stabilisent le tir, mais rien ne dépasse ce qu'un humain a écrit dans un YAML. C'est un système décrit, pas de la vraie reachability.

Le verdict et ses preuves partent dans deux fichiers : le score dans un CycloneDX VEX, l'attestation CDXA à côté. Elle garde l'empreinte de ce qui a produit le score : le modèle, le prompt, les hashs d'entrée. Et comme le verdict est juste un VEX, le même scoring tourne en CI, où une GitHub Action casse le build sur le score OWASP plutôt que sur le CVSS.

Puis le benchmark, parce que si vous mettez un LLM dans la boucle, la question c'est lequel. J'ai comparé douze modèles, huit dans le cloud et quatre en local, contre une baseline sans LLM : une simple constante. La précision est le problème facile, un modèle à 0,48 $ finit à 0,085 point d'un modèle à 4,12 $. C'est sur le contexte que ça se joue, et c'est là qu'un modèle peut décrocher sans prévenir : l'un d'eux a ré-gonflé Log4Shell au lieu de le faire tomber, trois fois de suite. Et les modèles locaux restent, pour l'instant, indistinguables de la constante. Je dis lesquels utiliser et lesquels éviter.

Tout est libre : vens (github.com/venslabs/vens) est sous Apache-2.0, c'est un plugin Trivy officiel et il alimente Dependency-Track. Rien à vendre, la méthode marche sur n'importe quel scanner et n'importe quel LLM correct.


Quel est le public visé ?:

Intermédiaire, mais accessible. DevSecOps, platform/ops, dev qui gèrent des images conteneurs. Une familiarité avec Trivy ou Grype suffit.

Senior software engineer working on vulnerability management and software supply chain security. Maintainer of nerdctl in the containerd community, and contributor to Crossplane. Creator of vens (https://github.com/venslabs/vens), an open-source tool that uses LLMs to score CVEs against their deployment context.