CVE-2026-85706 : traversée de répertoire non authentifiée dans l'API des commits GitLab ce/EE
SCORE DE MENACE HERMES & COMPROMISSION DE L'INFRASTRUCTURE DEVOPS
Cible :GitLab Community & Enterprise Edition (CE/EE) Le CVSS v3.1 attribue à la CVE-2026-85706 le score maximal de 10.0 (Critique, CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N). Le score de menace Hermes évalue la vulnérabilité à 99 (CRITIQUE). Cet alignement maximal traduit une faille sans authentification ni interaction permettant l'exfiltration immédiate des secrets maîtres de GitLab (gitlab-secrets.json, database.yml), ouvrant la voie à une exécution de code à distance (RCE) par falsification de sessions Rails.
CVE-2026-85706: Unauthenticated Path Traversal to Arbitrary File Read in GitLab CE/EE Repository Commits APIVULNÉRABILITÉ
Complete DevOps and DevSecOps lifecycle platform providing Git repository management, CI/CD pipelines, and security automation.
🔍 Pourquoi cette relation ? (Preuves & Provenance)
“Confirmed security vulnerability in GitLab Community & Enterprise Edition documented in Hermes dossier.”
- [vulnerability_report]
- [government_confirmation]CISA verified active exploitation in the wild and mandated federal remediation deadline in KEV entry. — Source : Cybersecurity & Infrastructure Security Agency (CISA): CISA Adds CVE-2026-59822 to Known Exploited Vulnerabilities Catalog (Fiabilité : VERY_HIGH)
Adversaries search compromise victims for unsecured credentials in files, environment variables, or memory.
🔍 Pourquoi cette relation ? (Preuves & Provenance)
“Attack execution telemetry aligns with MITRE ATT&CK technique T1552.”
- [government_confirmation]CISA verified active exploitation in the wild and mandated federal remediation deadline in KEV entry. — Source : Cybersecurity & Infrastructure Security Agency (CISA): CISA Adds CVE-2026-59822 to Known Exploited Vulnerabilities Catalog (Fiabilité : VERY_HIGH)
Adversaries abuse command and script interpreters (Bash, Python, PowerShell) to execute arbitrary commands.
🔍 Pourquoi cette relation ? (Preuves & Provenance)
“Attack execution telemetry aligns with MITRE ATT&CK technique T1059.”
- [government_confirmation]CISA verified active exploitation in the wild and mandated federal remediation deadline in KEV entry. — Source : Cybersecurity & Infrastructure Security Agency (CISA): CISA Adds CVE-2026-59822 to Known Exploited Vulnerabilities Catalog (Fiabilité : VERY_HIGH)
1. Contexte technique & matrice des versions affectées
Section intitulée « 1. Contexte technique & matrice des versions affectées »Les instances GitLab constituent le cœur névralgique des environnements DevSecOps d’entreprise, hébergeant le code source propriétaire, les pipelines CI/CD, les registres de conteneurs et les secrets d’infrastructure.
| Paramètre | Spécification Technique | Contexte Threat Intelligence |
|---|---|---|
| Identifiant CVE | CVE-2026-85706 | Enregistrement officiel NVD & CISA KEV |
| Faiblesse CWE | CWE-35 (Path Traversal), CWE-306 (Missing Authentication) | Défaut d’autorisation API et de filtrage de chemin |
| Vecteur réseau | HTTP/HTTPS (80/TCP, 443/TCP, 8080/TCP) | Requêtes REST non authentifiées directes |
| Composant vulnérable | API des commits (Repositories::CommitsController) | Sous-routines de résolution de chemin et génération de diff |
| Versions affectées | 18.7 à < 19.1.8, 19.2.0 à < 19.2.6, 19.3.0 à < 19.3.2 | Installations self-managed GitLab CE et EE |
| Versions corrigées | 19.1.8, 19.2.6, 19.3.2 | Correctifs critiques officiels (10 septembre 2026) |
| Inclusion CISA KEV | 11 septembre 2026 (Échéance : 14 septembre 2026) | Triage Forensique : Oui (BOD 26-04) |
| Exploitation Active | Confirmée dans la nature (PoCs disponibles) | Balayage massif, vol de secrets et détournement CI/CD |
2. Décomposition technique approfondie & cause racine
Section intitulée « 2. Décomposition technique approfondie & cause racine »A. La faille de résolution de chemin dans l’API des commits
Section intitulée « A. La faille de résolution de chemin dans l’API des commits »L’API REST de GitLab fournit des points d’accès permettant d’examiner les commits, les diffs et les fichiers associés via /api/v4/projects/:id/repository/commits/:sha/....
Dans les versions vulnérables, un point d’accès auxiliaire destiné à afficher le contenu brut des fichiers modifiés dans un commit n’invoquait pas les filtres d’autorisation habituels (authenticate_user! ou authorize_read_code!). De plus, le paramètre filepath fourni par l’utilisateur était traité par un résolveur qui n’empêchait pas la traversée de répertoire :
# Schéma conceptuel du code vulnérable dans l'API des Commitsmodule API class Commits < ::API::Base namespace 'projects/:id/repository/commits' do params do requires :sha, type: String, desc: 'Hash du commit' requires :filepath, type: String, desc: 'Chemin cible du fichier' end get ':sha/raw_diff_file' do # FAILLE 1 : Absence de vérification authenticate_user! # FAILLE 2 : Filtrage incomplet permettant la traversée file_path = params[:filepath]
# Filtre inopérant face à l'encodage URL ou aux séquences imbriquées if file_path.include?('../') render_api_error!('Invalid path', 400) else full_path = File.expand_path(file_path, project.repository.raw_repository.path) send_file full_path # Rendu direct du fichier arbitraire ! end end end endendL’appel à File.expand_path résout les chemins relatifs. Un attaquant transmettant des séquences encodées en URL (%2e%2e%2f) ou imbriquées (....//) contournait la vérification include?('../'), tandis que File.expand_path résolvait le chemin absolu depuis la racine /.
B. Architecture du flux d’attaque (AttackFlow)
Section intitulée « B. Architecture du flux d’attaque (AttackFlow) »sequenceDiagram autonumber actor Attaquant as Attaquant Externe Non Authentifié participant Nginx as Reverse Proxy Nginx GitLab participant Workhorse as GitLab Workhorse participant Rails as API Rails GitLab (Commits) participant FS as Système de Fichiers (/etc/gitlab)
Attaquant->>Nginx: GET /api/v4/projects/1/repository/commits/main/raw_diff_file?filepath=....//....//etc/gitlab/gitlab-secrets.json Nginx->>Workhorse: Transmission de la requête HTTP GET Workhorse->>Rails: Routage vers API::Commits Note over Rails: Absence de contrôle d'authentification.<br/>Contournement du filtrage via séquences imbriquées. Rails->>FS: File.read("/etc/gitlab/gitlab-secrets.json") FS-->>Rails: Données JSON confidentielles (secret_key_base, db creds) Rails-->>Workhorse: 200 OK + Fichier de secrets Workhorse-->>Attaquant: Exfiltration du fichier maître de secrets Note over Attaquant: Signature d'un cookie de session administrateur<br/>Exécution de code à distance (RCE) sous l'utilisateur git !3. Chaîne d’exploitation & compromission totale
Section intitulée « 3. Chaîne d’exploitation & compromission totale »L’exploitation de la vulnérabilité CVE-2026-85706 s’articule en deux étapes :
Étape 1 : exfiltration d’informations sensibles
Section intitulée « Étape 1 : exfiltration d’informations sensibles »- L’attaquant identifie l’identifiant d’un projet quelconque sur l’instance cible (y compris le projet modèle par défaut
1). - Une requête HTTP
GETest envoyée avec la charge utile de traversée :GET /api/v4/projects/1/repository/commits/HEAD/raw_diff_file?filepath=..%2f..%2f..%2f..%2f..%2f..%2fetc%2fgitlab%2fgitlab-secrets.json HTTP/1.1Host: gitlab.target.enterpriseUser-Agent: Mozilla/5.0Accept: application/json - Le serveur répond par un code
200 OKcontenantgitlab-secrets.json:db_key_base: déchiffrement des jetons d’applications OAuth et webhooks.openid_connect_signing_key: falsification d’assertions OIDC.secret_key_base: signature et chiffrement des cookies de session Rails.
Étape 2 : élévation et exécution de code (RCE)
Section intitulée « Étape 2 : élévation et exécution de code (RCE) »À l’aide de la clé secret_key_base, l’adversaire génère un cookie de session Rails forgé (_gitlab_session) contenant un objet Ruby malveillant ou s’attribuant les droits de l’administrateur principal (user_id=1). Avec cet accès, il peut déployer des pipelines malveillants sur les runners GitLab ou exécuter directement des commandes au niveau de l’OS hôte.
4. Correspondance MITRE ATT&CK
Section intitulée « 4. Correspondance MITRE ATT&CK »| Tactique | Identifiant | Nom de la Technique | Manifestation dans l’Attaque |
|---|---|---|---|
| Accès initial | T1190 | Exploit Public-Facing Application | Requête HTTP non authentifiée vers /api/v4/projects/.../commits |
| Accès aux identifiants | T1552.001 | Credentials in Files | Exfiltration directe de /etc/gitlab/gitlab-secrets.json |
| Découverte | T1083 | File and Directory Discovery | Lecture arbitraire de fichiers de configuration système |
| Élévation de privilèges | T1556 | Modify Authentication Process | Forgerie de sessions administratives via secret_key_base |
| Exécution | T1059.004 | Unix Shell | Exécution de commandes via la console Rails ou les runners CI/CD |
5. Règles de détection & télémétrie SIEM
Section intitulée « 5. Règles de détection & télémétrie SIEM »A. Règle réseau Suricata
Section intitulée « A. Règle réseau Suricata »alert http $EXTERNAL_NET any -> $HTTP_SERVERS any ( msg:"HERMES - Tentative de traversee de repertoire sur API Commits GitLab (CVE-2026-85706)"; flow:established,to_server; http.method; content:"GET"; http.uri; content:"/api/v4/projects/"; http.uri; content:"/repository/commits/"; http.uri; pcre:"/filepath=[^&]*(\.\.|\%2e\%2e|\%2fetc|\%2fvar|\%2fopt)/i"; classtype:web-application-attack; sid:202685706; rev:1; reference:cve,2026-85706;)B. Règle Sigma (journaux Nginx & API GitLab)
Section intitulée « B. Règle Sigma (journaux Nginx & API GitLab) »title: Exploitation de la traversée de répertoire sur l'API Commits GitLabid: e4f82a19-8570-4c31-9876-cve202685706status: productiondescription: Détecte les tentatives de traversée de chemin ciblant l'API des commits GitLab (CVE-2026-85706)author: Hermes Codex Cyber Threat Intelligencedate: 2026-09-11logsource: category: webserver service: gitlab_nginx_accessdetection: selection: cs_method: 'GET' cs_uri_stem|contains: '/repository/commits/' cs_uri_query|contains: - '..' - '%2e%2e' - '%2fetc%2f' - 'gitlab-secrets' - 'database.yml' condition: selectionfields: - c_ip - cs_uri_stem - cs_uri_query - sc_statusfalsepositives: - Outils d'analyse de code légitimes référençant des séquences littérales dans les messages de commitlevel: criticaltags: - attack.initial_access - attack.t1190 - attack.credential_access - attack.t1552.001 - cve.2026.857066. Analyse DFIR & protocole de triage forensique
Section intitulée « 6. Analyse DFIR & protocole de triage forensique »Protocole de triage d’urgence (conformité directive CISA BOD 26-04)
Section intitulée « Protocole de triage d’urgence (conformité directive CISA BOD 26-04) »En raison de la mention Triage Forensique : oui, les équipes de sécurité doivent impérativement auditer leurs instances avant de les considérer comme saines :
-
Analyse des journaux API rails (
/var/log/gitlab/gitlab-rails/api_json.log) : Rechercher les requêtes ayant reçu une réponse HTTP 200 sur les points de terminaison de commits contenant des paramètres suspects :Fenêtre de terminal grep -E '"path":"/api/v4/projects/[0-9]+/repository/commits/[^"]+"' /var/log/gitlab/gitlab-rails/api_json.log \| grep -E '(\.\.|%2e%2e|gitlab-secrets|database\.yml)' -
Analyse des journaux d’accès Nginx (
/var/log/gitlab/nginx/gitlab_access.log) :Fenêtre de terminal grep -E 'GET /api/v4/projects/.*/repository/commits' /var/log/gitlab/nginx/gitlab_access.log \| grep -E '(\.\.|%2e%2e|etc/gitlab)' -
Détection de connexions administratives anormales : Inspecter
/var/log/gitlab/gitlab-rails/production_json.logpour repérer des sessions sous le compterootouadmininitiées depuis des adresses IP inconnues sans authentification préalable (MFA/SSO). -
Audit des runners CI/CD et jetons d’accès : Vérifier dans l’interface d’administration si de nouveaux runners partagés ou projets ont été enregistrés aux alentours de l’horodatage des requêtes suspectes.
7. Remédiation & renouvellement obligatoire des secrets
Section intitulée « 7. Remédiation & renouvellement obligatoire des secrets »-
Application immédiate du correctif de sécurité : Mettre à jour l’instance GitLab vers la version corrigée correspondante :
- GitLab 19.3.2 (branche 19.3)
- GitLab 19.2.6 (branche 19.2)
- GitLab 19.1.8 (branche 19.1 et antérieures)
-
Renouvellement impératif des secrets (en cas d’exposition suspectée) : Si les journaux confirment ou suggèrent la lecture non autorisée de
/etc/gitlab/gitlab-secrets.json, le simple déploiement du patch ne suffit pas :- Révoquer et régénérer
secret_key_base,db_key_baseetotp_key_basevia les tâches rake dédiées (gitlab:secrets:rotate). - Invalider l’ensemble des sessions actives.
- Renouveler les jetons d’enregistrement de runners et les Personal Access Tokens (PAT).
- Révoquer et régénérer
-
Protection périmétrique temporaire (WAF) : Dans l’attente du redémarrage, bloquer au niveau du WAF ou du reverse proxy toute requête contenant des caractères de traversée (
..,%2e%2e) vers/api/v4/projects/.