2 pontos por GN⁺ 2025-12-30 | 1 comentários | Compartilhar no WhatsApp
  • MongoBleed (CVE-2025-14847) é uma vulnerabilidade grave de vazamento de memória presente em todas as versões do MongoDB desde 2017, permitindo que um invasor leia dados arbitrários da memória heap do banco de dados
  • A vulnerabilidade é causada por um bug no caminho de compressão zlib e pode ser explorada sem autenticação, bastando apenas conectar-se ao banco de dados
  • O invasor pode enviar uma requisição comprimida manipulada para induzir o servidor a alocar um buffer com tamanho incorreto, expondo a memória de operações anteriores (senhas, chaves de API etc.) contida nele
  • O MongoDB distribuiu um patch em 19 de dezembro de 2025, mas as versões EOL (3.6, 4.0, 4.2) não foram corrigidas
  • Essa vulnerabilidade, presente por 8 anos, afeta mais de 210 mil instâncias do MongoDB expostas à internet e exige aplicação imediata do patch ou desativação da compressão em ambientes de nuvem e on-premises

Visão geral do MongoBleed

  • MongoBleed (CVE-2025-14847) é uma vulnerabilidade encontrada no caminho de compressão de mensagens zlib 1 do MongoDB e afeta todas as versões desde 2017
    • Um invasor pode ler dados arbitrários da memória heap apenas conectando-se ao banco de dados, sem autenticação
    • Versões com fim de suporte (EOL), como MongoDB 3.6, 4.0 e 4.2, não foram corrigidas
  • O bug foi introduzido em um PR de maio de 2017 e foi divulgado oficialmente em 19 de dezembro de 2025
  • O MongoDB anunciou que aplicou patches a todas as instâncias, incluindo o serviço em nuvem Atlas

Estrutura de comunicação do MongoDB

  • O MongoDB usa seu próprio protocolo TCP em vez de HTTP, e as mensagens são transmitidas no formato BSON (Binary JSON)
  • Todas as requisições são compostas pelo comando OP_MSG e, quando comprimidas, são encapsuladas em uma mensagem OP_COMPRESSED
    • A mensagem inclui campos como uncompressedSize, originalOpcode e compressorId
    • uncompressedSize indica o tamanho esperado após a descompressão

Etapa 1 do exploit — alocação incorreta de buffer

  • O invasor define o valor de uncompressedSize como muito maior do que o real, fazendo o servidor alocar um buffer grande
    • Exemplo: declarar uma mensagem real de 1 KB como se tivesse 1 MB
  • Após a descompressão, o servidor MongoDB não valida o tamanho real e confia no valor fornecido pelo usuário
    • Como resultado, a memória fica com uma estrutura como [dados reais | lixo de heap não referenciado]
  • Como o MongoDB, baseado em C++, não inicializa a memória, essa área pode conter dados sensíveis de operações anteriores
    • Exemplo: senhas, tokens de sessão, chaves de API, dados de clientes, configurações do sistema etc.

Etapa 2 do exploit — vazamento de dados

  • O invasor envia uma entrada BSON malformada para induzir o servidor a interpretar os dados residuais da memória como string
    • O primeiro campo do BSON é uma string e segue a regra de string terminada em nulo (null-terminated string) da linguagem C
  • Se o invasor enviar uma string sem caractere nulo de terminação, o servidor continuará lendo outros dados da memória
    • Exemplo: [ { "a | password: 123\0 | apiKey: jA2sa | ip: 219.117.127.202 ]
  • O servidor interpreta isso como um campo BSON inválido e inclui esse conteúdo na mensagem de erro da resposta
    • "errmsg": "invalid BSON field name 'a | password: 123'"
  • Repetindo esse processo, o invasor pode varrer toda a memória heap e coletar informações sensíveis

Impacto e gravidade

  • Como ocorre na fase pré-autenticação (pre-auth), o invasor pode acessar dados sem fazer login
  • Instâncias do MongoDB expostas à internet ficam imediatamente em risco
    • Segundo buscas no Shodan, mais de 213 mil instâncias do MongoDB estão publicamente expostas
  • Trata-se de uma vulnerabilidade que existiu por cerca de 8 anos, de 2017 a 2025, e, por sua estrutura simples, tem alta probabilidade de exploração real
  • O MongoDB afirmou que “até o momento não há evidências de exploração”, mas não divulgou um pedido formal de desculpas nem uma linha do tempo detalhada

Mitigação

  • Atualizar para a versão com patch mais recente (8.0.17 ou superior)
  • No curto prazo, também é possível mitigar desativando a compressão de rede zlib
  • Usuários do MongoDB Atlas já receberam o patch

Informações adicionais e discussões relacionadas

Resumo

  • MongoBleed é uma vulnerabilidade de vazamento de memória causada por um bug no processamento de compressão zlib
  • Um invasor pode obter dados de memória anteriores (senhas, chaves de API etc.) por meio de uma requisição comprimida manipulada
  • Todas as versões do MongoDB entre 2017 e 2025 são afetadas, e aplicar o patch ou desativar a compressão é essencial
  • Mais de 210 mil instâncias expostas à internet são alvos potenciais
  • O MongoDB distribuiu um patch, mas houve críticas pela falta de suporte às versões EOL e demora na resposta pública

1 comentários

 
GN⁺ 2025-12-30
Comentários do Hacker News
  • Há alguns anos, modifiquei o alocador de memória (memory allocator) do runtime do Cloudflare Workers para sobrescrever toda a memória liberada com um padrão fixo de bytes ao fazer a liberação
    Graças a isso, a memória não inicializada deixou de conter dados significativos
    Eu esperava uma queda de desempenho, mas na prática não houve nenhum impacto mensurável
    Acho que todo mundo que usa linguagens sem segurança de memória deveria fazer isso. Esse bug do Mongo também poderia ter sido mitigado dessa forma
    • As versões recentes do macOS fazem zero-out automaticamente ao liberar memória
      Dizem que isso melhora a eficiência da compressão de memória e, em média, acaba até melhorando o desempenho
    • No FreeBSD, se você definir a variável de ambiente MALLOC_CONF=opt.junk=free, o malloc faz a mesma coisa
      Ou seja, muitas implementações já oferecem esse recurso como opção
    • Em 2025, acho que todo alocador genérico deveria inicializar a memória com zero por padrão
      Se precisar de mais desempenho, basta escrever um alocador customizado para um caso específico
      Isso também permitiria outras otimizações que não são possíveis no alocador do sistema
    • O OpenBSD preenche memória recém-alocada com 0xdb e memória liberada com 0xdf
      Isso ajuda a encontrar rapidamente bugs de use-before-initialization e use-after-free
      E isso já é o padrão
    • Fiquei curioso se isso equivale a ativar a opção init_on_free=1 do kernel
  • Parece que o autor não conhecia bem o processo interno de desenvolvimento do Mongo
    O Mongo é desenvolvido primeiro em um repositório privado e depois os commits são levados ao repositório público via Copybara
    A confusão com as datas surgiu nesse processo
    • Eu também não sabia. Achei estranho não haver revisão de PR, mas agora faz sentido
      Vou atualizar o texto para explicar isso e a diferença de datas
  • Parece que o autor entendeu mal a linha do tempo
    Nossos clusters Atlas já tinham sido atualizados alguns dias antes da divulgação do CVE
    • Obrigado. Atualizei o texto
  • Em sistemas como bancos de dados, fazer zeroing ou poisoning ao liberar memória é uma boa escolha
    Hoje em dia, a maioria dos alocadores deveria fazer isso por padrão
    Chris melhorou essa parte no Blink, e o resultado acabou se espalhando por todo o Chromium
    A documentação relacionada também é interessante
    Post do blog do Chromium
    Documentação do PartitionAlloc
  • Fico pensando com que frequência instâncias do Mongo ficam expostas à internet
    No mundo SQL é raro, mas às vezes acontece
    • Pela minha experiência, a razão de existir do MongoDB é a "preguiça"
      A filosofia é não precisar se preocupar com schema, durabilidade, leitura/escrita, conectividade e nada disso
      Então não surpreende que também não se preocupem com segurança
    • As 3 organizações “sérias” que conheço usam Mongo justamente para evitar projetar schema
      Essa atitude leva à mentalidade de “vamos fazer o que é mais cômodo agora”, e no fim isso se conecta a problemas de segurança como instâncias públicas de banco de dados
    • Acho essas opiniões extremas demais
      Na prática, é comum usar SQL e NoSQL juntos
      NoSQL tem pontos fortes em alta disponibilidade para grandes volumes de dados, e SQL é adequado para armazenar dados relacionais
      Por exemplo, iMessage e o sistema de matchmaking da EA também usam NoSQL
      No fim, os dois são necessários. Não é uma relação de competição, e sim de complemento
    • Segundo os resultados de busca do Shodan, há 213 mil instâncias de Mongo expostas
    • Expor um servidor SQL pode ter consequências ainda piores
      Por exemplo, o PostgreSQL pode obter permissões sobre o sistema inteiro só com a configuração padrão
      Por isso a maioria das pessoas entende bem o risco de um servidor SQL público
  • O MongoDB anunciou em 24 de dezembro que “não havia evidências de exploração do CVE”, mas é importante lembrar que “ausência de evidência não é evidência de ausência”
    • Nesse caso, o que você acha que eles deveriam ter dito?
  • Não consigo entender por que ainda usam Mongo
    • A replicação (replication) é fácil, e ele é mais rápido que o JSONB do Postgres
      Pessoalmente eu não gostaria de usar, mas há casos em que DynamoDB ou MongoDB fazem sentido tecnicamente
    • Também tem a piada de que usam porque é “web scale”
      Vídeo relacionado
    • Antigamente NoSQL estava na moda, mas no fim acabou convergindo para um simples banco key-value
    • Essa lógica é agressiva demais para eu aceitar
  • Isso lembra o otimismo de achar que o OWASP Top 10 vai resolver as principais vulnerabilidades
    Mas buffer overflow continua existindo desde 2003
    • No fim, foi como entregar uma footgun para todo mundo
      Esse tipo de problema vai se repetir para sempre, a menos que seja bloqueado no nível da linguagem
      Meus sentimentos aos desenvolvedores do Mongo
  • Toda vez que aparece um texto sobre NoSQL, fica claro que muitos “desenvolvedores” nunca lidaram com tráfego em grande escala
    • Dessa vez acho que isso é só com você mesmo
  • O MongoDB sempre foi bem ruim... mas era chamado de “webscale”
    Eu ainda acho melhor usar ToroDB ou o JSONB do PostgreSQL