
PoC em Python explorando o CVE-2026-19586, uma injeção de comandos não autenticada no TP-Link Omada SSL VPN que executa comandos arbitrários como root por meio de injeção no nome de usuário do OpenVPN.
TP-Link Omada SSL VPN RCE Não Autenticado (CVE-2026-19586)
Uma vulnerabilidade de injeção de comando (CWE-78) no caminho de autenticação do SSL VPN do firmware do gateway TP-Link Omada permite que um atacante não autenticado execute comandos arbitrários como root. Quando o servidor SSL VPN baseado em OpenVPN está habilitado, o OpenVPN passa o nome de usuário enviado pelo cliente que se conecta para /usr/sbin/checkpsw.sh, o script conectado à diretiva auth-user-pass-verify. Esse script insere o nome de usuário sem aspas em um programa awk, de modo que um nome de usuário contendo aspas duplas fecha o literal de string do awk no qual é colado e o restante é interpretado como código-fonte awk.
Um bloco BEGIN do awk é executado uma vez antes que a primeira linha de entrada seja lida, então a chamada system() injetada é executada antes que a senha enviada seja comparada com qualquer coisa, como root.
O servidor não exige certificado de cliente e não possui chave tls-auth ou tls-crypt, e seu certificado CA está embutido na imagem do firmware. O ca.crt neste repositório é esse certificado, e é idêntico em todos os dispositivos que executam o firmware afetado, então qualquer atacante que consiga alcançar a porta VPN pode completar o handshake TLS e alcançar a injeção sem credenciais e sem acesso prévio ao dispositivo.
O nome de usuário não pode conter espaços literais, porque o shell divide a expansão sem aspas em argumentos separados antes que o awk a veja. Use ${IFS} em seu lugar, que o shell invocado por system() expande de volta para um espaço. O OpenVPN limita o nome de usuário a 128 bytes; o esqueleto do payload usa 22 deles, deixando 106 para o comando.
Esta Prova de Conceito (PoC) foi testada contra o TP-Link Omada ER7212PC v2 (firmware 6.1.0.19). O script vulnerável é compartilhado em toda a linha de gateways Omada; caminhos, números de linha e comportamento podem diferir em outros modelos ou versões de firmware.
Esta PoC entrega um payload de nome de usuário que é executado como root no dispositivo alvo. Este problema foi reportado à TP-Link e corrigido nas versões de firmware listadas no aviso; execute isto apenas contra hardware que você possui ou está explicitamente autorizado a testar.
$ sudo python3 cve-2026-19586.py <target> -c '<command>'
O cliente openvpn é necessário, e deve ser executado como root, pois precisa de CAP_NET_ADMIN para criar o dispositivo tun. Este é um requisito do cliente OpenVPN local, não do alvo.
Exemplo de execução:
$ sudo python3 cve-2026-19586.py 10.0.0.100 -c 'id>/tmp/proof'
TP-Link Omada SSL VPN Unauthenticated RCE (CVE-2026-19586) - OpenVPN Username Injection
Target : 10.0.0.100:1194/udp
CA cert : ca.crt
Command : id>/tmp/proof
Username : x";BEGIN{system("id>/tmp/proof")};#
[*] Running: openvpn --client --dev tun --proto udp --remote 10.0.0.100 1194 --resolv-retry 1 --nobind --ca ca.crt --remote-cert-tls server --cipher AES-256-CBC --data-ciphers-fallback AES-256-CBC --reneg-sec 0 --auth-user-pass /tmp/ovpn_creds_m0ycjowy.txt --auth-nocache --verb 3
[openvpn client output]
O comando é executado no dispositivo antes que a autenticação seja concluída, então o próprio cliente OpenVPN não se conectará. A tentativa de autenticação falha e o cliente encerra, o que é esperado.
| Argumento | Descrição |
|---|
target | IP ou hostname do dispositivo alvo |
-c, --command | Comando a executar como root no alvo. Use ${IFS} no lugar de espaços |
-p, --port | Porta UDP do SSL VPN (padrão: 1194) |
--ca | Certificado CA extraído do firmware (padrão: ca.crt) |