Aller au contenu

CVE-2026-85706 : traversée de répertoire non authentifiée dans l'API des commits GitLab ce/EE

HERMES

SCORE DE MENACE HERMES & COMPROMISSION DE L'INFRASTRUCTURE DEVOPS

Cible : GitLab Community & Enterprise Edition (CE/EE)
Confiance : 99%
99 / 100
CRITIQUE

Mesure la pertinence opérationnelle réelle, la militarisation de l'exploit et la posture de menace active.

Décomposition des dimensions
Exploitabilité 20 / 20
Activité de menace 20 / 20
Militarisation 20 / 20
Exposition 20 / 20
Prévalence 19 / 20
Impact 20 / 20
Maturité de l'exploit 20 / 20
Potentiel d'attaque en chaîne 20 / 20
⚖️ Divergence & Justification opérationnelle

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.

🕸️ Graphe de connaissances connecté & Provenance

CVE-2026-85706: Unauthenticated Path Traversal to Arbitrary File Read in GitLab CE/EE Repository Commits APIVULNÉRABILITÉ

Nœuds connectés : 3
Relations sortantes actives
→ affectsCOMPOSANTGitLab CE / EE
98% VERY_HIGH

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.”

Preuves vérifiées associées :
→ usesTECHNIQUE D'ATTAQUET1552: Unsecured Credentials
90% 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.”

Preuves vérifiées associées :
→ usesTECHNIQUE D'ATTAQUET1059: Command and Scripting Interpreter
90% 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.”

Preuves vérifiées associées :

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ètreSpécification TechniqueContexte Threat Intelligence
Identifiant CVECVE-2026-85706Enregistrement officiel NVD & CISA KEV
Faiblesse CWECWE-35 (Path Traversal), CWE-306 (Missing Authentication)Défaut d’autorisation API et de filtrage de chemin
Vecteur réseauHTTP/HTTPS (80/TCP, 443/TCP, 8080/TCP)Requêtes REST non authentifiées directes
Composant vulnérableAPI des commits (Repositories::CommitsController)Sous-routines de résolution de chemin et génération de diff
Versions affectées18.7 à < 19.1.8, 19.2.0 à < 19.2.6, 19.3.0 à < 19.3.2Installations self-managed GitLab CE et EE
Versions corrigées19.1.8, 19.2.6, 19.3.2Correctifs critiques officiels (10 septembre 2026)
Inclusion CISA KEV11 septembre 2026 (Échéance : 14 septembre 2026)Triage Forensique : Oui (BOD 26-04)
Exploitation ActiveConfirmé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 Commits
module 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
end
end

L’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 /.

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 »
  1. L’attaquant identifie l’identifiant d’un projet quelconque sur l’instance cible (y compris le projet modèle par défaut 1).
  2. Une requête HTTP GET est 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.1
    Host: gitlab.target.enterprise
    User-Agent: Mozilla/5.0
    Accept: application/json
  3. Le serveur répond par un code 200 OK contenant gitlab-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.


TactiqueIdentifiantNom de la TechniqueManifestation dans l’Attaque
Accès initialT1190Exploit Public-Facing ApplicationRequête HTTP non authentifiée vers /api/v4/projects/.../commits
Accès aux identifiantsT1552.001Credentials in FilesExfiltration directe de /etc/gitlab/gitlab-secrets.json
DécouverteT1083File and Directory DiscoveryLecture arbitraire de fichiers de configuration système
Élévation de privilègesT1556Modify Authentication ProcessForgerie de sessions administratives via secret_key_base
ExécutionT1059.004Unix ShellExécution de commandes via la console Rails ou les runners CI/CD

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;
)
title: Exploitation de la traversée de répertoire sur l'API Commits GitLab
id: e4f82a19-8570-4c31-9876-cve202685706
status: production
description: Détecte les tentatives de traversée de chemin ciblant l'API des commits GitLab (CVE-2026-85706)
author: Hermes Codex Cyber Threat Intelligence
date: 2026-09-11
logsource:
category: webserver
service: gitlab_nginx_access
detection:
selection:
cs_method: 'GET'
cs_uri_stem|contains: '/repository/commits/'
cs_uri_query|contains:
- '..'
- '%2e%2e'
- '%2fetc%2f'
- 'gitlab-secrets'
- 'database.yml'
condition: selection
fields:
- c_ip
- cs_uri_stem
- cs_uri_query
- sc_status
falsepositives:
- Outils d'analyse de code légitimes référençant des séquences littérales dans les messages de commit
level: critical
tags:
- attack.initial_access
- attack.t1190
- attack.credential_access
- attack.t1552.001
- cve.2026.85706

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 :

  1. 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)'
  2. 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)'
  3. Détection de connexions administratives anormales : Inspecter /var/log/gitlab/gitlab-rails/production_json.log pour repérer des sessions sous le compte root ou admin initiées depuis des adresses IP inconnues sans authentification préalable (MFA/SSO).

  4. 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 »
  1. 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)
  2. 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_base et otp_key_base via 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).
  3. 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/.