Skip to main content

Equipe de pesquisa da Snyk descobre vulnerabilidades graves de poluição de protótipo que afetam todas as versões do lodash

Escrito por

5 de julho de 2019

0 minutos de leitura

Em 2 de julho de 2019, a Snyk publicou uma vulnerabilidade de segurança de alta gravidade relacionada à poluição de protótipo (CVE-2019-10744), que afeta todas as versões do lodash. A descoberta foi resultado de uma análise em andamento conduzida pela equipe de pesquisa de segurança da Snyk.

ATUALIZAÇÃO: o lodash publicou a versão 4.17.12 em 9 de julho, que inclui as correções da Snyk e elimina a vulnerabilidade. Recomendamos fortemente que você atualize para a versão mais recente do lodash.

Até a publicação deste artigo, nenhuma correção oficial para essa vulnerabilidade havia sido disponibilizada. Os usuários da Snyk estão protegidos com a aplicação de um patch de segurança, disponibilizado para cerca de 50 mil projetos vulneráveis, que corrige a vulnerabilidade na versão mais recente do lodash, a 4.7.11.

Página do repositório lodash/lodash no GitHub, com abas de navegação e contagens de observadores, estrelas e forks

A popular biblioteca npm é usada por 4,35 milhões de projetos somente no GitHub. Com quase 40 mil estrelas no GitHub, ela é baixada mais de 80 milhões de vezes por mês. Não é preciso dizer que uma vulnerabilidade de alta gravidade em uma biblioteca tão popular quanto o lodash afeta uma grande parcela dos usuários de npm.

A Snyk abriu milhares de pull requests de correção automática para seus usuários, a fim de eliminar a vulnerabilidade. Confira abaixo mais detalhes sobre a vulnerabilidade e o que você deve fazer.

A notícia sobre essa vulnerabilidade de segurança recente no lodash veio à tona apenas três meses depois de termos relatado uma vulnerabilidade semelhante de poluição de protótipo na popularíssima biblioteca JavaScript de front-end jQuery.

Assim como outras vulnerabilidades de poluição de protótipo ([1], [2], [3], [4], [5]), uma implementação insegura de mesclagem recursiva de JSON pode permitir a alteração de Object no JavaScript, afetando outros tipos de dados por meio da cadeia de protótipos. As consequências dessas vulnerabilidades podem variar de injeção de propriedades a injeção de código e negação de serviço, dependendo do caso de uso afetado e da possibilidade de exploração da vulnerabilidade.

Já adicionamos a vulnerabilidade ao banco de dados da Snyk. Se a Snyk monitora seu projeto e identifica o pacote vulnerável, você já deve ter recebido nossos alertas automáticos. Caso contrário, teste o repositório do código da sua aplicação para verificar se ele é afetado pela versão vulnerável do lodash.

Sobre a vulnerabilidade de segurança do lodash

A função defaultsDeep poderia ser induzida a adicionar ou modificar propriedades de Object.prototype usando um payload constructor. Veja a seguir um exemplo do impacto dessa vulnerabilidade em uma aplicação JavaScript:


const mergeFn = require('lodash').defaultsDeep;
const payload = '{"constructor": {"prototype": {"a0": true}}}'

function check() {
    mergeFn({}, JSON.parse(payload));
    if (({})[`a0`] === true) {
        console.log(`Vulnerable to Prototype Pollution via ${payload}`);
    }
  }

check();

Depois de explicar os conceitos básicos de poluição de protótipo, podemos analisar a correção de segurança propriamente dita, que o engenheiro da Snyk Kirill enviou como pull request ao repositório da biblioteca JavaScript lodash no GitHub: https://github.com/lodash/lodash/pull/4336/files

Diferença de código que mostra alterações de segurança em safeGet e um teste unitário que impede a mesclagem indireta de propriedades de objetos

A correção inclui uma verificação de segurança para garantir que o objeto global não seja poluído com base em uma chave definida como constructor. Também foi adicionado um caso de teste para evitar regressões futuras.

Para saber mais sobre vulnerabilidades de poluição de protótipo e como elas funcionam, consulte nossa descrição da vulnerabilidade do lodash.

O que devo fazer

  • Se você já usa a Snyk para monitorar suas aplicações, sua proteção já foi ativada automaticamente com a aplicação do patch de segurança mencionado, enviado como pull request aos seus projetos afetados.

  • Se você não usa a Snyk, crie uma conta gratuita, adicione seus projetos e importe-os dos repositórios de código para o painel da Snyk. Depois de conferir os resultados da análise da Snyk, você pode pedir que a Snyk crie um pull request para corrigir a biblioteca lodash vulnerável aplicando um patch da Snyk.

  • No momento, não há uma correção manual simples. Quando uma nova versão do lodash com a correção for lançada, você deverá atualizar para ela.

A Snyk cria patches para vulnerabilidades de alto impacto, como a do lodash, que afeta milhões de projetos nos ecossistemas Node.js e JavaScript. Todos os patches são testados rigorosamente para garantir que funcionem corretamente nas versões compatíveis da biblioteca afetada.

Uma análise mais detalhada do processo de aplicação de patches da Snyk está disponível na página de documentação Como corrigir vulnerabilidades e nesta publicação do blog sobre De onde vêm as vulnerabilidades de segurança?, de Danny Grander, nosso diretor de segurança.

Observação: quando uma versão oficial do lodash com a correção dessa vulnerabilidade for lançada, os projetos monitorados pela Snyk — com ou sem patch aplicado — receberão automaticamente um pull request para atualizar para a versão oficial da biblioteca.

Divulgação responsável

A partir de uma pesquisa de segurança conduzida pela equipe da Snyk em abril de 2019, essa e outras vulnerabilidades que afetam o lodash foram divulgadas de forma responsável a John Dalton, responsável pela manutenção do lodash.

O processo incluiu uma colaboração com John em um repositório privado para confirmar nossas descobertas e as correções propostas pela Snyk para eliminar as vulnerabilidades. Kirill, um dos engenheiros de software da Snyk, participou do processo e abriu pull requests ([1],[2]) com as correções para o lodash. Ambos foram incorporados em 24 de junho.

Gostaríamos de agradecer a John por sua agilidade e receptividade à nossa ajuda durante todo o processo de resolução desse problema de segurança.

Se você acredita ter encontrado uma possível vulnerabilidade de segurança no Lodash, converse conosco por meio do nosso programa de divulgação de vulnerabilidades. Saiba mais em https://snyk.io/vulnerability-disclosure/

O pacote npm lodash em números

Primeira versão publicada há 7 anosÚltima versão: 4.7.11, publicada há 10 meses, em setembro de 2018Total de vulnerabilidades descobertas até hoje: 4 (2 de alta gravidade e 2 de gravidade média)

Infográfico com estatísticas sobre a integridade das dependências do Lodash, incluindo detalhes da versão, quatro vulnerabilidades e métricas de uso.

Comece a participar de desafios de Capture the Flag

Aprenda a resolver desafios de Capture the Flag assistindo sob demanda ao nosso workshop virtual introdutório.