Contexte de la vulnérabilité
Le CVE-2026-97229 est classé CVSS 10.0. Il réside dans la façon dont le moteur d'expressions régulières Onigmo, intégré à Ruby, traite les configurations CI de GitLab. La correction a été intégrée dans Ruby 3.3.13, 3.4.12 et 4.0.9, publiées le 23 octobre. GitLab a publié des correctifs le 12 octobre, mais ceux‑ci reposent sur des patchs appliqués uniquement aux paquets Ruby fournis par GitLab, pas sur le code GitLab lui‑même.
Déroulement de l'attaque
Les 20 et 21 octobre, un compte fraîchement créé a envoyé des configurations CI spécialement conçues à l’instance GitLab fonctionnant sous la version 19.3.4, qui ne contenait pas le correctif du 12 octobre. Cette action a provoqué huit plantages des processus worker ; dans quatre cas l’exploit a atteint une étape intermédiaire avant d’échouer. L’attaquant a également téléchargé l’image Docker du serveur, suggérant une adaptation précise à la build utilisée. Aucun fichier, clé ou processus inattendu n’a été détecté, et les sondes de timing n’ont montré aucune latence indicative d’une exécution de code. Cependant, certains journaux du jour d’attaque sont manquants, ce qui empêche d’exclure totalement une compromission.
Analyse de la mitigation et des leçons
L’upgrade vers GitLab 19.3.6 effectué le 22 octobre n’a pas résolu la faille, car le correctif réside dans Ruby et non dans le code GitLab. Les images alpinelinux/gitlab:19.3.6 publiées avant le 27 octobre restent vulnérables ; la version republiée à cette date intègre Ruby 3.3.13. Face à l’incertitude, l’équipe a reconstruit l’instance à partir de zéro, a réinitialisé tous les mots de passe et a imposé le changement via le mécanisme « Forgot your password ». Des mesures supplémentaires comprennent la journalisation des connexions sortantes, la conservation des logs au-delà de 14 jours et la signature des tags de version pour permettre une vérification indépendante.
Impacts potentiels en cas de succès
Une exploitation réussie aurait pu exposer les adresses e‑mail, noms, adresses IP, hachages de mots de passe, secrets 2FA, variables CI/CD, jetons de runner, identifiants de webhook, jetons d’accès personnel et le contenu de dépôts privés, ainsi que les tickets et pull‑requests confidentiels. Aucun de ces éléments n’a été retrouvé dans les traces d’audit, mais l’absence de logs détaillés empêche une certitude absolue.