Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
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é.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
cve-2026-85706 — PoC d'exploit en Python pour CVE-2026-85706, une lecture arbitraire de fichiers non authentifiée dans GitLab CE/EE via un contournement d'encodage de chemin Workhorse, avec un writeup et des variantes de contournement. | Kitploit
Outils/GitHubGitHub/guneykabel/cve-2026-85706
Analyse des VulnérabilitésExploitationExploitation d'Applications WebCollecte d'InformationsVirtualisation de SécuritéSécurité WebTests d'Intrusion
GitHubguneykabel/cve-2026-85706

cve-2026-85706

PoC d'exploit en Python pour CVE-2026-85706, une lecture arbitraire de fichiers non authentifiée dans GitLab CE/EE via un contournement d'encodage de chemin Workhorse, avec un writeup et des variantes de contournement.

Voir le dépôt
4il y a 12h 9mPas encore vérifié

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 fichier local non authentifiée dans GitLab CE/EE. Affecte 18.7–19.1.7, 19.2.0–19.2.5, 19.3.0–19.3.1. Corrigé dans 19.1.8 / 19.2.6 / 19.3.2 (2026-09-10). CVSS 10.0, exploité dans la nature selon les rapports. Rapport original par s3ntago et ce dépôt n'est que mon writeup + PoC.

avertissement

Ce PoC est publié à des fins éducatives et de recherche défensive uniquement, pour aider les administrateurs et les chercheurs à comprendre et à tester la vulnérabilité. Exécutez-le exclusivement contre des systèmes que vous possédez ou pour lesquels vous disposez d'une autorisation écrite explicite de tester. Si votre instance se situe dans la plage affectée, arrêtez de lire et corrigez d'abord vers 19.1.8 / 19.2.6 / 19.3.2.

comment ça marche

Trois endpoints de dépôt (POST :id/repository/commits, POST/PUT :id/repository/files/:file_path) se trouvent derrière le requestBodyUploader de Workhorse. Le gestionnaire Rails lit le chemin sur disque directement depuis le champ brut file.path de la requête et fait un dessus avant toute authentification. ne sert pas d'authentification car le signing round-tripper de Workhorse attache un JWT valide à chaque requête qu'il proxifie, donc tout ce qui retombe sur le proxy API générique passe cette vérification.

File.open
require_gitlab_workhorse!
Gitlab-Workhorse-Api-Request

La seule raison pour laquelle ce n'est pas une LFI instantanée pour tout le monde est que Workhorse est censé réécrire la requête d'abord. Mais sa regex de route correspond au chemin échappé (EscapedPath() plus un clone path.Clean qui ne décode jamais les %XX), tandis que Puma décode les %XX avant le routage Grape. Donc encodez en pourcentage n'importe quel caractère d'un segment statique (%63ommits, %72epository, %66iles), ajoutez un slash final, ou collez un .json que la regex de Workhorse rate, Rails route toujours vers le gestionnaire vulnérable. Ce décalage d'encodage est là où réside le contournement. (Les variantes //, /./, %2F, ; comme celles-ci ne fonctionnent pas car path.Clean normalise les deux premières et Puma refuse %2F.)

Ensuite, il suffit d'envoyer des métadonnées d'upload non signées falsifiées comme paramètres de requête :

root@kitploit:~
POST /api/v4/projects/1/repository/%63ommits?file=&file.path=<ABSOLUTE_PATH>&file.size=1&Content-Type=application/x-www-form-urlencoded

file= vide satisfait la validation requires :file, WorkhorseFile (une valeur vide est coercée en nil). La lecture se déclenche avant l'authentification. Récupérer les octets en retour est la partie amusante : sur la branche urlencoded, le helper exécute Rack::Utils.parse_nested_query(File.read(path)) et interpole les erreurs du parseur dans le corps de la réponse 400. Tout % non suivi de deux chiffres hexadécimaux déclenche InvalidParameterError: invalid %-encoding (<raw file bytes>) et le contenu du fichier revient dans le message d'erreur. La branche JSON (Oj) ne fuit rien, c'est pourquoi le content type urlencoded est important ici.

Le correctif (master 0d9ce3e7, backports 1fe30154 / b43c8b26 / 0ff7b6b2) ajoute authenticate! aux trois endpoints plus l'étape préalable /authorize, ne fait confiance qu'à l'UploadedFile produit par le middleware pour le chemin/la taille, et cesse de renvoyer les erreurs du parseur. Le bug a été introduit en décembre 2025, c'est pourquoi la plage affectée commence à 18.7.

utilisation

root@kitploit:~
./exploit.py --url http://localhost:8080 --file /etc/hostname
./exploit.py --url http://localhost:8080 --file /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml

Le script parcourt toutes les formes de contournement vérifiées (segments encodés, slash final, .json ; endpoints commits + files, POST et PUT) et classe chaque réponse afin que vous puissiez déterminer où dans la chaîne une sonde a échoué. Cibles autorisées uniquement, évidemment.

défauts / limitations / pré-conditions

  • L'écho ne se déclenche que si le fichier contient un % non suivi de deux caractères hexadécimaux.
  • La regex de fuite est gourmande ((.*) jusqu'à la dernière ) dans le corps). Efficace contre l'erreur JSON standard, sur-capturera si quelque chose en amont enveloppe la réponse dans du HTML. Le correctif approprié est d'analyser le champ message du JSON.
  • L'API commits nécessite un id de projet lisible anonymement (le bloc before renvoie 404 sinon).

références

  • commit de correction (master) : https://gitlab.com/gitlab-org/gitlab/-/commit/0d9ce3e758a85f0690be751e213625f7902c0361
  • notes de version du patch : https://docs.gitlab.com/releases/patches/patch-release-gitlab-19-3-2-released/
  • writeup : https://securityonline.info/gitlab-vulnerabilities-cve-2026-85706-cvss-10/
Télécharger l’outil