CVE-2019-9621
Patch now. It under exploitation confirmed by CISA and has a working public exploit.
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
Vulnerabilidade de Server-Side Request Forgery (SSRF) no componente ProxyServlet do Zimbra Collaboration Suite, que permite a um atacante fazer o próprio servidor Zimbra encaminhar requisições para portas e serviços internos — inclusive a porta administrativa 7071 — normalmente inacessíveis externamente. Sozinha ela exige um token de autenticação válido, mas ganhou notoriedade por ser a peça central de uma cadeia pré-autenticação (junto com a XXE CVE-2019-9670) que resulta em execução remota de código. Está no catálogo KEV da CISA, tem módulo Metasploit público e exploração confirmada em ambientes reais.
Technical detail
O bug está em ProxyServlet.doProxy(), responsável por encaminhar (proxy) requisições HTTP para outros destinos dentro da infraestrutura Zimbra. O código deveria restringir esse encaminhamento a um conjunto de domínios/portas permitidos, exceto quando a requisição vem de um administrador — e é aí que a lógica falha. Classificado pelo próprio Zimbra como CWE-918 (SSRF) / CWE-807 (dependência de dado não confiável para decisão de segurança).
O primeiro problema: para decidir se a requisição é 'de admin', o servlet usa ServletRequest.getServerPort(), método que no Java Servlet API retorna a porta declarada no header Host da requisição — um valor totalmente controlado pelo cliente, não a porta real de conexão TCP. Um atacante que envia um header como 'Host: algumacoisa:7071' faz o servidor crer que a requisição chegou pela porta administrativa, mesmo tendo sido enviada pela porta pública normal.
O segundo problema: a verificação do token de admin só ocorre quando ele é passado como parâmetro de URL — mas nada impede que o token seja enviado via cookie, contornando essa checagem. Combinando os dois defeitos, um requisitante com qualquer token de usuário válido (não necessariamente de admin) e um Host header manipulado consegue fazer o ProxyServlet encaminhar requisições arbitrárias a serviços internos do próprio host Zimbra, incluindo a interface administrativa na porta 7071, que normalmente está bloqueada de acesso externo por rede.
O valor real da falha aparece na cadeia documentada por An Trinh (pesquisador, blog tint0): usando a XXE do Autodiscover Servlet (CVE-2019-9670) para ler o localconfig.xml e obter a senha LDAP da conta interna 'zimbra', é possível gerar um token de usuário comum via um truque no AuthRequest SOAP (usar 'adminName' em vez de 'name' para autenticar contra a conta zimbra pela branch normal de usuários). Esse token — sem privilégio de admin — é então usado com a SSRF do ProxyServlet para reencaminhar um AuthRequest de admin para a porta 7071 local, obtendo aí um cookie de administração global. Com esse cookie, a extensão ClientUploader permite subir um webshell JSP e executar comandos no host.
How it’s exploited
Isoladamente, o SSRF exige que o atacante já possua um token de sessão válido (de qualquer usuário, não necessariamente admin) e capacidade de manipular o header Host e o cookie da requisição HTTP contra o ProxyServlet exposto na interface web pública — não há necessidade de acesso de rede à porta 7071, que é justamente o que a falha contorna. Não é necessária configuração não padrão: o ProxyServlet é parte do fluxo normal do webapp.
Na prática documentada e na cadeia usada por ferramentas públicas (Metasploit, PoCs, template Nuclei), a exploração completa não exige autenticação prévia alguma: o atacante começa lendo o localconfig.xml via XXE (CVE-2019-9670) para obter as credenciais da conta zimbra, gera um token de usuário através do truque no AuthRequest, e só então usa esta SSRF para escalar esse token a um cookie de admin via a porta 7071 local. O resultado final é execução remota de código não autenticada, via upload de webshell pela extensão ClientUploader — daí a classificação no Metasploit como 'excellent' ranking e a listagem no KEV da CISA.
Complexidade de exploração é baixa depois de compreendido o encadeamento (é a base do módulo público exploit/linux/http/zimbra_xxe_rce), mas a SSRF por si só, sem a XXE associada e sem um token prévio, tem valor limitado — o atacante precisa de algum crédito de autenticação primeiro. É a combinação com CVE-2019-9670 que transforma isso em RCE pré-autenticação total.
Versions
How to protect
A correção do fornecedor está nas versões de patch específicas: 8.6 Patch 13, 8.7.11 Patch 10, 8.8.10 Patch 7 e 8.8.11 Patch 3 (ou versões posteriores dentro de cada ramo). Zimbra confirmou em respostas de suporte que 8.8.9 Patch 10 também é seguro. Versões 8.6.0 e anteriores estão fora de suporte — não há patch backport garantido além do Patch 13 citado, e o fornecedor recomenda migração para pelo menos 8.7.11 com o patch aplicável.
Se a atualização não for imediatamente viável, bloquear acesso externo à porta 7071 NÃO mitiga sozinho essa falha específica — o próprio mecanismo do bug é fazer o servidor Zimbra, a partir de dentro, se conectar à sua própria porta administrativa via loopback, contornando qualquer controle de firewall perimetral nessa porta. Um controle compensatório real precisa atuar na camada de aplicação: um WAF ou proxy reverso capaz de normalizar/validar o header Host antes de repassá-lo ao Zimbra (rejeitando valores com porta diferente da porta real de conexão) reduz a superfície, mas é paliativo imperfeito e não substitui o patch, já que a lógica de verificação de admin do próprio ProxyServlet é o que está quebrado.
Como a exploração real depende de encadear esta falha com a XXE do Autodiscover Servlet (CVE-2019-9670), corrigir só uma das duas ainda deixa risco residual — os patches acima corrigem ambas simultaneamente, então a mitigação eficaz é sempre a atualização completa para a versão/patch indicada, não uma correção isolada.
How to detect
Nos logs de acesso do Zimbra, procure requisições ao ProxyServlet (rota típica /service/proxy ou equivalente conforme a versão) com headers Host contendo uma porta diferente da porta real em que o serviço público escuta — por exemplo, um Host apontando para ':7071' em uma requisição que chegou pela porta pública (80/443). Isso é o indicador mais direto e específico dessa falha, já que é exatamente o mecanismo de bypass.
Como a exploração completa documentada encadeia esta SSRF com a XXE de CVE-2019-9670, também vale monitorar requisições ao Autodiscover Servlet contendo entidades XML externas (DOCTYPE/ENTITY) e uploads subsequentes via a extensão ClientUploader — a presença de um webshell JSP recém-criado em diretórios de upload do Zimbra é sinal de comprometimento já consumado, não apenas de tentativa.