DevSecOps

GhostPat, CVE-2026-105445 : le jeton Docker Hub

CVE-2026-105445, dite GhostPat : deux ans durant, une conversion de compte Docker Hub transférait les jetons sans rotation. Mécanique et riposte supply chain.

Naïm Aouaichia
9 min de lecture
  • Actualité
  • Supply Chain
  • Docker
  • Gestion des secrets
  • Cosign

Le 12 octobre 2026, Docker a publié l'avis de sécurité de CVE-2026-105445, surnommée GhostPat. Pendant un peu plus de deux ans, la conversion d'un compte personnel Docker Hub en organisation réaffectait les jetons d'accès personnels (personal access tokens, PAT) du compte converti au propriétaire désigné, sans faire tourner le secret sous-jacent et sans demander confirmation à ce propriétaire. Le secret restant inchangé, celui qui le détenait s'authentifiait désormais comme la cible. Le chemin d'attaque tient en trois gestes : créer un compte, y créer un jeton, convertir le compte en organisation en désignant la cible comme propriétaire. La fenêtre d'exposition court du 26 août 2024 à 20 h 33 UTC au déploiement du correctif, le 30 septembre 2026 aux alentours de 19 h 10 UTC, horaire que l'avis marque comme approximatif. Docker indique n'avoir trouvé aucune preuve d'exploitation après avoir examiné environ 304 000 publications d'images réalisées avec des jetons transférés. La faille a été signalée par Peter Molnar et Krisztian Hozak, de mptrdev.com, et corrigée par Docker en moins de quatre heures.

La mécanique, en une phrase

Docker Hub a changé le propriétaire enregistré d'un jeton sans changer le jeton.

C'est tout le défaut, et il mérite d'être formulé ainsi parce que la formulation contient la leçon. Un jeton d'accès est une paire : un secret, et une identité à laquelle ce secret donne accès. Modifier l'identité sans modifier le secret revient à changer la serrure d'une porte en laissant la clé dans la nature. Le nouveau propriétaire ignore qu'une clé existe ; l'ancien l'a toujours.

ÉtapeEffet attenduEffet réel avant correctif
Création d'un compte et d'un jetonLe créateur détient le secretIdem
Conversion du compte en organisationLes jetons du compte devraient être révoquésLes jetons sont réaffectés au propriétaire désigné
Désignation d'un tiers comme propriétaireLe tiers reçoit l'organisationLe tiers reçoit aussi les jetons, sans confirmation ni rotation
Usage du jeton par son créateurDevrait échouerS'authentifie comme le tiers

Ce qui a comporté une erreur de conception, ici, n'est pas le transfert de propriété en soi : c'est l'absence de rotation du secret lors d'un changement de titulaire, et l'absence de consentement explicite du nouveau titulaire.

La portée réelle, ni plus ni moins

Les reprises de presse ont parfois présenté l'affaire comme une usurpation de compte. L'avis de Docker est plus précis, et la précision compte pour l'évaluation du risque.

Ce que le jeton permettait, dans la limite de sa portée : récupérer, publier et supprimer des images dans les dépôts de la cible et dans les organisations auxquelles la cible avait accès.

Ce qu'il ne permettait pas : utiliser l'interface web de Docker Hub, changer le mot de passe, l'adresse de courriel ou les paramètres de double authentification de la cible, prendre le contrôle du compte. Le défaut touchait le service hébergé Docker Hub, et non Docker Engine, Docker Desktop ou un paquet installé localement.

L'accès était donc limité au registre. C'est une restriction réelle, et c'est pourtant sur cette base que Docker a classé la vulnérabilité comme critique : publier une image sous un nom légitime est un risque de chaîne d'approvisionnement logicielle. L'avis de Docker ne publie pas de score CVSS ; les analyses externes avancent un 9.4 en CVSS 4.0, chiffre que l'éditeur n'a pas repris.

Le raisonnement de criticité se tient sans le score. Une image poussée sous le nom d'un éditeur de confiance hérite de la confiance de ce nom. Un docker pull qui réussit, sur une étiquette attendue, dans un dépôt attendu, ne produit aucun signal. La confiance dans un registre public n'est pas une confiance dans un contenu vérifié : c'est une confiance dans un contrôle d'accès à la publication. GhostPat attaquait exactement ce contrôle.

L'enquête, et ce qu'elle peut démontrer

Docker rapporte une investigation détaillée, et son honnêteté sur ses propres limites est la partie la plus instructive.

La méthode. Énumération de toutes les conversions de compte depuis le 26 août 2024, corrélation avec les journaux d'authentification du registre, les données d'usage et les enregistrements de jetons du système de gestion des identités, puis examen d'environ 304 000 publications réalisées avec des jetons transférés.

Le résultat. Aucune preuve d'exploitation. Chaque publication examinée a atterri dans les dépôts de l'organisation convertie ou dans les dépôts propres du nouveau propriétaire, aucune dans un compte sans rapport. Une analyse statique, sans exécution, des images publiques les plus à risque n'a révélé ni code malveillant, ni mineur de cryptomonnaie, ni activité de commande et contrôle, ni collecte d'identifiants, ni mécanisme de persistance, ni altération. Aucune preuve non plus que l'infrastructure de Docker ait été affectée.

La limite, énoncée par Docker. Les journaux montrent l'usage d'un jeton, pas son existence. Un jeton transféré mais jamais utilisé ne laisse aucune trace. Docker a donc traité tout jeton transféré pendant la fenêtre comme potentiellement affecté, et c'est la seule conclusion défendable.

Cette distinction entre usage et existence est un principe de journalisation transposable. Un journal d'usage répond à « qui a agi », jamais à « qui pouvait agir ». Pour répondre à la seconde question, il faut un inventaire des accès, pas une trace d'activité. La plupart des organisations n'ont que la trace.

Ce que Docker a fait, et ce que l'utilisateur doit faire

DateAction
30 septembre 2026, ~19 h 10 UTCDéploiement du correctif
2 octobre 2026Courriel « Docker Hub Vulnerability Identified & Resolved » aux comptes ayant reçu un jeton transféré
8 octobre 2026, 15 h 45 heure de l'EstDésactivation des jetons transférés, sauf maintien demandé avant l'échéance
12 octobre 2026Publication de l'avis de sécurité

Pour un utilisateur, la conduite se déduit du courriel du 2 octobre : l'avoir reçu signifie qu'un jeton a été transféré sur le compte, ne pas l'avoir reçu signifie qu'aucun ne l'a été. Dans les deux cas, la revue des jetons sous « Account settings, Personal access tokens » et la révocation de ceux qu'on ne reconnaît pas ou qu'on n'utilise plus est de l'hygiène de base, pas une réaction à l'incident.

La riposte structurelle : trois mesures qui survivent à l'incident

Un correctif côté service ferme ce défaut. Il ne change rien à la classe de risque, qui est la confiance accordée à un registre public. Trois mesures, par ordre croissant de coût et d'efficacité.

1. Épingler par empreinte, pas par étiquette. Une étiquette (:1.4, :latest) est un pointeur mutable : la même étiquette peut désigner un contenu différent demain. Une empreinte (@sha256:...) désigne un contenu et un seul. Référencer les images de base par empreinte dans les fichiers Dockerfile et les manifestes de déploiement rend inopérante toute republication sous un nom légitime : le contenu ne correspond plus, le déploiement échoue. C'est la mesure la moins coûteuse et la plus directement efficace contre le scénario GhostPat.

2. Vérifier les signatures à l'admission. La signature d'images avec Cosign, et la vérification de cette signature dans le contrôleur d'admission du cluster, déplacent la confiance du nom du dépôt vers une clé. Un attaquant qui publie sous un nom légitime sans détenir la clé produit une image que le cluster refuse. C'est la mesure structurante, et celle qui demande le plus de travail de mise en place, parce qu'elle impose de gouverner des clés.

3. Utiliser des identités d'automatisation, pas des identités personnelles. Docker recommande explicitement les jetons d'accès d'organisation pour les automatisations. La raison dépasse largement cette vulnérabilité : un jeton personnel suit son porteur, pas la fonction. Il survit à un départ, à un changement d'équipe, à une conversion de compte, et son cycle de vie échappe à l'organisation qui en dépend. Les chaînes d'intégration continue adossées au jeton personnel d'un développeur sont une dette d'identité, indépendamment de tout défaut du fournisseur.

La leçon de conception : la rotation est un invariant du transfert

GhostPat n'est pas une faille d'authentification, ni une faille d'autorisation au sens classique. C'est un défaut du cycle de vie d'un secret.

Le modèle mental à retenir se formule en une règle : tout changement de titulaire d'un secret impose la rotation de ce secret. Sans exception, et quelle que soit la raison du changement : conversion de compte, transfert de dépôt, fusion d'organisations, changement de propriétaire d'un projet, reprise d'un service par une autre équipe.

Le corollaire est symétrique et aussi important : recevoir un accès se consent. Un propriétaire qui hérite silencieusement d'un jeton ne peut pas le gouverner, puisqu'il ignore son existence. La notification n'est pas une politesse, c'est la condition pour que la responsabilité soit exerçable.

Ces deux règles valent pour toute plateforme qui permet le transfert de propriété, et la liste est longue : forges logicielles, registres de paquets, fournisseurs d'infrastructure, plateformes d'intégration continue. L'affaire Docker Hub est un cas d'école, pas une singularité.

Pour aller plus loin

Les contre-mesures citées sont détaillées dans la sécurité des images de conteneurs, qui couvre l'épinglage par empreinte et la signature. Les bases du modèle de confiance Docker sont dans sécurité Docker, les bases. Pour la gestion des secrets dans les chaînes d'intégration, voir scan des secrets dans les pipelines.

Sources

  • Docker, « Docker Hub security advisory: personal access tokens transferred during account-to-organization conversions », 12 octobre 2026.
  • BleepingComputer, « Docker Hub flaw let attackers impersonate users, tamper with images », octobre 2026.
  • The Hacker News, « Docker fixes critical two-year-old Hub flaw », octobre 2026.
  • Signalement par Peter Molnar et Krisztian Hozak, mptrdev.com.

Questions fréquentes

  • Mon compte Docker Hub est-il concerné par GhostPat ?
    Docker a envoyé un courriel le 2 octobre 2026, intitulé « Docker Hub Vulnerability Identified & Resolved », à tous les comptes ayant reçu un jeton d'accès personnel transféré. Si vous n'avez pas reçu ce courriel, aucun jeton de votre compte n'a été transféré et aucune action n'est requise selon l'avis de Docker. Si vous l'avez reçu, les jetons transférés ont été désactivés le 8 octobre 2026 à 15 h 45 heure de l'Est, sauf ceux dont le propriétaire avait demandé le maintien avant l'échéance. Dans tous les cas, la revue des jetons sous « Account settings, Personal access tokens » et la révocation de ceux qu'on ne reconnaît pas restent la bonne hygiène.
  • Docker Engine et Docker Desktop sont-ils touchés ?
    Non. Le défaut est dans le service hébergé Docker Hub, pas dans Docker Engine, Docker Desktop ni aucun paquet installé localement. Il n'y a rien à mettre à jour sur les postes ni sur les serveurs : la correction a été déployée côté service le 30 septembre 2026, aux alentours de 19 h 10 UTC selon l'avis, qui marque cet horaire comme approximatif.
  • Que pouvait faire précisément un attaquant avec un jeton transféré ?
    Dans la limite de la portée du jeton : récupérer (pull), publier (push) et supprimer des images dans les dépôts de la cible et dans les organisations auxquelles la cible avait accès. Il ne pouvait pas utiliser l'interface web de Docker Hub, ni changer le mot de passe, l'adresse de courriel ou les paramètres de double authentification de la cible, ni prendre le contrôle du compte. L'accès était limité au registre. C'est ce périmètre restreint, combiné à la possibilité de publier sous un nom légitime, qui fait de l'affaire un sujet de chaîne d'approvisionnement logicielle plutôt qu'un sujet de compromission de compte.
  • Comment Docker peut-il affirmer l'absence d'exploitation ?
    En énumérant chaque conversion de compte depuis le 26 août 2024, en la corrélant aux journaux d'authentification du registre, aux données d'usage et aux enregistrements de jetons, puis en examinant environ 304 000 publications réalisées avec des jetons transférés. Chacune de ces publications a atterri dans les dépôts de l'organisation convertie ou dans les dépôts propres du nouveau propriétaire, aucune dans un compte sans rapport. Une analyse statique, sans exécution, des images publiques les plus à risque n'a révélé ni code malveillant, ni mineur de cryptomonnaie, ni activité de commande et contrôle, ni collecte d'identifiants, ni persistance, ni altération. Docker signale lui-même la limite de cette démonstration : les journaux montrent l'usage d'un jeton, pas son existence, donc un jeton transféré mais jamais utilisé ne laisse aucune trace. C'est pourquoi Docker a traité tout jeton transféré pendant la fenêtre comme potentiellement affecté.
  • Quelle est la mesure structurelle à retenir pour une organisation ?
    Ne pas faire reposer l'automatisation d'une organisation sur le jeton d'accès personnel d'un individu. Docker recommande explicitement l'usage de jetons d'accès d'organisation pour les automatisations. La raison dépasse cette vulnérabilité : un jeton personnel suit son porteur, pas la fonction. Il survit à un départ, à un changement d'équipe, à une conversion de compte, et son cycle de vie n'est pas gouverné par l'organisation qui en dépend. GhostPat est un cas particulier d'un problème général, l'identité d'automatisation adossée à une personne.

Écrit par

Naïm Aouaichia

Fondateur et directeur pédagogique de Zeroday Cyber Academy

Ingénieur cybersécurité avec un parcours hybride : développement, DevOps en ESN française, DevSecOps IN Groupe (sécurité des documents d'identité régaliens), audits CAC 40. Fondateur de Hash24Security et Zeroday Cyber Academy.