CVE-2019-12989
Corrija agora. Ela está sob exploração confirmada pelo CISA e tem exploit funcional público.
Apply updates per vendor instructions.
Resumo
SQL injection não autenticada no endpoint da API Nitro do Citrix SD-WAN (`/sdwan/nitro/v1/config/get_package_file`), que permite a um atacante remoto sem credenciais escrever arquivos arbitrários no sistema via `INTO OUTFILE` e, a partir daí, forjar um token de sessão válido — bypass completo de autenticação. É a porta de entrada de uma cadeia que termina em execução de comando como root quando combinada com CVE-2019-12991. Está no catálogo KEV da CISA com exploração confirmada, o que eleva a prioridade de patch bem além do que o CVSS sozinho sugeriria.
Detalhamento técnico
A falha (CWE-89) está no script Perl `getpackagefile.cgi`, que monta consultas SQL concatenando diretamente o parâmetro `site_name` recebido no corpo da requisição, sem sanitização ou uso de prepared statements. O trecho vulnerável identificado pela Tenable monta uma query do tipo `SELECT ... FROM Network_Appliance_Active WHERE site_name ='' AND appliance_id=;` — o atacante controla `site_name` e injeta uma cláusula `UNION SELECT ... INTO OUTFILE` para gravar conteúdo arbitrário em qualquer caminho onde o usuário `mysql` tenha permissão de escrita, incluindo `/tmp`.
O ponto crítico é que essa escrita arbitrária de arquivo é usada para forjar um arquivo de token de sessão (`swc-token`) diretamente no diretório esperado pela aplicação. Como o mecanismo de autenticação do painel de gerência confia na existência desse arquivo em disco, criar um token via SQLi equivale a autenticar-se sem jamais fornecer credenciais válidas. A requisição vulnerável exige o cabeçalho `SSL_CLIENT_VERIFY: SUCCESS`, o parâmetro `action=file_download` e `Content-Type: application/json`, condições triviais de satisfazer porque são controladas pelo próprio cliente HTTP, não pelo servidor.
A Tenable documentou outras queries na mesma rotina igualmente vulneráveis ao mesmo padrão de concatenação insegura, então a superfície de injeção não se limita a um único ponto de entrada dentro do script.
Como é explorada
O vetor é uma única requisição HTTP POST não autenticada contra a interface de gerência/API do appliance, sem necessidade de acesso prévio, conta válida ou configuração não padrão — basta acesso de rede à porta HTTPS de gerenciamento. O atacante injeta o payload SQL no campo `site_name` para gravar um arquivo de token no sistema de arquivos local do appliance (tipicamente em `/tmp`), depois acessa outro endpoint (`vwdash.cgi`) apresentando esse token forjado como parâmetro de sessão, obtendo uma sessão administrativa autenticada sem nunca ter tido credenciais.
A partir daí a cadeia de ataque documentada pela Tenable segue para CVE-2019-12991 (command injection autenticado em `installpatch.cgi`, parâmetro `installfile` passado sem validação a uma chamada `system()` do Perl), alcançando execução de comando como root. Ou seja, a SQLi por si só já entrega bypass de autenticação e escrita arbitrária de arquivo; combinada com a segunda falha, entrega controle total do appliance.
A presença no catálogo KEV da CISA confirma exploração ativa em ambiente real, e a existência de PoC pública e de template Nuclei tornam a detecção do ataque trivial de automatizar tanto para defensores quanto para atacantes — a barreira técnica para exploração é baixa.
Versões
Como se proteger
A correção do fornecedor é atualizar para Citrix SD-WAN 10.2.3 ou superior, ou NetScaler SD-WAN 10.0.8 ou superior, conforme o ramo em uso. Não há flag de configuração ou desativação de funcionalidade documentada como paliativo eficaz — a falha está na lógica de construção de query do script CGI, então qualquer mitigação sem patch depende de bloquear o acesso à API vulnerável.
Como controle compensatório enquanto o patch não é aplicado, restrinja o acesso à interface de gerenciamento/API Nitro (`/sdwan/nitro/v1/...`) apenas a redes de gerência confiáveis — isolamento de rede é a mitigação real disponível, já que o vetor exige alcançar essa interface via rede. Um WAF com regra específica para o padrão de injeção no parâmetro `site_name` reduz risco mas não fecha a falha, pois há outras queries vulneráveis no mesmo script além da documentada no PoC.
Não trate autenticação de rede (VPN, bastion) como substituto de patch permanente: como o próprio ataque é um bypass de autenticação, qualquer superfície residual acessível à interface vulnerável mantém o risco. A ação recomendada pela CISA no KEV é simplesmente aplicar a atualização do fornecedor.
Como detectar
Requisições HTTP POST para o endpoint `/sdwan/nitro/v1/config/get_package_file?action=file_download` contendo o cabeçalho `SSL_CLIENT_VERIFY: SUCCESS` combinado com sintaxe SQL (`UNION SELECT`, `INTO OUTFILE`) no corpo JSON, especialmente no campo `site_name`, são o indicador mais direto de tentativa de exploração — esse é exatamente o padrão do PoC público e do template Nuclei existente. Presença de arquivos inesperados em `/tmp` com nome relacionado a `token_` no appliance, ou logins no `vwdash.cgi` via parâmetro `swc-token` sem fluxo de autenticação normal precedente, são sinais de comprometimento pós-exploração.
Como o ataque não deixa rastro em logs de autenticação convencionais (a autenticação nunca ocorre de fato, é forjada), a ausência de eventos de login não indica ausência de exploração — a análise deve focar em logs de acesso HTTP do appliance e no conteúdo dos requests, não em logs de sessão.