Accueil / Blog / Swift 6.4 : SBOM
ENGINEERING_BLOG · 2026.10.26

Swift 6.4 : SBOM et artefacts de CI macOS incohérents ? 2026

Le fichier SBOM est bien créé, mais ses dépendances ne correspondent pas à celles que vous attendez dans l’artefact macOS.

Cette semaine, vérifiez d’abord le graphe utilisé par la génération, puis le produit, le fichier Package.resolved et le moment de création : un SBOM syntaxiquement valide ne prouve pas qu’il décrit l’artefact livré.

Cet article s’adresse aux responsables de Swift Package qui intègrent un SBOM aux contrôles de dépendances, aux ingénieurs CI Apple qui doivent confirmer le périmètre du produit construit et aux responsables sécurité qui évaluent la traçabilité du dossier de livraison.

Mis à jour le 26 octobre 2026 ; vérification fondée sur la publication de Swift 6.4, la proposition officielle SE-0509 et la documentation SwiftPM sur la génération des SBOM. Recontrôlez ces documents si SwiftPM évolue.

SECTION 01 Première étape : définissez précisément ce qui ne correspond pas

Un SBOM généré sans erreur et un SBOM fidèle à un artefact livré sont deux résultats d’acceptation différents. La réussite de la première commande confirme que SwiftPM a produit un document ; elle ne démontre pas, à elle seule, que le document couvre le bon produit, le bon graphe de dépendances ou le même état de résolution que la construction macOS.

Avant d’inspecter les composants, nommez l’objet à expliquer. Est-ce l’application exportée, un exécutable, une bibliothèque ou l’ensemble d’un paquet contenant plusieurs produits ? Notez également le commit, la commande de construction, la configuration utilisée et le chemin exact de l’artefact. Sans ces repères, deux fichiers peuvent sembler se contredire alors qu’ils décrivent simplement des périmètres différents.

Pour votre premier contrôle, conservez ensemble les éléments issus du même travail CI : identité du commit, Package.resolved, commande de construction, journaux utiles, artefact exporté et SBOM. Cette association ne garantit pas l’exactitude du contenu, mais elle permet de vérifier que les documents à comparer viennent bien du même contexte.

Le mot « dépendance » mérite aussi une définition opératoire. Une dépendance déclarée par le paquet, une dépendance présente dans un graphe de résolution et une dépendance mobilisée pour construire un produit ne sont pas nécessairement des listes interchangeables. La documentation SwiftPM et la proposition SE-0509 décrivent les sources de données et les limites à examiner ; utilisez-les pour interpréter le comportement observé, plutôt que de déduire l’exhaustivité du nombre de composants.

SECTION 02 Le graphe de dépendances explique-t-il l’écart ?

Dans un projet Swift, demandez-vous d’abord si le document a été produit à partir du graphe de paquets résolus ou dans le contexte de la construction. Cette distinction peut expliquer pourquoi un SBOM liste des composants qui ne paraissent pas dans le produit construit, ou pourquoi l’inventaire ne reflète pas le périmètre auquel vous vous attendiez. Le détail dépend de la commande et des options réellement prises en charge par la version de SwiftPM exécutée.

La commande swift package generate-sbom est une voie de génération documentée par SwiftPM. Une génération associée à une construction doit être examinée séparément : vérifiez l’aide de la commande swift build dans l’environnement concerné et relevez les options disponibles, au lieu de supposer que deux modes de génération ont le même graphe ou le même périmètre. Les options de génération et les sous-commandes décrites dans SE-0509 servent de référence pour confronter ce que votre pipeline fait réellement à ce que SwiftPM prévoit.

Les conditions de construction et les produits sélectionnés comptent. Une dépendance peut être déclarée dans un paquet sans être pertinente pour l’artefact particulier que vous livrez ; inversement, le graphe exploité lors de la construction peut contenir des informations utiles pour expliquer ce qui a été mobilisé. Ne traitez donc ni le graphe de résolution ni le graphe de construction comme une preuve universelle de l’inventaire livré. La proposition officielle SE-0509 précise le contexte du mécanisme et les limites à prendre en compte.

Un point de contrôle efficace consiste à comparer la commande enregistrée dans les journaux avec l’aide de la version SwiftPM utilisée par le travail CI. Si votre procédure lance une sous-commande autonome après la construction, notez-le explicitement : elle doit être évaluée selon les informations disponibles à cette étape, et non interprétée automatiquement comme le compte rendu exact de la construction précédente.

SECTION 03 Votre SBOM vise-t-il le produit qui part en livraison ?

Un paquet peut exposer plusieurs produits. Dans ce cas, la question utile n’est pas seulement « quel paquet a produit ce document ? », mais aussi « quelle unité de livraison ce document représente-t-il ? ». Un SBOM au niveau du paquet, un document attendu pour un produit précis et un inventaire de l’application exportée ne sont pas des périmètres qu’il faut confondre.

Vérifiez successivement le nom du produit construit, la cible correspondante, la commande de construction et l’artefact placé dans le dossier de livraison. Pour une application distribuée, confrontez ces informations au flux d’archivage et de distribution décrit dans la documentation Apple sur la distribution d’applications. Cette étape aide à distinguer le résultat de construction Swift du produit réellement préparé pour être distribué.

La documentation du gestionnaire de paquets, notamment la page consacrée à la description d’un paquet, peut vous aider à confronter les produits et cibles déclarés aux choix du pipeline. Elle ne remplace cependant pas la vérification des commandes exécutées et des fichiers effectivement exportés.

Pour un projet à plusieurs produits, faites un contrôle distinct par unité distribuée. Une liste générique de composants portant le nom du dépôt ne suffit pas à prouver que chaque produit attendu est représenté. Un document produit pour un seul élément peut, de son côté, être parfaitement cohérent tout en ne décrivant pas les autres éléments du paquet.

Nommez les fichiers pour rendre leur portée lisible par une personne qui ne connaît pas la tâche CI : identifiant du commit, produit visé et type de document sont des repères utiles. Le nommage ne prouve pas le contenu, mais il réduit le risque qu’un SBOM correct soit associé par erreur à un artefact différent.

SECTION 04 Deuxième étape : figez l’état de résolution et le moment de génération

Un SBOM produit après une construction séparée n’est pas automatiquement lié à l’état que cette construction a utilisé. Si l’étape de génération relance la résolution, travaille depuis un autre répertoire ou s’exécute après une modification du dépôt, le document peut décrire un état différent. Le diagnostic doit donc couvrir l’ordre des opérations autant que le format du fichier.

Conservez et examinez Package.resolved avec les autres sorties de CI. La documentation PackageDescription sur les dépendances de paquets explique le rôle de ce fichier dans le contexte des dépendances résolues. Il s’agit d’un indice important à comparer, pas d’une garantie autonome que le SBOM et l’artefact sont identiques : contrôlez aussi le commit, le répertoire de travail et les commandes qui ont produit chacun des fichiers.

Notez ensuite si la génération a lieu dans la même tâche que la construction ou dans une étape indépendante. Si elle est indépendante, identifiez ce qui a pu changer entre les deux : état du dépôt, résolution des dépendances, configuration, sélection du produit ou contexte d’exécution. Les informations relatives au graphe exposé par une commande autonome doivent être interprétées selon sa documentation, sans leur attribuer des données que cette commande ne promet pas de fournir.

Pour établir une comparaison exploitable, relancez la construction et la génération avec le même commit et le même état de résolution, puis confrontez les sorties. Si votre pipeline autorise une mise à jour des dépendances, assurez-vous qu’elle ne se glisse pas entre les opérations évaluées. Les journaux de votre tâche doivent prouver quelle séquence a réellement été exécutée.

À retenir : un nom de branche stable ne remplace pas l’identification du commit. Pour attribuer un SBOM à une livraison, reliez les deux sorties à une même exécution et conservez les éléments qui permettent de refaire le rapprochement.

SECTION 05 Vérification du format : nécessaire, mais pas suffisante

CycloneDX et SPDX sont des formats de SBOM. Un document accepté par un validateur peut néanmoins viser le mauvais produit ou avoir été généré à partir d’un autre état de dépendances. Séparez donc trois contrôles : la validité structurelle du fichier, la pertinence de son périmètre et la traçabilité entre le fichier et l’artefact.

Pour un document CycloneDX, suivez les contrôles adaptés au format décrits dans le guide de validation CycloneDX. Pour un document SPDX, référez-vous aux règles de sérialisation et de validation de la spécification SPDX. Ces vérifications répondent à une question de format ; elles ne certifient pas, à elles seules, que le document corresponde à la sortie particulière de votre pipeline.

Examinez ensuite le contenu : le produit représenté est-il celui que vous livrez ? Les composants et leurs relations sont-ils cohérents avec le périmètre choisi ? Le nom du fichier et les métadonnées utiles permettent-ils de l’associer à la bonne exécution ? En cas d’écart, écrivez quelle proposition est mise en cause — par exemple, « ce composant ne devrait pas apparaître dans le produit X » — puis vérifiez-la dans le contexte de construction et les déclarations du paquet. Un simple comptage des entrées n’est pas un test d’exhaustivité.

Enfin, ne confondez pas archive et preuve cryptographique. La procédure SwiftPM de génération ne doit pas être décrite comme signant automatiquement le SBOM ou comme le liant cryptographiquement au binaire. Si votre politique exige une signature, une attestation ou une chaîne de conservation particulière, définissez ce contrôle séparément et documentez-le comme une étape de votre système de livraison.

SECTION 06 Contrôle à effectuer avant de clôturer l’incident

Utilisez la liste ci-dessous sur une même exécution de CI. Chaque case correspond à une preuve à enregistrer, pas seulement à une hypothèse à cocher.

  • [ ] Identifier le commit exact associé à l’artefact et au SBOM.
  • [ ] Relever la version de Swift et de SwiftPM réellement lancée par l’agent macOS.
  • [ ] Enregistrer la commande complète de génération ainsi que les options présentes dans l’aide de cette version.
  • [ ] Déterminer si la génération est autonome ou associée à la construction, puis vérifier le graphe que la documentation associe à ce mode.
  • [ ] Conserver le Package.resolved utilisé et confirmer qu’il correspond au même contexte de dépôt.
  • [ ] Nommer le produit et la cible attendus, puis les comparer à la commande de construction et au fichier livré.
  • [ ] Pour chaque produit distribué, vérifier séparément le périmètre représenté dans le SBOM.
  • [ ] Valider la sérialisation CycloneDX ou SPDX, puis contrôler les composants et leurs relations.
  • [ ] Archiver ensemble les journaux utiles, le SBOM et l’artefact, avec des noms qui rendent leur association compréhensible.
  • [ ] Refaire le contrôle à partir du même commit et du même état de résolution avant de conclure à un défaut de l’outil.

Si toutes les commandes sont enregistrées, mais que le produit ou l’état de résolution diffère, corrigez d’abord le pipeline et répétez le contrôle. Si le périmètre et la séquence sont identiques mais qu’un composant inattendu demeure, réduisez le cas à un exemple reproductible et confrontez-le à la documentation officielle. Un fichier qui passe le validateur ne justifie pas de clore l’incident tant que l’association à l’artefact reste indémontrée.

SECTION 07 Questions fréquentes sur les SBOM Swift et la CI macOS

Pourquoi l’inventaire du SBOM peut-il différer des dépendances du produit construit ?

Le SBOM et l’artefact peuvent représenter des périmètres différents. Une génération autonome peut partir du graphe de paquets résolus, alors qu’une construction de produit dépend aussi de la sélection des cibles et des conditions de construction. Comparez la commande, le produit et le Package.resolved du même travail CI avant de traiter les composants en trop ou absents comme une anomalie.

La commande autonome et la génération pendant la construction sont-elles équivalentes ?

Ne les considérez pas comme interchangeables sans avoir vérifié les options et le comportement de la version SwiftPM exécutée. La commande autonome doit être évaluée selon les informations qu’elle lit ; la génération associée à une construction peut s’inscrire dans un autre contexte. Consultez l’aide locale et la documentation SE-0509, puis conservez la commande exacte comme élément de preuve.

Comment couvrir les dépendances du produit réellement livré sur macOS ?

Commencez par identifier le produit exporté, puis reliez-le à sa cible, à sa commande de construction et au SBOM produit pendant la même exécution. Gardez le commit et le fichier Package.resolved avec les sorties. Enfin, examinez le contenu et les relations du document : une validation de format confirme sa structure, pas son adéquation au produit distribué.

Que vérifier dans un paquet qui expose plusieurs produits ?

Établissez une vérification par produit livré. Confirmez le nom du produit, la cible choisie, la commande exécutée et l’artefact auquel le document doit se rapporter. Un SBOM global ne prouve pas automatiquement la couverture attendue de chaque produit ; un SBOM limité à un produit ne décrit pas forcément toute l’application. Utilisez des noms de fichiers explicites et archivez chaque association.

SECTION 08 Jalons de validation pour votre équipe

Pour éviter de refaire le diagnostic à chaque livraison, définissez trois jalons dans le pipeline. Au premier, la résolution est identifiée et conservée avec le commit. Au deuxième, la construction consigne le produit et la commande réellement exécutés. Au troisième, le SBOM est généré, validé selon son format, puis archivé avec l’artefact dans le dossier de la même tâche. Ces jalons ne remplacent pas vos contrôles de sécurité ; ils rendent leur périmètre vérifiable.

Le contrôle doit aussi préciser quelles étapes exigent l’environnement Apple. La compilation et les opérations de distribution fondées sur Xcode relèvent d’un environnement macOS adapté ; l’inspection de fichiers déjà produits et certaines validations de sérialisation peuvent être réalisées ailleurs si vos outils le permettent. Ne déplacez pas une étape hors de macOS sans tester que cela préserve les preuves et le comportement attendus de votre pipeline.

Si votre équipe ne dispose pas d’un hôte macOS dédié, comparez honnêtement les solutions. Un agent Linux ne remplace pas les outils Apple nécessaires à une construction macOS ; un Mac local impose de le maintenir disponible et de gérer son environnement ; un agent partagé peut laisser moins de maîtrise sur la continuité de l’environnement. Pour un besoin ponctuel de reproduction ou de validation, la location d’un Mac distant auprès de VPSNIX peut fournir un environnement macOS accessible sans achat de matériel ; vérifiez néanmoins avant de choisir les exigences de votre chaîne Xcode, les modalités d’accès et la conservation des artefacts. Vous pouvez consulter les offres de location Mac et les informations d’assistance pour déterminer si elles conviennent à votre procédure.

Cette option n’est pas nécessairement le meilleur choix pour une charge soutenue nécessitant un environnement dédié et stable, ni si vos tests requièrent un accès physique à des appareils ou interfaces. En revanche, si votre blocage est de reproduire une construction Swift Package et d’en rapprocher le SBOM du produit livré, commencez par figer le commit, le graphe, le produit et le moment de génération ; choisissez ensuite l’environnement macOS capable d’exécuter ce contrôle sans rompre la traçabilité.

SECTION 09 FAQ

Pourquoi le SBOM Swift 6.4 ne reprend-il pas exactement les dépendances visibles dans l’artefact de construction ?

Les deux sorties peuvent représenter des périmètres différents. Un SBOM indépendant peut s’appuyer sur le graphe de paquets résolus, tandis que la construction d’un produit donné mobilise un graphe de construction et des dépendances conditionnelles qui lui sont propres. Comparez la commande et le produit ciblé, puis vérifiez le fichier Package.resolved utilisé par le même travail de CI avant d’interpréter une différence de composants.

Quelle différence faut-il contrôler entre swift package generate-sbom et un SBOM produit pendant swift build ?

Ne déduisez pas leur équivalence du seul fait qu’ils produisent tous deux un fichier. La commande autonome décrit le périmètre qu’elle peut obtenir à partir de l’état du paquet ; une génération associée à la construction peut être reliée à cette opération et à son graphe de construction selon les options disponibles. Consultez l’aide de la version SwiftPM exécutée et consignez la commande exacte.

Comment vérifier que le SBOM couvre les dépendances du produit réellement construit en CI macOS ?

Identifiez d’abord le produit livré, puis rapprochez son nom de la commande de construction, de la configuration et des dépendances attendues. Conservez le commit, le Package.resolved, la sortie de construction et le SBOM dans le même dossier de tâche. Enfin, examinez les relations du document et comparez-les avec les dépendances du produit, plutôt que de valider uniquement la syntaxe du fichier.

Dans un paquet Swift à plusieurs produits, comment éviter de valider le mauvais périmètre de SBOM ?

Établissez une vérification distincte pour chaque produit distribué : nom du produit, cible construite, commande employée et artefact exporté. Un document généré pour l’ensemble du paquet ne prouve pas à lui seul que chaque produit est représenté comme attendu ; inversement, un document limité à un produit ne décrit pas nécessairement toute l’application. Archivez les fichiers avec des noms qui rendent ce périmètre explicite.