CVE-2026-91997 na Evolution API: o /metrics exposto e como se proteger

João Rangel5 de novembro de 20265 min de leitura

Neste artigo
Capa CVE-2026-91997 na Evolution API: o /metrics exposto e como se proteger

A CVE-2026-91997 afeta a Evolution API até a versão 2.3.7, a última estável. A falha está no filtro de IPs que deveria proteger o endpoint /metrics: por um erro de comparação, ele nunca bloqueia ninguém. Quem habilitou as métricas do Prometheus e confiou só nessa lista de IPs deixou o endpoint aberto para qualquer pessoa na internet. A severidade é média (CVSS 5.3) e não há execução de código, mas o vazamento entrega informações úteis para um ataque mais sério. Neste guia mostramos onde está o erro, como saber se você é afetado e como se proteger enquanto não sai uma versão estável corrigida.

O que é a CVE-2026-91997

A Evolution API pode expor métricas no formato do Prometheus em /metrics. O recurso vem desligado (PROMETHEUS_METRICS=false) e, quando ligado, aceita duas proteções independentes:

  • Lista de IPs (METRICS_ALLOWED_IPS): só os endereços listados deveriam acessar.
  • Autenticação básica (METRICS_AUTH_REQUIRED, METRICS_USER e METRICS_PASSWORD).

A vulnerabilidade está na primeira. O middleware compara o resultado de um filter(), que é um array, com o número zero:

if (allowedIPs.filter((ip) => clientIPs.includes(ip)) === 0) {
  return res.status(403).send('Forbidden: IP not allowed');
}

Um array nunca é estritamente igual a 0, então a condição é sempre falsa e a requisição segue adiante, venha de onde vier. A comparação correta seria com o tamanho do array (.length === 0). A falha foi publicada em 15/09/2026 e classificada como CWE-697 (comparação incorreta).

O que um atacante consegue ver

O /metrics não permite alterar nada, mas revela:

  • a versão da Evolution API em uso, o que ajuda a escolher outras falhas conhecidas para explorar;
  • o nome do cliente do banco de dados configurado;
  • a URL configurada do servidor;
  • detalhes das instâncias de WhatsApp conectadas.

É um vazamento de informação (confidencialidade baixa, sem impacto em integridade ou disponibilidade). O risco real é servir de reconhecimento para o próximo passo de um ataque.

Você está vulnerável?

Você só é afetado se as três condições forem verdadeiras:

  1. usa a Evolution API até a 2.3.7;
  2. ligou as métricas (PROMETHEUS_METRICS=true). Com o padrão false, a rota /metrics nem é registrada;
  3. protegeu o endpoint só com METRICS_ALLOWED_IPS, sem METRICS_AUTH_REQUIRED=true.

Para conferir na prática, faça a requisição a partir de uma máquina que não está na lista de IPs permitidos:

curl -i https://sua-evolution.exemplo.com/metrics

Se a resposta for 200 com as métricas no corpo, o endpoint está exposto. O esperado é 401 (autenticação exigida), 403 (bloqueado no proxy) ou 404 (métricas desligadas).

Ainda não há versão estável corrigida

A última versão estável é a 2.3.7, de dezembro de 2025. Até a publicação deste artigo, as versões publicadas depois dela são apenas candidatas (2.4.0-rc1 e 2.4.0-rc2), e o trecho vulnerável continua igual na rc2. Atualizar a versão, portanto, não resolve: a proteção hoje depende de configuração.

Como se proteger: passo a passo

  1. Desligue as métricas se não usa. Defina PROMETHEUS_METRICS=false (o padrão) e reinicie. Sem a rota, não há o que explorar.
  2. Se usa, exija autenticação. A autenticação básica funciona de forma independente do filtro quebrado:
    PROMETHEUS_METRICS=true
    METRICS_AUTH_REQUIRED=true
    METRICS_USER=prometheus
    METRICS_PASSWORD=uma-senha-longa-e-aleatoria
    Configure as mesmas credenciais no scrape_config do Prometheus (basic_auth).
  3. Bloqueie o /metrics na borda. No proxy reverso, negue a rota para quem vem de fora. No Nginx, por exemplo:
    location = /metrics {
      allow 10.0.0.0/8;   # rede do Prometheus
      deny all;
    }
  4. Tire a API da internet quando possível. Se só os seus sistemas falam com a Evolution, publique-a apenas na rede interna (VPC, rede do Docker ou Service interno no Kubernetes) e não no proxy público.
  5. Teste de novo com o curl acima, de fora da rede, e confirme que não volta 200.
  6. Procure acessos antigos. Busque requisições a /metrics vindas de IPs desconhecidos nos logs do proxy. Se houver, trate a URL do servidor e os nomes das instâncias como informação já conhecida e revise as demais proteções da API (chave AUTHENTICATION_API_KEY forte e trocada, por exemplo).
  7. Acompanhe o projeto. Quando sair uma versão estável com a comparação corrigida, atualize. Quem mantém imagem própria pode aplicar a correção de uma linha (.length === 0) até lá.

Como tratamos na Hcode

Usamos a Evolution API para as integrações de WhatsApp do Hub. A instância não tem rota pública: só os nossos sistemas a acessam, pela rede interna do cluster, então o /metrics não é alcançável de fora independentemente da configuração. Além disso, rodamos uma imagem própria da Evolution com as dependências corrigidas e passamos todas as imagens de produção por um scan diário de vulnerabilidades. É a mesma ideia que recomendamos acima: não depender de uma única barreira.

Erros comuns

  • Confiar só na lista de IPs. É exatamente a proteção que não funciona nesta falha.
  • Ligar as métricas para um teste e esquecer. Revise o .env e as variáveis do container em produção.
  • Esperar resolver atualizando. Até agora não há versão estável corrigida; a mitigação é configuração e rede.
  • Expor a API inteira na internet quando só sistemas internos a usam.

Perguntas frequentes

A CVE-2026-91997 permite executar comandos no servidor?

Não. Ela permite apenas ler o endpoint /metrics, que expõe versão, cliente do banco, URL do servidor e dados das instâncias. A severidade é média (CVSS 5.3).

Estou com as métricas desligadas. Preciso fazer algo?

Não para esta falha: com PROMETHEUS_METRICS=false a rota não existe. Vale só confirmar que a variável está assim em produção.

Atualizar para a 2.4.0 resolve?

Não por enquanto. A 2.4.0 ainda está em release candidate e o trecho vulnerável continua igual na 2.4.0-rc2. Use as mitigações acima.

A autenticação básica das métricas também está quebrada?

Não. A falha está só no filtro de IPs. Com METRICS_AUTH_REQUIRED=true e usuário e senha definidos, o endpoint exige credenciais normalmente.

Conclusão

A CVE-2026-91997 é um erro pequeno de código com um efeito claro: a lista de IPs do /metrics da Evolution API não protege nada. Se as métricas estão desligadas, você não é afetado. Se estão ligadas, exija autenticação, bloqueie a rota no proxy e, sempre que puder, mantenha a API fora da internet. Para se aprofundar em segurança de APIs e infraestrutura, conheça os cursos da plataforma da Hcode.

Fontes

Continue aprendendo com a Hcode

Cadastre-se na plataforma de cursos e acompanhe os próximos guias do blog.