CVE-2025-47812
Corrige ahora. Ella está bajo explotación confirmada por CISA y tiene exploit funcional público.
Apply mitigations per vendor instructions, follow applicable BOD 22-01 guidance for cloud services, or discontinue use of the product if mitigations are unavailable.
Resumen
Falha crítica no Wing FTP Server que permite a um atacante remoto executar comandos arbitrários com privilégios de root (Linux) ou SYSTEM (Windows) — o nível máximo de comprometimento possível para esse serviço. O ponto crítico que a nota do CVSS 10.0 não deixa claro: a exploração exige apenas um nome de usuário válido, e contas anônimas (comuns em servidores FTP mal configurados) servem perfeitamente para isso, o que torna a falha efetivamente pré-autenticação em muitos ambientes.
Detalle técnico
A raiz do problema (CWE-158, Improper Neutralization of Null Byte) está em loginok.html, o script Lua que processa autenticação nas interfaces web de usuário e de administração. O parâmetro username é passado para c_CheckUser(), função implementada no binário nativo wftpserver. Internamente, a string chega via lua_tolstring (que preserva o byte nulo e tudo depois dele), mas é em seguida copiada para um objeto CStdStr através de uma chamada que usa std::string::assign — e essa rotina usa strlen() para calcular o tamanho da string. strlen() para no primeiro \0, então a verificação de credenciais só considera o trecho antes do byte nulo.
Resultado: se existir um usuário cujo nome coincide com o trecho antes do \0 — inclusive 'anonymous', se contas anônimas estiverem habilitadas — a autenticação é aprovada, independentemente do que vem depois do byte nulo. O problema é que o restante da string (username completo, incluindo tudo após o \0) não é descartado em outro ponto do fluxo: ele é usado para montar o arquivo de sessão, que é serializado em disco como código Lua no formato _SESSION['username']=[[valor]]. Como o atacante controla integralmente o conteúdo pós-\0, ele pode injetar ']]' para fechar prematuramente o literal Lua, seguido de instruções Lua arbitrárias, terminando com '--' para comentar a sintaxe residual e manter o arquivo sintaticamente válido.
Esse arquivo de sessão (.lua, salvo com nome de 64 caracteres hexadecimais no diretório session/) é interpretado — não apenas lido como dado — na próxima requisição que o servidor processa para aquela sessão, seja em dir.html ou qualquer outra página do fluxo autenticado. Nesse momento o código Lua injetado é executado no contexto do processo do servidor, e como Lua tem acesso a io.popen(), o atacante obtém execução de comando no sistema operacional subjacente com os privilégios do serviço FTP.
Cómo se explota
O vetor é uma requisição HTTP POST para o endpoint loginok.html, com o campo username contendo um nome de usuário válido seguido de %00 (byte nulo) e o payload Lua malicioso. O único pré-requisito de autenticação é conhecer o nome de um usuário existente — não a senha dele — e, na prática mais grave, uma conta anônima habilitada (comum em servidores FTP de compartilhamento público) já é suficiente, tornando o ataque efetivamente sem autenticação real. Depois do login malformado, uma segunda requisição qualquer (a qualquer página que carregue a sessão) dispara a deserialização do arquivo de sessão e a execução do código Lua injetado.
A complexidade técnica de descoberta foi alta — exigiu análise binária com debugger (Binary Ninja) para entender a discrepância entre lua_tolstring e strlen() — mas a exploração em si, uma vez conhecida, é trivial e determinística. A vulnerabilidade foi divulgada publicamente por Julien Ahrens (RCE Security) em 30 de junho de 2025, com escrita técnica completa do mecanismo. A Huntress observou exploração ativa em cliente já em 1º de julho de 2025 — um dia depois da publicação —, e a CISA incluiu a falha no catálogo KEV em 14/07/2025 com prazo de correção em 04/08/2025.
Em campanhas observadas, o payload Lua injetado decodifica uma string hexadecimal em um comando (via io.popen) que baixa e executa um binário adicional a partir de infraestrutura remota do atacante — ou seja, o RCE inicial é usado como estágio de entrega para carga secundária. O resultado final é controle total do processo do servidor e, por consequência, do host, dado que o serviço roda por padrão como root ou SYSTEM.
Versiones
Cómo protegerse
A correção do fornecedor está na versão 7.4.4, que trata corretamente o byte nulo no processamento do username e impede a injeção no arquivo de sessão. Atualizar é a única mitigação completa confirmada pelas fontes.
Como paliativo parcial quando a atualização não é imediata: desabilitar contas de acesso anônimo reduz a superfície de ataque não autenticado, mas não elimina a vulnerabilidade — qualquer conta válida (mesmo com senha correta desconhecida pelo atacante, já que a senha não é verificada no bypass) ainda permite exploração. Restringir o acesso de rede às interfaces web de usuário e administração (firewall, segmentação, VPN) impede a exploração remota, ao custo de limitar o acesso legítimo remoto ao painel.
Não há indicação nas fontes de que regra de WAF genérica bloqueie a falha de forma confiável, dado que o payload pode ser ofuscado/variado dentro do campo username; tratar isso como mitigação suficiente é o mito a evitar aqui. A atualização de versão continua sendo o único controle validado.
Cómo detectar
Nos logs do Wing FTP, em Log\Domains\\AAAA-M-D.log, uma tentativa de exploração aparece truncada de forma anômala: em vez da linha normal 'User 'usuario' logged in ok! (IP:x.x.x.x)', a entrada de log é cortada no meio, por exemplo 'User 'anonymous' sem aspa de fechamento e sem o restante da linha — evidência direta de que um byte nulo interrompeu a escrita do log. Isso ocorre tanto em tentativas de login que falham quanto nas que exploram a falha com sucesso, então deve ser cruzado com outros sinais.
A evidência mais confiável está nos próprios arquivos de sessão: no diretório session/ do Wing FTP, arquivos .lua com nome de 64 caracteres hexadecimais que sejam anormalmente grandes (uma sessão legítima contém apenas três linhas curtas com username, ipaddress e currentpath) indicam código Lua injetado — inclusive chamadas a io.popen e funções de decodificação hexadecimal do payload. Monitorar processos filhos inesperados gerados pelo processo do servidor (WFTPServer.exe no Windows, ou o processo equivalente no Linux), como cmd.exe, powershell ou shells, também é sinal forte de exploração já concretizada.