Skip to main content

Execução arbitrária de código no Grunt

Escrito por
Blog illustrations vul profile feature

21 de setembro de 2020

0 minutos de leitura

Boas-vindas ao Perfil Mensal de Vulnerabilidades da Snyk. Nesta série, a Snyk revisita as vulnerabilidades descobertas por ou reportadas à nossaEquipe de Pesquisa de Segurança. Escolhemos uma vulnerabilidade de destaque do mês anterior e contamos a história por trás de sua descoberta, pesquisa e divulgação. Destacamos pesquisadores, desenvolvedores e usuários que ajudam a identificar e corrigir vulnerabilidades em toda a comunidade de código aberto.

Neste mês, vamos analisar uma vulnerabilidade de execução arbitrária de código descoberta no popular pacote JavaScript Grunt.


Vulnerabilidade: execução arbitrária de código em js-grunt

CVEs atribuídos: CVE-2020-7729

Analista da Snyk: George Gkitsas

Descoberta por: Equipe de Pesquisa da Snyk

A equipe de pesquisa da Snyk descobriu e divulgou uma vulnerabilidade de execução arbitrária de código no popular pacote Grunt para JavaScript.

Como parte de seus esforços contínuos para tornar o software de código aberto mais seguro, a equipe identifica padrões de práticas de programação inseguras que podem levar a vulnerabilidades. Ao identificar determinados padrões, ela pode criar regras que ferramentas como linters usam para analisar pacotes populares e verificar se essas vulnerabilidades estão presentes.

Foi assim que a vulnerabilidade de execução arbitrária de código no pacote Grunt foi identificada. Vamos conhecer melhor os detalhes da vulnerabilidade, como ela foi descoberta e como a equipe de pesquisa trabalhou com o mantenedor do pacote para garantir que ela fosse corrigida.

Entenda os detalhes da vulnerabilidade de execução arbitrária de código

George Gkitsas trabalhava no desenvolvimento de novas regras de linter para descobrir vulnerabilidades no ecossistema JavaScript. Nesse caso, George estava criando uma forma de detectar quando pacotes usam a função vulnerável load() do pacote js-yaml para analisar um documento yaml a partir de uma string. Uma versão mais recente e não vulnerável do método, chamada safeLoad(), é a forma recomendada de analisar essas strings.

George testou uma regra de linter que pudesse identificar esse padrão em pacotes JavaScript. Ao analisar os resultados e revisar a regra, ele conseguiu reduzir os falsos positivos a um nível aceitável, permitindo que ela fosse adicionada às verificações automatizadas que a Snyk executa regularmente para identificar pacotes potencialmente vulneráveis no ecossistema de código aberto.

A Snyk seleciona regularmente os 1.000 pacotes mais populares com base no número total de downloads e os verifica em busca de indícios de diversas vulnerabilidades. Nesse caso, o pacote Grunt foi sinalizado por usar a função load(). Mas, é claro, identificar um pacote com um linter automatizado não é suficiente.

O próximo passo é investigar o achado e confirmar que o código está realmente vulnerável e que a detecção não é um falso positivo. George conseguiu examinar facilmente o código identificado e confirmar que ele era, de fato, vulnerável. Mas a equipe de pesquisa não para por aí. Também é importante confirmar que a vulnerabilidade está em um trecho de código acessível e, portanto, explorável. Código vulnerável que não pode ser explorado de forma efetiva representa um risco muito menor. Por isso, George criou rapidamente uma prova de conceito e confirmou que o código era realmente vulnerável.

Trecho de código que mostra uma função JavaScript lendo e analisando um arquivo YAML com grunt.util.warn e tratamento de erros.

Confirmado: CVE-2020-7729

Depois de confirmar que o código vulnerável podia ser explorado, George atribuiu o identificador CVE-2020-7729 à vulnerabilidade e entrou em contato por e-mail com o mantenedor do pacote. Ele respondeu em menos de uma hora, demonstrando interesse em entender os detalhes da descoberta da Snyk. O mantenedor pediu mais informações e, posteriormente, confirmou que se tratava de uma vulnerabilidade.

No entanto, um aspecto que tornou essa situação diferente de outras vulnerabilidades normalmente descobertas foi o fato de o pacote Grunt ser uma ferramenta para desenvolvedores. Ele é um executor de tarefas que ajuda a automatizar tarefas repetitivas no processo de desenvolvimento. Por isso, a equipe de pesquisa precisou avaliar se havia um caso de uso em que alguém pudesse explorar o código como parte de um ataque. Depois de considerar as formas como os desenvolvedores usam o Grunt, George conseguiu confirmar com o mantenedor que havia um vetor de ataque viável.

Em menos de uma semana, o mantenedor lançou uma correção para o pacote Grunt. A versão 1.3.0 foi enviada ao GitHub em 17 de agosto de 2020. O novo código oferece a opção de usar o método anterior load() ou o método safeLoad(), conforme a situação e a funcionalidade necessária.

Com a versão atualizada já disponível, a Snyk publicou o CVE e o adicionou à Snyk Vulnerability Database. Mais de 2.000 projetos monitorados pela Snyk foram identificados como vulneráveis, e seus responsáveis foram notificados.

Diff de código mostrando alterações em uma função JavaScript que lê arquivos YAML e interpreta seu conteúdo.

O compromisso da Snyk com a segurança

Em última análise, a descoberta e a divulgação dessa vulnerabilidade mostram como o trabalho da equipe de pesquisa da Snyk ajuda a encontrar problemas de segurança em pacotes de código aberto com mais rapidez e eficiência. Os pesquisadores conseguiram identificar e confirmar não só a vulnerabilidade e sua possibilidade de exploração, mas também um vetor de ataque plausível que demonstrou o risco real. Esse é apenas um dos aspectos do compromisso da Snyk de capacitar desenvolvedores a manter a segurança enquanto usam código aberto em seus projetos.

Comece a jogar Capture the Flag

Aprenda a resolver desafios de Capture the Flag assistindo à gravação sob demanda do nosso workshop virtual introdutório.