<?xml version="1.0" encoding="utf-8"?>
<rfcdesc title="An Architecture for Trustworthy and Transparent Digital Supply Chains" num="9943" status="standards" wg="scitt">
  <authors><author>H. Birkholz (Fraunhofer SIT)</author><author>A. Delignat-Lavaud</author><author>C. Fournet (Microsoft Research)</author><author>Y. Deshpande (ARM)</author><author>S. Lasker</author></authors>
  <date>2026-07-01</date>
  <rfcdate><month>June</month><year>2026</year></rfcdate>
<content>
  <p>Des <wikipedia xml:lang="en" name="Supply chain attack">attaques sur la chaine d'approvisionnement du
  logiciel</wikipedia>, il y en a tout le temps. L'attaquant arrive à
  glisser du code malveillant dans un logiciel, en amont de son
  installation par la victime et, quand celle-ci fait tourner le
  logiciel, le code de l'attaquant est exécuté et paf. Il n'y a pas de
  solution miracle à ce problème mais on peut au moins essayer de
  fournir une traçabilité forte des logiciels, qui permet d'être sûr
  de ce qu'on fait tourner sur ses machines, et, dans le cas d'une
  enquête postérieure, de mieux comprendre ce qui s'est passé. Ce
  <wikipedia name="Request for comments">RFC</wikipedia> décrit <link url="https://scitt.io/">une
  architecture</link>, très inspirée du <foreign><wikipedia xml:lang="en" name="Certificate Transparency">certificate
  transparency</wikipedia></foreign> du <rfc num="9162"
  local="true"/>.</p>
  <p>Vous voulez des exemples d'<wikipedia xml:lang="en" name="Supply chain attack">attaques contre la chaine
  d'approvisionnement du logiciel</wikipedia> ? Deux cas récents sont
  <link
  url="https://www.aquasec.com/blog/trivy-supply-chain-attack-what-you-need-to-know/">la
  faille Trivy/Aqua Security</link>, annoncée le 1 avril de cette
  année mais qui n'est pas une blague (tout juste de l'ironie car le
  logiciel Trivy servait à détecter les problèmes de sécurité…) Cette
  attaque a notamment permis de l'<link
  url="https://cert.europa.eu/blog/european-commission-cloud-breach-trivy-supply-chain">accès
  aux données de la Commission Européenne</link>. Et il y a aussi,
  encore plus récente, l'<link
  url="https://www.truesec.com/hub/blog/malicious-pypi-package-litellm-supply-chain-compromise">attaque
  contre le paquetage Python litellm</link>. Mais le cas le plus
  fameux, quoique un peu moins récent, est celui du <wikipedia
  name="Attaque de XZ Utils par porte dérobée">détournement de la
  bibliothèque XZ</wikipedia>. (Olivier Poncet en a fait <link
  url="https://www.emaxilde.net/posts/2024/10/11/anatomie-d-une-faille.html">une
  conférence</link><!-- Aussi
  https://www.youtube.com/watch?v=XX4McCXRV44 -->.)
  </p>
  <p>Les attaquants peuvent frapper à de nombreux endroits différents
  dans la chaine d'approvisionnement d'un logiciel. Cela peut être en
  modifiant une <wikipedia name="Bibliothèque logicielle">bibliothèque</wikipedia> utilisée par le
  logiciel, en modifiant directement le code source, en modifiant
  l'environnement de compilation (de manière à produire un code
  exécutable malveillant à partir d'un code source intact), en
  remplaçant le code exécutable dans un <wikipedia name="Magasin d'applications">magasin
  d'applications</wikipedia>, etc.  La figure 1 dans la section 2.1 du
  RFC donne une liste complète. Le choix va dépendre des capacités de
  l'attaquant, de ses choix de discrétion, et des solutions de
  sécurité déployées.</p>
  <p>Je l'ai dit au début, il n'y a pas de solution parfaite au
  problème, qui est complexe. Dans le cas de XZ, le mainteneur a eu
  tort de faire confiance à un inconnu mais, si on arrêtait d'accepter
  des volontaires inconnus, tout le <wikipedia name="Logiciel
  libre">logiciel libre</wikipedia> s'effondrerait. Et le logiciel
  privateur a <wikipedia xml:lang="en" name="SolarWinds"
  anchor="2019–2020_supply_chain_attacks">d'autres
  failles</wikipedia><!-- Ou bien, sur SolarWinds,
  https://www.fortinet.com/resources/cyberglossary/solarwinds-cyber-attack
  https://www.bbc.com/news/technology-55321643 -->, comme l'opacité, qui empêche de savoir quels
  sont les composants logiciels intégrés.</p>
  <p>Que propose le <link
  url="https://datatracker.ietf.org/wg/scitt/about/">groupe de travail
  SCITT</link>, auteur de ce <wikipedia name="Request for
  comments">RFC</wikipedia> ? L'approche choisie est celle de <link url="https://scitt.io/">la
  transparence et de la traçabilité</link>. Il faut qu'on puisse vérifier de
  quels logiciels on dépend. La principale source d'inspiration est le
  <foreign>Certificate Transparency</foreign> du <rfc num="9162"
  local="true"/> et l'<link url="https://scitt.io/">architecture SCITT</link> peut être vue comme une
  généralisation de <foreign>Certificate Transparency</foreign> au
  logiciel. Il repose sur une structure de données ordonnée, et qui
  garantit que seul l'ajout de données est possible, et que tout dans
  cette structure de données est signé. (Si vous criez « chaine de
  blocs » ici, vous avez tort : une <wikipedia name="Chaine de blocs">chaine de
  blocs</wikipedia> fournit en effet ce service mais elle n'est pas
  nécessaire, d'autres mécanismes existent depuis longtemps, tels que
  ceux utilisés par le <rfc num="9162" local="true"/>.) D'autre part,
  il est important de se souvenir que notre RFC ne présente qu'une
  architecture, pas un protocole complet. Les programmeurs et
  programmeuses ne peuvent donc pas se mettre au travail tout de
  suite. L'architecture SCITT est conçue pour les chaines
  d'approvisionnement de logiciel mais peut a priori être étendue plus
  tard pour d'autres usages.</p>
  <p>Le mécanisme de base consiste en des données en
  <wikipedia>CBOR</wikipedia> (<rfc num="8949" local="true"/>), dont
  la structure est spécifiée en CDLL (<rfc num="8610" local="true"/>),
  <wikipedia name="Signature numérique">signées</wikipedia> avec
  <wikipedia xml:lang="en" name="CBOR" anchor="Object_signing_and_encryption">COSE</wikipedia> (<rfc num="9052" local="false"/>) et
  récupérable via des <wikipedia name="Arbre de Merkle">arbres de Merkle</wikipedia> (<rfc
  num="9942" local="false"/>). Grâce à cela, celui ou celle qui veut
  vérifier des informations sur un logiciel peut les récupérer
  facilement et efficacement, puis les vérifier (là encore, comme avec
  <foreign>Certificate Transparency</foreign>). C'est par exemple ce
  que le <wikipedia name="National Institute of Standards and
  Technology">NIST</wikipedia> appelle <link
  url="https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-204C.pdf">DevSecOps</link>.</p>
  <p>La section 2.2 du RFC fournit trois cas d'usages de cette
  technologie. L'un d'eux concerne l'assemblage du logiciel pour un
  véhicule. (Dans le monde réel, les gens qui assemblent le logiciel
  pour une voiture ne se soucient guère de sécurité ; comme il y a
  zéro conséquence négative pour eux en cas de bogue, ou même de
  faille de sécurité, ils utilisent <link
  url="https://arxiv.org/abs/2208.14367">des versions
  antédiluviennes</link> de <link
  url="https://www.sciencedirect.com/science/article/abs/pii/S0167404822004606">logiciels
  non testés</link><!-- Ou encore
  https://link.springer.com/article/10.1007/s11416-024-00522-4
  https://arxiv.org/abs/2208.14367
  https://link.springer.com/article/10.1007/s43926-023-00045-2 -->.) La chaine de dépendance est longue car une
  voiture est faite de plusieurs composants, chacun apportant du
  logiciel qui, à son tour, dépend de diverses bibliothèques. SCITT
  permettrait au moins d'avoir des idées claires sur les composants
  logiciels utilisés, chacun ayant fait l'objet d'un ajout dans la
  structure de données de traçabilité.</p>
  <p>Bon, maintenant, si on veut être un peu plus précis et comprendre
  ce qu'est l'architecture SCITT, par quoi on commence ? Par le
  vocabulaire, peut-être. Découvrons-le dans la section 3 du RFC :
  <enum>
    <!-- Pas encore trouvé son utilité <item>Affirmation (<foreign>claim</foreign>) : issu du <rfc
	 num="8392" local="true"/>, ce terme désigne -->
    <item>Déclaration (<foreign>statement</foreign>) : une information
    portant sur un fait (par exemple « la version actuelle est la
    3.14 » ou bien « ce logiciel dépend de libfoobar et de
    grutzbaum-plus »). Les logiciels peuvent être identifiés par un
    grand nombre d'identificateurs, notre RFC cite entre autres CoSWID
    (<rfc num="9393" local="false"/>), <link
    url="https://in-toto.io/">in-toto</link>,
    <wikipedia>SPDX</wikipedia>, <link
    url="https://csrc.nist.gov/Projects/Software-Identification-SWID/guidelines">SWID</link>,
    etc.<!-- Le truc de Software Heritage, SWHID, est un condensat donc pas
    utilisable pour SCITT ? https://www.swhid.org/ https://www.iso.org/standard/89985.html --></item>
    <item>Enveloppe (<foreign>envelope</foreign>) : les méta-données
    comme l'identité de l'émetteur.</item>
    <item>Émetteur (<foreign>issuer</foreign>) : l'entité qui déclare quelque
    chose, et qui a une <wikipedia name="Cryptographie
    asymétrique">clé privée</wikipedia> pour <wikipedia
    name="Signature numérique">signer</wikipedia> cette déclaration.</item>
    <item>Utilisateur (<foreign>relying party</foreign>) : l'entité
    qui va utiliser les déclarations.</item>
    <item>Équivoque (<foreign>equivocation</foreign>, quoiqu'il me
    semble que le terme soit moins fort en français) : déclarations
    contradictoires (ce qui est clairement mauvais).</item>
    <item>Reçu (<foreign>receipt</foreign>) : preuve comme quoi une
    déclaration signée a bien été incluse dans la structure de
    données. Si on les distribue sur l'Internet, le <wikipedia name="Type de médias">type de
    média</wikipedia> à utiliser est <computer><link
    url="https://www.iana.org/assignments/media-types/application/scitt-receipt+cose">application/scitt-receipt+cose</link></computer></item>
    <item>Déclaration signée (<foreign>signed statement</foreign>) :
    ce sont elles qui sont encodées en <wikipedia xml:lang="en" name="CBOR" anchor="Object_signing_and_encryption">COSE</wikipedia>
    (<rfc num="9052" local="false"/>). Si on les distribue sur
    l'Internet, le <wikipedia name="Type de médias">type de média</wikipedia> à utiliser est
    <computer><link url="https://www.iana.org/assignments/media-types/application/scitt-statement+cose">application/scitt-statement+cose</link></computer>.</item>
    <item>Structure de données vérifiable (<foreign>verifiable data
    structure</foreign>) : là ou on met les déclarations. Cette
    structure de données doit être <wikipedia xml:lang="en"
    name="Append-only">à ajout seul</wikipedia> (et, je me répète, une
    <wikipedia name="Chaine de blocs">chaine de blocs</wikipedia> a cette propriété mais les
    chaines de blocs ne sont nullement indispensables pour cela), 
    doit empêcher l'équivoque (cf. section 5.1.3) et doit permettre
    l'examen complet (peut-être après autorisation) pour vérifier sa
    cohérence. Le <rfc num="9942" local="false"/> donne des détails techniques.</item>
  </enum>
  </p>
  <p>Armé de ces termes, nous pouvons décrire l'architecture SCITT
  (mais regardez aussi la figure 2 du RFC) :
  <enum>
    <item>Des émetteurs produisent des déclarations signées et les
    envoient à des services de transparence,</item>
    <item>ces services de transparence authentifient l'émetteur, vérifient les signatures,
    vérifient la conformité des déclarations à leur politique
    (cf. section 5.2.1), mettent
    la déclaration dans la structure de données vérifiable et
    produisent un reçu (suivant le <rfc num="9942" local="false"/>),</item>
    <item>des utilisateurs vont accéder à ces informations pour
    vérifier les informations (« est-ce que je dépend ou pas de
    libfoobar ? », sachant que la dépendance peut être
    <wikipedia name="Relation transitive">transitive</wikipedia>), ou bien pour vérifier la
    cohérence du service de transparence, par exemple lors d'un audit
    (c'est une propriété importante d'un service de transparence, on
    doit pouvoir vérifier son intégrité).</item>
  </enum>
  Il peut y avoir plusieurs services de transparence (comme c'est le
  cas pour <foreign>Certificate Transparency</foreign>), personne
  n'envisage évidemment d'avoir un unique point de dépôt des
  déclarations.</p>
  <p>Le format des déclarations signées et des reçus figure (en CDDL,
  cf. <rfc num="8610" local="true"/>) en section 6.1.</p>
  <p>La section 9 du RFC est vraiment à lire car c'est celle consacrée
  à l'analyse de sécurité de l'architecture SCITT. D'abord, il faut
  être bien conscient que SCITT fournit de la transparence et de la
  traçabilité mais pas de la vérité. Si un émetteur signe que son
  logiciel tourne avec toutes les versions de libfrobnicate mais qu'en
  fait il lui faut au moins la version 2, le service de transparence
  ne va pas regarder les sources du logiciel pour vérifier. C'est vrai
  pour les erreurs des émetteurs et encore plus pour leurs
  malhonnêtetés. « <foreign>Transparency does not prevent dishonest or
  compromised Issuers, but it holds them accountable</foreign> ».</p>
  <p>Un émetteur grognon ou négligent peut aussi ne pas enregistrer
  toutes les informations qu'il a. Un utilisateur ne doit donc pas
  utiliser une déclaration signée sans vérifier le reçu, qui seul
  prouvera que la déclaration a été enregistrée.</p>
  <p>Il existe apparemment au moins trois mises en œuvre de cette
  technique, chez deux entreprises spécialisées dans la traçabilité
  des chaines d'approvisionnement, <link
  url="https://docs.datatrails.ai/developers/developer-patterns/scitt-api/">Datatrails</link><!--
  https://docs.datatrails.ai/platform/overview/introduction/ --> et
  <link
  url="https://tradeverifyd.github.io/transparency-service/">Tradeverifyd</link><!--
  https://tradeverifyd.com -->, mais aussi <link
  url="https://github.com/microsoft/scitt-ccf-ledger">chez
  Microsoft</link> (cf. <link
  url="https://azure.microsoft.com/en-us/blog/enhancing-software-supply-chain-security-with-microsofts-signing-transparency/">leur
  article</link>).<!-- Ou https://businesscyberguardian.com avec son
  SAG-CTR™ --></p>
  <p>Enfin, une
  bonne lecture sur ces structures de données vérifiables est
  « <foreign><link
  url="https://www.read.seas.harvard.edu/~kohler/class/08w-dsi/chun07attested.pdf">Attested
  Append-Only Memory: Making Adversaries Stick to their
  Word</link></foreign> ».</p>
 </content>
</rfcdesc>

