← back
CVE-2025-47812criticalunder attackCWE-158

CVE-2025-47812

100Vexday Risk Score

Patch now. It under exploitation confirmed by CISA and has a working public exploit.

ssvc Actcvss 10epss 95%
from disclosure to weapon0 days
Published on NVDJul 10
1st PoCJul 1
metasploitJun 19
CISA KEV+4d
exploitation probability
95%top 1% of all CVEs
observed exploitation
yesCISA + VulnCheck
35 public exploit(s)
Action required by CISAfederal deadline: 2025-08-04

Apply mitigations per vendor instructions, follow applicable BOD 22-01 guidance for cloud services, or discontinue use of the product if mitigations are unavailable.

Summary

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.

Technical detail

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.

How it’s exploited

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.

Versions

Affected
Wing FTP Server anterior à versão 7.4.4 (todas as versões before 7.4.4, conforme descrição oficial do fornecedor).
Fixed in
Wing FTP Server 7.4.4 e posteriores.

How to protect

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.

How to detect

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.

Researched and written with AI from the vendor advisory and public analysis, with the sources above. Always confirm the fixed version in the official advisory before acting.
In Wing FTP Server before 7.4.4. the user and admin web interfaces mishandle '\0' bytes, ultimately allowing injection of arbitrary Lua code into user session files. This can be used to execute arbitrary system commands with the privileges of the FTP service (root or SYSTEM by default). This is thus a remote code execution vulnerability that guarantees a total server compromise. This is also exploitable via anonymous FTP accounts.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
public PoCs found35
exploitdbwww.exploit-db.com/exploits/52347unverifiedgithubgithub.com/4m3rr0r/CVE-2025-47812-poc54githubgithub.com/0xcan1337/CVE-2025-47812-poC13githubgithub.com/0xgh057r3c0n/CVE-2025-478123githubgithub.com/shadowgit30/CVE-2025-478122githubgithub.com/estebanzarate/CVE-2025-47812-Wing-FTP-Server-7.4.3-Unauthenticated-RCE-PoC2githubgithub.com/r0otk3r/CVE-2025-478122githubgithub.com/0xjuarez/CVE-2025-478121githubgithub.com/blindma1den/CVE-2025-478121githubgithub.com/rxerium/CVE-2025-478120githubgithub.com/dkstar11q/Blackash-CVE-2025-478120githubgithub.com/matesz44/CVE-2025-478120githubgithub.com/havbay/CVE-2025-47812-PoC0githubgithub.com/popyue/CVE-2025-478120githubgithub.com/Majdae/CVE-2025-47812-Research0githubgithub.com/H3XploR/Exploit_CVE-2025-478120githubgithub.com/0xS4N4TG/CVE-2025-478120githubgithub.com/ill-deed/WingFTP-CVE-2025-47812-illdeed0githubgithub.com/pevinkumar10/CVE-2025-478120githubgithub.com/CTY-Research-1/CVE-2025-47812_Lab_environment0vulncheckvulncheck.com/xdb/f118260e521cunverifiedvulncheckvulncheck.com/xdb/2c63fe5d51beunverifiedvulncheckvulncheck.com/xdb/9f7e42af062dunverifiedvulncheckvulncheck.com/xdb/68ce3e741d88unverifiedvulncheckvulncheck.com/xdb/98e8dff772a5unverifiedvulncheckvulncheck.com/xdb/30b88a8cb59dunverifiedvulncheckvulncheck.com/xdb/a15896ce1383unverifiedvulncheckvulncheck.com/xdb/23e4b000d2c3unverifiedvulncheckvulncheck.com/xdb/4193f154f69bunverifiedvulncheckvulncheck.com/xdb/429e43d983e8unverifiedvulncheckvulncheck.com/xdb/ef88dbe0a5bcunverifiedvulncheckvulncheck.com/xdb/8131cb80ed91unverifiedvulncheckvulncheck.com/xdb/61a1f71d6b7bunverifiedvulncheckvulncheck.com/xdb/f89d4ff48eb4unverifiedvulncheckvulncheck.com/xdb/330d9ad9e1adunverified
⚠ Public resources, to assess the exposure of systems you control or are authorized to test. Test only with authorization.