Aller au contenu principal
own2pwn
SBOM (Software Bill of Materials) : quatre générateurs, quatre inventaires de la même image

SBOM (Software Bill of Materials) : quatre générateurs, quatre inventaires de la même image

SBOM (Software Bill of Materials) : syft, trivy, osv-scanner et cdxgen sur quatre images Docker. Des totaux proches, mais sur WebGoat 220 composants sur 438 vus par les quatre.

Maxime J14 min de lectureMis à jour le

Vous connaissez vos dépendances ?

On détecte les composants tiers vulnérables de votre surface exposée.

Cartographier ma supply chain

Décembre 2021, un vendredi soir. La CVE Log4Shell vient de tomber, note maximale, exploitable en une ligne, et déjà scannée en masse sur tout l'internet. Dans la war room improvisée, quelqu'un pose la seule question qui compte : "on utilise Log4j où, déjà ?". Silence. Log4j n'est presque jamais une dépendance qu'on installe soi-même : elle arrive en passager clandestin, tirée par un framework, lui-même tiré par un autre. Il a fallu des jours de grep pour établir une liste que personne n'avait sous la main. Cette liste porte un nom : un SBOM.

La réponse habituelle tient en une ligne : générez un SBOM à chaque build et le problème disparaît. Reste à savoir si deux générateurs produisent le même inventaire. On a donc fait tourner syft, trivy, osv-scanner et cdxgen sur quatre images Docker figées, avec la même règle de comptage pour tous. Sur l'image WebGoat, chaque outil trouve entre 305 et 335 composants, des totaux presque identiques. Mais il y a 438 composants distincts au total, et 220 seulement sont vus par les quatre. Le SBOM est le bon outil ; il dépend juste beaucoup plus qu'on ne le croit de celui qui le produit.

Le SBOM, c'est quoi exactement ?

Un SBOM (Software Bill of Materials, ou nomenclature logicielle) est l'inventaire, lisible par une machine, de tous les composants qui entrent dans un logiciel : chaque dépendance, sa version, souvent sa licence et son origine. Le code moderne n'est plus vraiment écrit, il est assemblé. Un projet web anodin déclare une poignée de dépendances directes, qui en tirent chacune d'autres, sur cinq ou six niveaux de profondeur. Là où votre package.json ne liste que ce que vous avez demandé explicitement, le SBOM énumère l'arbre complet, transitives comprises, avec les versions figées qui tournent vraiment.

arbre-vers-sbom
VOUS
package.json
Trois ou quatre dépendances directes, celles que vous avez écrites à la main.
RÉSOLUTION
Arbre transitif
Des centaines de nœuds sur plusieurs niveaux, verrouillés par le lockfile.
SBOM
Nomenclature lisible par machine
Chaque composant, sa version exacte, sa licence, son origine. Une liste interrogeable en une requête.
Vous choisissez une poignée de dépendances directes. Le SBOM aplatit tout l'arbre, y compris les niveaux que vous n'avez jamais choisis.

Le point décisif, c'est "lisible par machine". Un SBOM n'est pas un document Word que quelqu'un tient à jour à la main ; c'est un fichier structuré (JSON ou XML) qu'on génère à partir du build et qu'on interroge par programme. Quand la prochaine faille type Log4Shell tombe, vous filtrez votre SBOM sur le nom du composant, et vous savez en quelques secondes quels produits et quelles versions sont concernés. À une condition, que la suite de cet article montre chiffres à l'appui : que le composant figure bien dans l'inventaire.

Normes SBOM : CycloneDX, SPDX, SWID

Pour qu'un outil génère un SBOM qu'un autre outil sait relire, il faut une grammaire commune. Trois formats standards se partagent le terrain, et le NTIA les reconnaît tous les trois comme lisibles par machine :

  • CycloneDX, porté par l'OWASP, est né côté sécurité applicative. Il est compact, orienté analyse de risque, et gère nativement les dépendances, les vulnérabilités connues, les signatures et même les modèles de machine learning. Sa version courante est la 1.7, désormais standardisée sous ECMA-424 (deuxième édition, décembre 2025). C'est souvent le choix par défaut quand l'objectif est de corréler l'inventaire à des CVE.
  • SPDX, standardisé par la Linux Foundation puis devenu la norme ISO/IEC 5962 (sur la base de SPDX 2.2.1, la version courante étant la 3.0), vient historiquement du monde de la conformité des licences open source. Plus verbeux, très rigoureux sur la traçabilité juridique.
  • SWID (software identification tags), défini par la norme ISO/IEC 19770-2:2015, décrit un logiciel installé par des étiquettes standardisées. Plus orienté gestion de parc que corrélation aux vulnérabilités, il reste moins courant que CycloneDX et SPDX pour un SBOM applicatif.

Le débat entre formats importe moins qu'on ne le croit : les bons outils exportent dans plusieurs d'entre eux, et des convertisseurs font le pont. Voici à quoi ressemble un extrait CycloneDX, réduit à un seul composant pour la lisibilité :

json
{
  "bomFormat": "CycloneDX",
  "specVersion": "1.6",
  "serialNumber": "urn:uuid:3e671687-1c5d-4a2f-9b0e-1f2c8a4d5e6f",
  "version": 1,
  "components": [
    {
      "type": "library",
      "name": "log4j-core",
      "group": "org.apache.logging.log4j",
      "version": "2.14.1",
      "purl": "pkg:maven/org.apache.logging.log4j/[email protected]",
      "licenses": [
        { "license": { "id": "Apache-2.0" } }
      ]
    }
  ]
}

Le champ central, c'est le purl (package URL) : un identifiant normalisé qui décrit sans ambiguïté d'où vient le paquet (écosystème, nom, version). C'est la clé qui permet de confronter votre inventaire aux bases de vulnérabilités : un purl d'un côté, une vulnérabilité publiée sous un identifiant CVE indexée sur le même purl de l'autre. C'est aussi la clé qu'on a prise pour comparer les outils.

La mesure : quatre images, quatre générateurs, une règle

Quatre images publiques, tirées puis figées par digest le 7 octobre 2026 : debian:10, une image de base dont le support LTS a pris fin le 30 juin 2024, et trois applications volontairement vulnérables de l'OWASP, PyGoat v2.0.1 (Python, Django), Juice Shop v20.2.0 (Node.js) et WebGoat 2026 (Java, Spring Boot, sur une base Ubuntu 24.04). Chaque image a été exportée en archive avec docker save puis inventoriée par quatre outils libres, en configuration par défaut, une fois chacun :

bash
syft scan docker-archive:webgoat-2026.tar -o syft-json
trivy image --input webgoat-2026.tar --scanners vuln --list-all-pkgs \
  --skip-db-update --skip-java-db-update --offline-scan
osv-scanner scan image --archive webgoat-2026.tar --offline-vulnerabilities --all-packages
FETCH_LICENSE=false cdxgen -t docker webgoat-2026.tar --no-install-deps

La règle de comptage a été écrite et horodatée avant le premier scan, et elle est la même pour les quatre. Un composant, c'est un triplet tiré du purl : type, nom, version, avec quelques normalisations documentées (minuscules, nom PyPI à la PEP 503, epoch Debian retiré). Le même paquet trouvé à trois chemins compte une fois. Les purl génériques, qui désignent des fichiers ou des dépôts apt plutôt que des paquets, sont mis à part. Et en cas de doute sur l'identité de deux composants, on ne fusionne pas. Grype n'apparaît pas dans ce comptage : il s'appuie sur l'inventaire de syft, même moteur.

Ce que ce banc mesure, et ce qu'il ne peut pas mesurer

Il n'existe pas de vérité terrain pour "les composants présents dans une image" : aucun outil ne sert de juge. Le banc mesure donc des volumes et des recouvrements, jamais un taux d'erreur. Un composant vu par un seul outil n'est ni une erreur de cet outil, ni une exclusivité prouvée. Les images n'ont jamais été démarrées, aucun système tiers n'a été scanné, et aucun modèle de langage n'a été appelé.

Même total, pas le même inventaire

Commençons par le cas le plus propre. Sur debian:10, syft, trivy et osv-scanner listent exactement les mêmes 91 paquets. cdxgen en liste 128 : les mêmes 91, plus 37 que lui seul voit, surtout des paquets source Debian qu'il inscrit à côté des paquets binaires. Ce n'est pas une erreur, c'est une convention ; mais un SBOM qui compte 37 lignes de plus qu'un autre sur une image de 91 paquets surprendra le premier auditeur qui compare deux livraisons. PyGoat suit le même schéma, en plus gros : 144 composants vus par cdxgen seul, dont 137 paquets Debian.

composants
Imagesyfttrivyosv-scannercdxgenUnionVus par les 4
debian:1091919112812891
PyGoat v2.0.1496493496641641492
Juice Shop v20.2.06616636561866813
WebGoat 2026307305307335438220
Banc local own2pwn du 7 octobre 2026 : images figées par digest, outils en configuration par défaut, bases du jour, une exécution par outil et par image. syft 1.54.1, trivy 0.75.0, osv-scanner 2.6.0, cdxgen 12.8.5 (mode image). Composant = clé purl normalisée (type, nom, version), doublons fusionnés, purl génériques (fichiers, dépôts apt) exclus. "Vus par les 4" = clés présentes chez les quatre outils. Source : results.v2.json, clé A_banc_images.composants_par_cible.

WebGoat est l'image où la convergence apparente trompe le plus. Les quatre totaux tiennent dans une fourchette de 30 composants, et pourtant l'union en compte 438. Sur ces 438, 99 ne sont vus que par un outil (45 par cdxgen, 43 par osv-scanner, 8 par syft, 3 par trivy), dont 56 composants Maven et 43 paquets Debian ou Ubuntu. L'étude attribue ces écarts surtout à des conventions (nom retenu pour une archive, version, ce que chaque outil choisit de lister), sans les avoir résolus un par un, et la règle refuse de fusionner ce qu'elle ne peut pas identifier sans doute. Résultat : les quatre SBOM de la même image ne s'accordent que sur la moitié de leur union (50,2 %) quand on les compare ligne à ligne.

webgoat
Composants inventoriés dans l'image WebGoat 2026, par outil
Valeurs en composants
Composants inventoriés dans l'image WebGoat 2026, par outilsyft307trivy305osv-scanner307cdxgen335Union des quatreau moins un outil438Vus par les quatrela seule part commune220
Composants inventoriés dans l'image WebGoat 2026, par outil
CatégorieValeur (composants)Précision
syft307
trivy305
osv-scanner307
cdxgen335
Union des quatre438au moins un outil
Vus par les quatre220la seule part commune
Banc local own2pwn du 7 octobre 2026 : images figées par digest, outils en configuration par défaut, bases du jour, une exécution par outil et par image. syft 1.54.1, trivy 0.75.0, osv-scanner 2.6.0, cdxgen 12.8.5 (mode image). Composant = clé purl normalisée (type, nom, version), doublons fusionnés, purl génériques (fichiers, dépôts apt) exclus. Union = composants distincts trouvés par au moins un outil. Source : results.v2.json, clé A_banc_images.composants_par_cible.webgoat-2026.

La conséquence pratique est simple. Si votre processus compare le SBOM livré par un fournisseur à celui que vous régénérez vous-même, faites-le avec le même outil, ou attendez-vous à des écarts qui ne disent rien de la sécurité du produit. Et choisissez un générateur, puis gardez-le : changer d'outil entre deux versions fabrique un diff d'inventaire qui n'existe pas dans le code.

Le trou npm de cdxgen : une option, pas un défaut

Le chiffre le plus spectaculaire du banc est aussi le plus facile à mal lire. Sur Juice Shop, une application Node.js, cdxgen 12.8.5 en mode image n'a inventorié aucun paquet npm. Les trois autres en trouvent entre 643 et 650. On pourrait en conclure que l'outil ne sait pas lire Node : c'est faux. Relancé sur la même archive avec l'option --deep, il en liste 655. Et en mode répertoire (-t js) sur l'arbre extrait, il en lit 1 167 depuis le package-lock.json, dépendances de développement comprises.

Le trou est propre à npm dans le mode par défaut : sur les mêmes réglages, cdxgen a bien lu les 47 paquets PyPI de PyGoat et 175 composants Maven de WebGoat. L'aide de l'outil présente bien --deep comme utile pour les images OCI, mais rien n'y annonce qu'un écosystème entier manquera sans elle. C'est exactement le genre de détail qui produit un SBOM vide d'un écosystème entier sans le moindre message d'erreur. La leçon vaut pour tous les outils : un inventaire se contrôle contre une source indépendante. Si le lockfile annonce plusieurs centaines de paquets et que le SBOM en compte dix-huit, le pipeline doit échouer, pas archiver.

Le contrôle à ajouter dans la CI

Comptez les composants par type de purl dans le SBOM produit (jq suffit) et comparez au nombre d'entrées du lockfile. Un écosystème à zéro, ou une chute brutale d'un build à l'autre, signale un changement d'option ou de version de l'outil, pas un nettoyage des dépendances.

Du SBOM aux CVE : d'accord sur le code, pas sur l'OS

L'inventaire n'est qu'une moitié du travail ; l'autre consiste à le confronter aux bases de vulnérabilités. Sur les mêmes images, grype, trivy et osv-scanner ont fait ce rapprochement. Sur les dépendances applicatives (PyPI, npm, Maven), ils s'accordent à 92,6 à 96,3 % : la grande majorité des CVE sont vues par les trois. Sur les paquets système anciens, l'accord s'effondre : 4 CVE communes sur 81 pour debian:10, 366 sur 1 359 pour les paquets Debian de PyGoat. Le détail, graphique compris, est dans notre comparatif des alternatives gratuites à Snyk. Pour le SBOM, la conclusion est que la qualité de l'inventaire système compte autant que celle de la base qu'on lui oppose.

Une fois l'inventaire produit, reste à trier sans se noyer dans les faux positifs. On a passé OWASP Dependency-Check et npm audit sur des projets de démonstration et sur WebGoat pour montrer ce que chacun remonte, et ce qu'il faut trier ensuite.

À quoi sert un SBOM, concrètement

Répondre en minutes à "suis-je affecté par la CVE X ?"

C'est l'usage roi, celui qui justifie à lui seul l'effort. Une faille critique est publiée sur un composant très répandu. Sans SBOM, chaque équipe part en fouille manuelle, projet par projet. Avec un SBOM tenu à jour, c'est une requête : quels artefacts embarquent ce purl, dans quelle version, sur quel périmètre. Avec la réserve que le banc impose : la requête ne trouve que ce que le générateur a inscrit.

Vérifier qu'aucun paquet malveillant n'est entré

Le même inventaire sert contre une menace d'une autre nature : le paquet publié pour nuire, qui n'a pas de faille à corriger. Le dépôt public ossf/malicious-packages recense ces paquets au format OSV, sous des identifiants MAL-, et un SBOM permet de croiser ses noms et versions avec cette liste. On a compté ses rapports sur une fenêtre de 24 mois, d'octobre 2024 à septembre 2026 : 212 790, dont 96,9 % pour npm.

Avant d'en faire un titre sur l'explosion des attaques, il faut regarder la date. Trois jours, le 11 et le 12 novembre et le 14 août 2025, concentrent 74,2 % de tous les rapports de la fenêtre. Ceux de novembre décrivent presque tous une seule campagne de spam, liée au protocole tea : des paquets republiés en masse sous des noms aléatoires pour gonfler des récompenses en jetons (140 698 des 140 770 rapports du 10 au 13 novembre). Ce sont de vrais paquets publiés par un acteur, signalés en bloc par Amazon Inspector, qui est crédité sur 92,1 % des rapports de la fenêtre. La médiane mensuelle, pics compris, tourne autour de 1 200 rapports.

malicious-packages
Rapports de paquets malveillants publiés par mois, tous écosystèmes
Valeurs en rapports
Rapports de paquets malveillants publiés par mois, tous écosystèmesoct. 20241 056nov. 2024942déc. 2024897janv. 2025769févr. 2025889mars 20251 339avr. 2025547mai 20251 047juin 2025876juil. 20251 231août 2025import en bloc du 14 août35 365sept. 20255 720oct. 20251 490nov. 2025campagne de spam tea protocol142 256déc. 20251 201janv. 2026619févr. 2026480mars 20261 302avr. 2026816mai 20261 722juin 20261 595juil. 20264 763août 20264 299sept. 20261 569
Rapports de paquets malveillants publiés par mois, tous écosystèmes
CatégorieValeur (rapports)Précision
oct. 20241 056
nov. 2024942
déc. 2024897
janv. 2025769
févr. 2025889
mars 20251 339
avr. 2025547
mai 20251 047
juin 2025876
juil. 20251 231
août 202535 365import en bloc du 14 août
sept. 20255 720
oct. 20251 490
nov. 2025142 256campagne de spam tea protocol
déc. 20251 201
janv. 2026619
févr. 2026480
mars 20261 302
avr. 2026816
mai 20261 722
juin 20261 595
juil. 20264 763
août 20264 299
sept. 20261 569
Fichiers OSV du dépôt ossf/malicious-packages (clone du 7 octobre 2026, commit b23b0e0), hors rapports retirés, mois du champ published (date d'ajout du rapport, pas date de l'attaque), en UTC. 81 rapports sans date exclus. Les pics mesurent l'activité de signalement : 74,2 % des rapports de la fenêtre tombent sur trois jours. Comptage own2pwn, source : results.v2.json, clé E_malicious_packages.par_mois_total.

Ce graphique ne dit donc pas quand les attaques ont lieu : il dit quand quelqu'un les a signalées, et par lots de quelle taille. Ce qui reste solide, c'est la répartition : npm écrase tous les autres registres, et un projet Node tire des centaines de paquets transitifs. C'est le contexte que détaille notre pilier sur les attaques de la supply chain logicielle.

Gérer les licences et prouver la conformité

L'autre moitié de l'histoire est juridique. Chaque dépendance vient avec une licence, et toutes ne se marient pas : une bibliothèque en GPL qui se glisse dans un produit propriétaire distribué, et c'est un problème de conformité. Le SBOM matérialise cet inventaire des licences. Il devient aussi une pièce contractuelle : un client grand compte ou une administration réclame de plus en plus souvent la nomenclature du logiciel qu'il achète.

Comment on génère un SBOM

On le dérive automatiquement, soit depuis les manifestes et lockfiles d'un projet, soit en inspectant un artefact déjà construit. Pour un projet Node, le premier réflexe tient dans une commande native :

bash
# Node : lister l'arbre complet, versions résolues comprises
npm ls --all --json > dependencies.json

# Générer un vrai SBOM CycloneDX depuis le lockfile
npx @cyclonedx/cyclonedx-npm --output-file sbom.cdx.json

L'approche par manifeste ne voit que ce qui est déclaré. Pour inventorier ce qui se trouve vraiment dans une image, paquets système compris, on scanne l'artefact final, par exemple avec syft (de la même famille que le scanner de vulnérabilités grype) :

bash
# SBOM d'une image conteneur, au format CycloneDX
syft my-app:latest -o cyclonedx-json=sbom.cdx.json

# ... ou au format SPDX, selon ce que le destinataire attend
syft my-app:latest -o spdx-json=sbom.spdx.json

# Scanner un répertoire de code source plutôt qu'une image
syft dir:. -o cyclonedx-json

Le bon moment pour générer un SBOM, c'est à chaque build, dans la CI/CD, en même temps que l'artefact qu'il décrit, et avec un outil dont on a figé la version et les options. Les outils de SCA (analyse de composition logicielle) intègrent souvent cette étape : ils produisent le SBOM et enchaînent sur la corrélation aux vulnérabilités connues.

Le cadre réglementaire qui pousse le SBOM

Aux États-Unis, le décret présidentiel Executive Order 14028 de mai 2021, pris dans la foulée de l'affaire SolarWinds, a inscrit la fourniture d'un SBOM parmi les pratiques attendues des éditeurs qui vendent du logiciel au gouvernement fédéral ; une agence peut l'exiger à l'achat.

En Europe, c'est le Cyber Resilience Act. Le règlement inscrit dans ses exigences essentielles de gestion des vulnérabilités l'obligation pour le fabricant d'établir un SBOM dans un format courant et lisible par machine, couvrant au minimum les dépendances de premier niveau du produit. Il n'a pas à être publié, mais doit pouvoir être remis aux autorités de surveillance du marché. On détaille ce texte, ses échéances et ses sanctions dans notre article dédié au Cyber Resilience Act. Le banc ajoute une nuance que le texte ne traite pas : quatre SBOM de la même image, produits par des outils reconnus, ne s'accordent que sur la moitié de leurs composants.

Les limites : un SBOM ne vaut que tenu à jour et corrélé

sbom-vivant
Couche 2
Corrélation aux CVE (la SCA)
Confronté en continu aux bases de vulnérabilités. C'est là que l'inventaire devient une alerte.
Couche 1
Fraîcheur : régénéré à chaque build
Sinon il décrit une version qui n'est plus en production.
Socle
SBOM : l'inventaire brut
La liste des composants et versions à un instant T. Nécessaire, mais inerte tout seul.
Un SBOM seul n'est qu'une liste figée. Sa valeur naît des deux couches qu'on empile par-dessus : la fraîcheur et la corrélation aux vulnérabilités.

La fraîcheur d'abord. Un SBOM décrit un état à un instant précis, et vos dépendances bougent à chaque déploiement. La corrélation ensuite. Un SBOM ne dit pas si un composant est vulnérable, il dit seulement qu'il est là : c'est le rôle de la SCA de le confronter en permanence aux bases publiées.

Ce qu'un SBOM ne voit pas non plus

Même vivant, un SBOM inventorie ce que vous déclarez et compilez. Il ne voit pas le <script> tiers chargé dynamiquement dans le navigateur de vos visiteurs, ni le CDN qui change de propriétaire après votre déploiement. Le drame polyfill.io est, par construction, hors de portée d'un SBOM classique. C'est le genre d'angle mort que seule une vue depuis la surface externe vient combler, et qu'on détaille dans le pilier sur les attaques supply chain.

SBOM, SCA et sécurité de la supply chain

Le SBOM est l'inventaire, la SCA (Software Composition Analysis) en est l'analyse : elle confronte la liste aux bases de CVE, applique une politique (bloquer un build qui embarque une faille critique, alerter sur une licence interdite) et transforme la liste passive en signal actionnable. C'est ce que fait notre module d' analyse de composition logicielle, qui génère le SBOM depuis vos manifestes et enchaîne sur la corrélation aux vulnérabilités connues. Il ne fait pas partie de ce banc.

Cette corrélation continue est aussi la brique de base d'une gestion des vulnérabilités : on ne priorise et on ne remédie que ce qu'on a d'abord inventorié. Reste le pan que le SBOM et la SCA ne couvrent pas, ce qui se charge dans le navigateur de vos visiteurs, hors de tout manifeste. Pour le voir, il faut regarder la surface exposée depuis l'extérieur, en continu : c'est ce que fait notre module de sécurité de la chaîne d'approvisionnement, complémentaire du SBOM plutôt que concurrent.

Les limites de ce banc

  • Pas de vérité terrain : on compare des inventaires entre eux. Personne ne sait combien de composants contient "vraiment" une image, donc aucun outil n'est déclaré meilleur.
  • Configuration par défaut, une exécution : le cas cdxgen montre qu'une option change un écosystème entier. D'autres options auraient pu en changer d'autres.
  • Quatre images, dont trois volontairement vulnérables et une image de base en fin de vie : elles ne représentent pas une application de production.
  • Une règle d'identité stricte : ne pas fusionner en cas de doute gonfle les composants "vus par un seul outil". Une règle plus permissive réduirait l'écart, au prix de fusions incertaines.
  • malicious-packages : la date retenue est celle du rapport, pas de l'attaque ni de la publication du paquet ; les imports en masse dominent les volumes.

À retenir

  • Un SBOM est l'inventaire lisible par machine de tous les composants d'un logiciel. CycloneDX, SPDX et SWID en sont les formats standards, et le purl est la clé de corrélation aux CVE.
  • Le générateur compte : sur WebGoat, 305 à 335 composants par outil, 438 au total, 220 vus par les quatre. Comparez des SBOM produits par le même outil, à version et options figées.
  • Contrôlez l'inventaire contre le lockfile : cdxgen voyait 0 paquet npm sur Juice Shop sans --deep, et 655 avec. Un écosystème à zéro doit faire échouer le build.
  • Sur le code, les scanners s'accordent (92,6 à 96,3 % des CVE applicatives vues par trois outils) ; sur les paquets système anciens, beaucoup moins.
  • Les paquets malveillants se croisent aussi avec le SBOM, mais les volumes publiés mesurent le signalement : 74,2 % des 212 790 rapports de deux ans tombent sur trois jours.
  • Le Cyber Resilience Act l'impose au fabricant (au minimum les dépendances de premier niveau), l'executive order américain l'attend des fournisseurs fédéraux ; il reste aveugle au code tiers chargé dans le navigateur.

Un SBOM propre vous dit de quoi vos produits sont faits. Il ne vous dit pas ce que vos pages chargent réellement chez vos visiteurs, ni quels composants tiers de votre surface exposée sont déjà vulnérables. C'est là que notre module de sécurité de la supply chain prend le relais, en continu et depuis l'extérieur. Envie d'en parler avec un humain qui manipule ces sujets au quotidien ? La page contact vous met en lien direct avec un pentester.

Questions fréquentes sur le SBOM

Qu'est-ce qu'un SBOM ?

Un SBOM (software bill of materials, ou nomenclature logicielle) est l'inventaire, lisible par une machine, de tous les composants qui entrent dans un logiciel : chaque dépendance, sa version, souvent sa licence et son origine, dépendances transitives comprises. Sa valeur principale est de répondre en minutes, et non en semaines, à la question : suis-je affecté par telle faille, et où ?

Quels sont les formats de SBOM ?

Trois formats standards font référence. CycloneDX, porté par l'OWASP et standardisé en ECMA-424, est orienté sécurité et corrélation aux vulnérabilités. SPDX, issu de la Linux Foundation et devenu la norme ISO/IEC 5962, vient de la conformité des licences. SWID, défini par ISO/IEC 19770-2, est un format d'identification de logiciels reconnu par le NTIA aux côtés des deux autres. Les bons outils exportent dans plusieurs de ces formats et des convertisseurs font le pont.

Comment générer un SBOM ?

On ne rédige jamais un SBOM à la main, on le dérive automatiquement. Pour un projet, on l'extrait des manifestes et lockfiles, par exemple avec cyclonedx-npm pour Node. Pour un artefact déjà construit, image conteneur ou binaire, on le scanne avec un outil comme syft, trivy ou cdxgen, qui exportent en CycloneDX ou en SPDX. Le bon moment est à chaque build, dans la CI/CD, pour que le SBOM décrive exactement ce qui part en production.

Deux outils de SBOM donnent-ils le même inventaire ?

Pas forcément, même quand leurs totaux se ressemblent. Sur un banc own2pwn du 7 octobre 2026, syft, trivy, osv-scanner et cdxgen ont inventorié l'image WebGoat 2026 : 305 à 335 composants chacun, mais 438 composants distincts au total et 220 seulement vus par les quatre. Sur une image Debian 10, les trois premiers listent exactement les mêmes 91 paquets, et cdxgen en ajoute 37, surtout des paquets source. Ces écarts semblent tenir surtout aux conventions de nommage et à ce que chaque outil choisit de lister, sans avoir été résolus un par un.

Pourquoi mon SBOM ne contient-il aucune dépendance npm ?

Vérifiez les options de l'outil avant de conclure. Sur l'image OWASP Juice Shop, cdxgen 12.8.5 en mode image n'a inventorié aucun paquet npm sans l'option --deep, et 655 avec, quand syft en trouve 648 et trivy 650. Dans le même mode par défaut, il lisait pourtant les paquets PyPI d'une autre image et les archives Maven d'une troisième. Un écosystème entier à zéro est le signal à surveiller : comparez toujours le nombre de composants à celui du lockfile.

Quelle différence entre un SBOM et la SCA ?

Le SBOM est l'inventaire, la SCA (software composition analysis) est l'analyse de cet inventaire. La SCA prend le SBOM, le confronte en continu aux bases de vulnérabilités connues, applique une politique, par exemple bloquer un build qui embarque une faille critique, et transforme la liste passive en alerte actionnable. Sans SBOM, la SCA n'a rien à analyser ; sans SCA, le SBOM ne produit aucune alerte.

Le SBOM est-il obligatoire ?

De plus en plus. Aux États-Unis, l'executive order 14028 de 2021 a inscrit la fourniture d'un SBOM parmi les pratiques attendues des éditeurs qui vendent au gouvernement fédéral, et une agence peut l'exiger à l'achat. En Europe, le Cyber Resilience Act impose au fabricant, dans ses exigences essentielles, d'établir un SBOM dans un format courant et lisible par machine, couvrant au minimum les dépendances de premier niveau du produit. Il n'a pas à être publié, mais doit pouvoir être fourni aux autorités de surveillance du marché.

À quelle fréquence faut-il générer un SBOM ?

À chaque build. Un SBOM décrit un état à un instant précis, or vos dépendances bougent à chaque mise à jour et chaque déploiement. Généré par le pipeline et archivé aux côtés de l'artefact qu'il décrit, il devient une photographie fidèle et datée de chaque version livrée, exploitable le jour d'un incident.

Veille sécurité

La suite, une fois par mois

Ce qui bouge vraiment sur la surface d'attaque externe, NIS2 et la sécurité applicative, écrit par le pentester qui signe ces articles. Un envoi par mois, désinscription en un clic.

Votre adresse ne sert qu'à cet envoi. Voir la politique de confidentialité.