CVE-2026-85706 — CVSS 10.0, path traversal non authentifié
La CVE-2026-85706 est une vulnérabilité de traversée de chemin (path traversal) dans le composant de gestion des dépôts de GitLab CE et EE. Le vecteur CVSS est AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H — aucune authentification requise, aucune interaction utilisateur, impact complet sur la confidentialité, l'intégrité et la disponibilité. En pratique, une requête HTTP malformée contre l'endpoint d'API des archives de dépôt permet à un attaquant de traverser le système de fichiers de l'instance GitLab et d'atteindre des fichiers de configuration sensibles situés en dehors de la racine des dépôts. Le chercheur de watchTowr a publié un proof-of-concept fonctionnel peu après la divulgation, et les équipes Rapid7 ont confirmé des tentatives d'exploitation actives dans leur télémétrie ETR. La CISA a inscrit la CVE-2026-85706 dans son catalogue Known Exploited Vulnerabilities le 10 septembre 2026, ce qui impose aux agences fédérales américaines un délai de remédiation de 72 heures — signal fort de la gravité réelle de la menace.
Ce que l'attaquant peut lire via path traversal
- secrets.yml — contient la clé de chiffrement active_record_encryption et les seeds de tokens internes ; compromis, il permet de déchiffrer toute la base de données GitLab
- Clés SSH privées des runners GitLab CI/CD — permettent d'exécuter des commandes sur les agents de build et de pivoter vers les environnements de déploiement
- Tokens CI/CD et variables d'environnement stockés dans la configuration — credentials cloud, clés d'API, secrets de déploiement injectés dans les pipelines
- Fichiers de configuration de base de données (database.yml) — hôte, port, nom de base, identifiants de connexion PostgreSQL
- Données de session Redis si la configuration pointe vers un socket Unix accessible
- Contenu de tout fichier lisible par l'utilisateur système git dans l'arborescence de l'instance
Qui est concerné — et qui ne l'est pas
Les versions GitLab CE et EE de 18.7.0 à 19.3.1 incluse sont vulnérables, qu'elles soient installées via les paquets omnibus, déployées en conteneur Docker ou déployées via Helm sur Kubernetes. GitLab.com (le service SaaS hébergé par GitLab Inc.) a été patché en amont par l'équipe GitLab avant la divulgation publique — les utilisateurs de GitLab.com ne sont pas concernés et n'ont aucune action à entreprendre. Seules les instances auto-hébergées sont exposées. Les versions GitLab antérieures à 18.7 ne sont pas affectées par ce vecteur spécifique, mais elles sont en fin de support et exposées à d'autres vulnérabilités non corrigées ; une mise à jour vers 19.3.2 reste recommandée dans tous les cas. Les instances isolées derrière un pare-feu ou un VPN ne sont pas protégées : le vecteur est HTTP standard sur les ports 80 et 443, un accès réseau interne ou une compromission préalable du VPN suffit à déclencher l'exploitation.
Patcher GitLab CE/EE vers 19.3.2
Sauvegarder l'instance avant toute opération
Lancez une sauvegarde complète :
sudo gitlab-backup create STRATEGY=copy. Vérifiez que l'archive est bien présente dans /var/opt/gitlab/backups/ et copiez-la vers un stockage externe. Ne sautez pas cette étape même en situation d'urgence — le patch modifie le schéma de base de données et une sauvegarde pré-patch est irremplaçable.Arrêter GitLab et mettre à jour le paquet omnibus
Sur Debian/Ubuntu :
sudo gitlab-ctl stop && sudo apt-get update && sudo apt-get install --only-upgrade gitlab-ee=19.3.2-ee.0 && sudo gitlab-ctl reconfigure && sudo gitlab-ctl start. Sur RHEL/CentOS : remplacez apt-get paryum update gitlab-ee-19.3.2. Vérifiez la version après redémarrage :sudo gitlab-rake gitlab:env:info | grep GitLab.Mettre à jour une instance Docker
Tirez la nouvelle image :
docker pull gitlab/gitlab-ee:19.3.2-ee.0. Arrêtez le conteneur existant :docker stop gitlab. Relancez avec la nouvelle image en conservant les volumes montés :docker run --detach --name gitlab --restart always -v /srv/gitlab/config:/etc/gitlab -v /srv/gitlab/logs:/var/log/gitlab -v /srv/gitlab/data:/var/opt/gitlab gitlab/gitlab-ee:19.3.2-ee.0. Attendez la fin de la reconfiguration automatique avant de tester l'accès.Vérifier l'intégrité post-mise à jour
Exécutez les checks de santé intégrés :
sudo gitlab-rake gitlab:check SANITIZE=trueetsudo gitlab-rake gitlab:doctor:secrets. Si l'une des vérifications signale une anomalie sur secrets.yml, effectuez immédiatement la rotation des secrets décrite dans la section suivante.
Rotation des secrets après une exposition potentielle
Si votre instance a été exposée sur internet entre la sortie de la version 18.7 et l'application du patch — ou si vous avez le moindre doute — la rotation des secrets est obligatoire. Patcher stoppe l'exploitation future mais ne révoque pas les credentials déjà exfiltrés. Commencez par régénérer la clé de chiffrement de la base de données : sudo gitlab-rake gitlab:encrypted_secrets:rotate_key. Ensuite, révoquez et régénérez tous les tokens de runners CI/CD depuis l'interface d'administration (Admin > CI/CD > Runners), puis reconfigurez chaque agent runner avec le nouveau token via gitlab-runner register. Remplacez les clés SSH déployées sur les runners. Auditez les variables CI/CD de chaque projet (Settings > CI/CD > Variables) et changez tous les secrets de déploiement — clés API cloud, identifiants de registre Docker, tokens d'accès aux services tiers. Notifiez les équipes qui utilisent des pipelines CI/CD de l'instance que leurs secrets de déploiement doivent être considérés comme compromis jusqu'à preuve du contraire.
Checklist post-patch
- Confirmer la version installée :
sudo gitlab-rake gitlab:env:info | grep 'GitLab version'doit afficher 19.3.2 - Chercher des indicateurs de compromission dans les logs Nginx : patterns de requêtes contenant
../répétés ou encodés (%2e%2e%2f) dans /var/log/gitlab/nginx/gitlab_access.log - Vérifier les connexions SSH inattendues dans /var/log/auth.log depuis la première version 18.7 installée
- Scanner l'instance avec l'outil de détection publié par watchTowr pour confirmer que le vecteur est fermé
- Activer l'authentification à deux facteurs obligatoire pour tous les comptes administrateurs si ce n'est pas déjà le cas
- Vérifier que les headers de sécurité HTTP (HSTS, CSP) sont correctement émis après la mise à jour via
curl -I https://votre-instance.example.com - Programmer un audit de sécurité des permissions des dépôts — une exploitation réussie peut avoir créé des comptes administrateurs fantômes
Alternative : migrer vers Gitea sur VPS pour réduire la surface d'attaque
GitLab CE est une forge Git complète mais son architecture monolithique et sa base de code Ruby on Rails volumineuse élargissent mécaniquement la surface d'attaque. La CVE-2026-85706 n'est pas un incident isolé : GitLab a connu quatre CVE critiques (CVSS ≥ 9.0) au cours des dix-huit derniers mois. Gitea est une alternative en Go, mono-binaire, dont l'empreinte mémoire est environ dix fois inférieure et dont l'historique de CVE critiques est nettement plus court. Pour les équipes dont les besoins se limitent à l'hébergement Git, aux pull requests, aux webhooks et à une intégration CI légère, Gitea couvre l'essentiel avec une surface exposée bien plus réduite. La migration implique l'export des dépôts, des issues, des wikis et des membres depuis GitLab via l'API, puis leur import dans Gitea — un processus documenté dans l'article dédié à la migration GitLab vers Gitea. Sur un VPS à accès root, vous gardez le contrôle complet du calendrier de mise à jour, des sauvegardes et de la rotation des secrets, sans dépendre d'un éditeur tiers pour décider quand votre instance est patchée.
Déployer Gitea sur VPS ServOrbit en 4 étapes
Provisionner un VPS et sélectionner le template Gitea
Depuis l'espace client ServOrbit, créez un nouveau VPS (minimum 2 vCPU, 2 Go RAM pour une équipe jusqu'à 20 développeurs) et sélectionnez le template applicatif Gitea. Le template préconfigure Gitea avec systemd, un reverse proxy Nginx avec TLS automatique via Let's Encrypt, et des sauvegardes quotidiennes vers le stockage objet de votre choix.
Configurer le domaine et le TLS
Pointez votre sous-domaine (ex. git.votre-domaine.com) vers l'IP du VPS via un enregistrement A dans votre zone DNS. Le script de post-installation détecte le domaine, sollicite un certificat Let's Encrypt en DNS-01 si vous utilisez Cloudflare, ou en HTTP-01 sinon, et configure Nginx en HTTPS uniquement avec HSTS.
Importer les dépôts depuis GitLab
Gitea intègre un assistant de migration (Administration > Import de dépôts) qui accepte l'URL de votre instance GitLab et un token d'accès personnel. Il importe les dépôts, les branches, les tags, les issues ouvertes et les wikis. Pour les organisations avec de nombreux projets, l'outil en ligne de commande
gitea-cli migratepermet d'automatiser l'import par lot.Configurer les runners CI/CD et révoquer l'ancienne instance
Déployez Forgejo Actions ou connectez un runner Gitea Act sur le même VPS ou sur un agent dédié. Mettez à jour les secrets de déploiement dans chaque dépôt migré. Une fois les pipelines validés sur Gitea, révoquez les tokens de l'ancienne instance GitLab, désactivez les runners et planifiez la désinstallation de GitLab pour libérer les ressources.
Pour les instances GitLab derrière un VPN ou un réseau interne : ne reportez pas le patch en supposant que l'isolation réseau suffit. Le vecteur CVE-2026-85706 est HTTP sur les ports 80 et 443 — tout utilisateur ayant accès au VPN, tout poste compromis sur le réseau interne, ou tout service qui appelle l'API GitLab peut déclencher l'exploitation sans aucun credential GitLab. La CISA KEV confirme que des acteurs malveillants ciblent activement ce vecteur, y compris dans des environnements d'entreprise. Le patch reste la seule remédiation fiable.
GitLab CE auto-hébergé vs Gitea — critères de sécurité et d'exploitation
Faites défiler le tableau
| Critère | GitLab CE 19.x | Gitea 1.22.x |
|---|---|---|
| Langage / architecture | Ruby on Rails + Go (hybride) | Go — mono-binaire |
| Empreinte mémoire minimale | ~2–4 Go RAM | ~150–300 Mo RAM |
| CVE critiques (CVSS ≥ 9) sur 18 mois | 4 dont CVE-2026-85706 | 0 |
| Authentification 2FA built-in | Oui | Oui |
| Contrôle du calendrier de patch | Vous (auto-hébergé) | Vous (auto-hébergé) |
| SaaS déjà patché disponible | GitLab.com (gratuit) | Gitea Cloud (bêta) |
| Intégration CI/CD native | GitLab CI (complète) | Gitea Actions / Forgejo Actions |
| Migration depuis GitLab | N/A | Assistant intégré + API |
Leçon de sécurité : gérer sa forge Git sur un VPS à accès root
La CVE-2026-85706 illustre un principe fondamental de la sécurité des logiciels auto-hébergés : la fenêtre d'exposition entre la divulgation d'une CVE critique et l'application du patch est la période la plus dangereuse de la vie d'une instance. Sur GitLab.com, cette fenêtre était nulle — l'équipe GitLab a patché silencieusement avant la divulgation. Sur une instance auto-hébergée, la fenêtre dépend entièrement de votre capacité à être alerté, à tester et à déployer rapidement. Un VPS avec accès root vous donne le contrôle total sur ce cycle : vous pouvez automatiser les mises à jour de sécurité avec unattended-upgrades pour les paquets système, mettre en place des alertes sur les CVE via les flux RSS du programme de sécurité GitLab, et tester le patch sur un environnement de staging avant la production. Ce contrôle est aussi une responsabilité : aucun fournisseur cloud ne patchera votre instance GitLab ou Gitea à votre place. La bonne pratique est de traiter les CVE CVSS ≥ 9 comme des incidents de production — plan de remédiation en moins de 24 heures, rotation des secrets en moins de 48 heures. Sur un VPS ServOrbit, les sauvegardes automatiques et l'accès root direct permettent de tenir ce calendrier sans dépendre d'un service managé dont vous ne contrôlez ni les délais ni les procédures.