Un utilisateur GitLab autorisé à configurer un agent ne devrait pas recevoir les pouvoirs système du service qui traite ce flux. CVE-2026-90970 rompt cette séparation : une configuration Duo préparée peut sortir du bac à sable des templates de prompts et exécuter des commandes arbitraires sur un AI Gateway vulnérable.
GitLab a divulgué la faille le 2 octobre 2026 et l'a classée critique, CVSS 3.1 de 9,9. L'exploitation exige authentification et accès à Duo Agent Platform. Ce n'est pas une prise de contrôle anonyme et sans clic de chaque serveur GitLab. L'enjeu est la frontière franchie après ces conditions, pas la négation de celles-ci.
Les gateways exploités par GitLab sont déjà corrigés. Les opérateurs auto-hébergés concernés doivent mettre à jour et examiner leur environnement. Garder code et prompts dans un réseau privé ne maintient pas automatiquement un auteur authentifié dans le bac à sable prévu.
Vérifier le gateway, pas seulement GitLab
Les versions concernées commencent à AI Gateway 18.1.6 et vont jusqu'avant 19.2.4 ; la branche 19.3 est touchée avant 19.3.2, la 19.4 avant 19.4.1. Les corrections sont 19.2.4, 19.3.2 et 19.4.1. Il faut adopter la version corrigée adaptée ou une version ultérieure prise en charge.
Ces numéros concernent un service indépendant entre fonctions IA GitLab et modèles. Il traite logique applicative et requêtes, sans être le modèle de langage. Image et déploiement ont parfois un cycle différent de l'application principale. Vérifier uniquement la version familière de GitLab peut manquer un ancien gateway.
Les architectures gérées, hybrides et entièrement privées diffèrent. En hybride, certaines fonctions utilisent l'infrastructure du client, d'autres les services GitLab. L'inventaire doit couvrir routage par fonction, répliques, développement et prototypes, images en cache et reprise après sinistre, pas seulement l'interface principale.
L'auto-hébergement intégral peut fonctionner avec peu ou pas d'internet général. Il réduit certaines voies externes, pas celles d'un initié autorisé, compte volé, jeton de service ou charge interne compromise. La déconnexion peut aussi ralentir alertes de sécurité et acheminement des correctifs.
L'erreur se trouve dans le logiciel des templates
Un flux agentique combine prompts, outils, décisions et actions en tâche de développement multietape. Les templates transforment configuration et valeurs d'exécution en instructions du modèle. Le bac à sable doit empêcher ces entrées d'atteindre fonctions dangereuses ou capacités du système d'exploitation.
La classe CWE-1336 désigne une neutralisation incorrecte d'éléments spéciaux d'un moteur de templates. Une syntaxe contrôlée par l'attaquant peut être exécutée au lieu de rester une donnée. GitLab décrit des commandes arbitraires sur le gateway ; leurs suites dépendent des droits du processus, objets exposés, identifiants et chemins réseau.
Ce n'est pas l'injection de prompt qui tente de détourner le modèle. L'injection de template attaque le logiciel conventionnel qui construit ou rend ses instructions. Les commandes peuvent s'exécuter indépendamment de la réponse du modèle. Ajouter une consigne comportementale ne répare donc pas le traitement logiciel vulnérable.
Cela ne prouve pas non plus qu'un modèle a inventé seul une évasion. L'entrée est un flux IA, mais la frontière appartient à l'application. L'enquête doit couvrir historique des configurations, activité gateway/conteneur, permissions et identifiants en aval. Les conversations ne constituent pas toute la trace de l'incident.
Pourquoi une faille authentifiée atteint 9,9
Le vecteur publié est AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H. Une attaque réseau ne demande pas une session shell locale préalable, mais réseau ne signifie pas forcément internet public. La faible complexité n'exige pas de course étroite ou d'état exceptionnel dans l'évaluation standard. Les faibles privilèges restent une authentification et un accès à la plateforme.
L'absence d'interaction supplémentaire signifie qu'une autre personne n'a pas à ouvrir un fichier, accepter un dialogue ou cliquer un leurre après l'arrivée de la configuration. Le changement de portée décrit le passage d'une entrée de flux autorisée à une autre autorité : l'environnement de commandes du gateway.
Les impacts élevés sur confidentialité, intégrité et disponibilité comprennent lecture, modification et interruption possibles. La note standardisée 9,9 ne prouve ni dégâts maximaux partout ni intrusion quelconque. Architecture, moindre privilège, systèmes accessibles et secrets déterminent l'effet réel.
Un utilisateur authentifié n'est pas automatiquement administrateur. Les auteurs de flux peuvent avoir beaucoup de fonctions sans les droits système du processus interprète. Un jeton volé ou une identité automatique trop puissante rend cette distinction importante même avec un utilisateur initialement légitime.
Les conteneurs sont une frontière, pas une suppression du risque. Même sans root, ils exposent potentiellement secrets montés, jetons, données traitées et réseaux internes. Montages inscriptibles, droits excessifs et sorties réseau étendues aggravent les conséquences ; un conteneur compromis ne prouve pas la perte de toute l'infrastructure.
Un second cas critique pose une question d'architecture
En février, GitLab a corrigé CVE-2026-1868 dans Duo Workflow Service du gateway. Il concernait aussi une expansion dangereuse de templates utilisateurs via des flux préparés, avec mêmes 9,9 et vecteur. Les corrections incluaient 18.6.2, 18.7.1 et 18.8.1 ; la découverte revenait à un membre interne.
La ressemblance justifie un examen approfondi de la confiance flux-template. Elle ne prouve ni régression, ni correctif de février incomplet, ni chemin identique en octobre. Les résumés publics n'établissent pas la relation ; aucune hypothèse ne doit devenir un fait confirmé.
Une configuration déclarative flexible peut agir comme langage de programmation lorsque variables, expressions et plugins deviennent des actions privilégiées. Plus de personnalisation élargit le travail des parseurs et bacs à sable. Associer rendu non fiable et accès précieux dans un processus est le risque central.
Des couches indépendantes restent utiles : entrées traitées comme données, objets minimaux, soumission autorisée, limites fichiers/réseau/identifiants et changements attribuables. Création ou modification d'un flux doit pouvoir se relier au comportement ultérieur du gateway. Propriétaire, revue, versions et tests sont nécessaires comme pour la configuration CI.
Corriger et établir la compromission sont deux tâches
Il faut conserver l'ancien digest et les preuves du déploiement, installer une version corrigée, redémarrer puis vérifier l'image réellement exécutée. Répliques anciennes, tests et reprise ne doivent pas conserver d'image touchée. Un démarrage réussi ne prouve pas le remplacement de chaque copie.
L'examen de la période vulnérable doit identifier personnes et services autorisés à créer/modifier des flux, garder les configurations et consulter les audits. Processus enfants inattendus, interprètes, fichiers modifiés, connexions sortantes et redémarrages inhabituels méritent comparaison au comportement normal. Ce sont des pistes, pas des indicateurs universels publiés pour cette CVE.
L'installation décrit des JWT signés et des services Gateway/Agent Platform séparés avec paires de clés distinctes. Il faut étudier les deux, leur confiance et leurs clés/configurations d'exécution. Un identifiant ne représente pas tout le système. Des secrets accessibles au processus compromis peuvent nécessiter rotation si preuves ou exposition le justifient.
Il faut cartographier instance GitLab, serveurs de modèles, surveillance et cibles internes accessibles. Prompts issus du code et contexte d'issues peuvent être sensibles même si le conteneur stocke peu. Sorties restreintes, identités de charges, fichiers en lecture seule et droits minimaux limitent l'impact sans corriger les templates ni remplacer la mise à jour.
L'auto-hébergement distribue les tâches entre équipes plateforme, modèles, conteneurs et réseau. Une image sans responsable peut tomber entre les périmètres. Le géré réduit cette tâche précise du client mais crée d'autres compromis de fournisseur, résidence et dépendance. L'incident ne démontre pas qu'une option est toujours plus sûre.
Ce que le dossier public ne démontre pas
Les informations disponibles n'établissent ni exploitation active ou massive en production, ni preuve de concept publique, chemin détaillé ou indicateurs universels après compromission. Pas de confirmation publique ne signifie pas absence prouvée. Exécution reconnue par le fournisseur et classement critique suffisent à corriger sans prolonger l'exposition.
Les prochaines preuves sont adoption vérifiée, analyse de cause par GitLab et télémétrie crédible ou nouvelles consignes officielles. Après un délai de mise à jour, des détails peuvent distinguer chemin séparé, contournement ou régression. Les dossiers locaux doivent identifier images ancienne/nouvelle, redémarrage, validation et responsables avec historique d'incident et de configuration.
Le test pratique est de connaître les gateways présents, qui modifiait les flux et quelles ressources ou secrets chaque processus pouvait atteindre. Le middleware IA exige la discipline des runners CI, dépôts d'artefacts et gestionnaires de secrets. La localisation des données devient contrôle quand l'organisation peut inventorier, corriger, isoler et examiner le service qui agit.
Sources et lectures complémentaires
Fiche CVE-2026-90970 · Documentation AI Gateway · Faiblesse des templates CWE-1336 · Architecture Duo auto-hébergée · Installation et clés de signature · Ancienne CVE-2026-1868 · Guide de conservation des incidents · Référence de découverte originale
