Skip to main content

Vulnerabilidades de ReDoS no npm aumentam 143%, e XSS continua crescendo

Escrito por
the state op open source small

26 de fevereiro de 2019

0 minutos de leitura

Boas-vindas ao relatório anual State of Open Source Security 2019 da Snyk. Este relatório está dividido em várias publicações:

Ou baixe nosso PDF caprichado, feito à mão, que reúne todas essas informações e muito mais em um só lugar.

Baixe o relatório State of Open Source Security 2019

Negação de serviço por expressão regular

O ambiente de execução do Node.js é conhecido por seus muitos pontos fortes, mas um deles — o Event Loop de thread única — também pode ser seu ponto mais fraco se não for usado corretamente. Isso acontece com mais frequência do que se imagina.

Os ataques de negação de serviço por expressão regular (ReDoS) exploram vulnerabilidades de complexidade não linear no pior caso, que podem ser causadas por alguns padrões regex. Em um ambiente de execução com thread única, isso pode ter consequências devastadoras. Por isso, o Node.js é bastante afetado por esse tipo de vulnerabilidade.

Descobrimos que o número de vulnerabilidades de ReDoS divulgadas cresceu nos últimos três anos, com um aumento de 143% somente em 2018.

Gráfico de linhas intitulado “Divulgações de vulnerabilidades de negação de serviço por expressão regular (ReDoS) em alta”, com aumento de cerca de 14 em 2016 para 72 em 2018.

Vulnerabilidades de XSS

Os ataques de Cross-site Scripting (XSS) são um problema cada vez maior para aplicações web, e observamos um pico nas vulnerabilidades de XSS em 2018 em todos os ecossistemas monitorados pela Snyk. 

As vulnerabilidades de XSS em bibliotecas de código aberto continuam aumentando, apesar de serem uma das principais preocupações da OWASP há mais de 15 anos

Entre esses ecossistemas, detectamos o maior número de vulnerabilidades de XSS no npm, com 225 divulgações no total; em seguida vieram o Maven Central Repository, com 167, e o PyPI, com 163 vulnerabilidades de cross-site scripting. Em 2018, o ecossistema PHP Packagist divulgou o maior número, com 56 vulnerabilidades de XSS, seguido pelo npm, com 54, e pelo Maven Central, com 29.

Gráfico de linhas mostrando o aumento das vulnerabilidades de XSS de cerca de 80 em 2014 para 175 em 2018, com oscilações entre 2015 e 2017.

Path Traversal

As vulnerabilidades de path e directory traversal se destacam no ecossistema npm, com números recordes de 146 e 143 divulgações em 2017 e 2018, respectivamente. Os outros ecossistemas ficaram bem atrás, o que é uma boa notícia!

É possível supor que isso se deva à grande quantidade de servidores web estáticos e dinâmicos criados com Node.js para uso em produção e desenvolvimento e, consequentemente, ao número muito maior de pacotes nos quais esse tipo de vulnerabilidade também pode ser encontrado.

Gráfico de barras sobre vulnerabilidades de travessia de diretório no RubyGems, PHP Packagist, PyPI, Maven Central e npm de 2016 a 2018.

Vulnerabilidades de injeção de SQL

Outro vetor de ataque comum, que aparece de forma recorrente entre as 10 principais ameaças da OWASP há mais de uma década, é o CWE-89, mais conhecido como injeção de SQL.

Ao analisar os últimos três anos, vemos que cada um dos três principais ecossistemas avaliados teve seu pico em um ano diferente. As bibliotecas Maven lideraram o número de vulnerabilidades de injeção de SQL divulgadas em 2016 e 2017, seguidas pelas bibliotecas PHP Packagist, que atingiram o pico em 2018.

Gráfico de barras das divulgações de injeção de SQL por ecossistema e ano: npm 3, 0, 4; Maven Central 8, 6, 2; PHP Packagist 4, 5, 16.

Exposição de informações confidenciais

Ao analisar os repositórios Maven Central e PHP Packagist, descobrimos que eles tiveram o maior número de vulnerabilidades relacionadas à exposição de informações, com picos em 2018 nos dois ecossistemas.

A exposição de informações muitas vezes acontece sem intenção. Ela ocorre quando um programa ou sistema divulga informações potencialmente confidenciais, como nomes e valores de variáveis de ambiente. Casos de exposição de informações também podem ocorrer “por design”, como quando dados confidenciais são fornecidos em parâmetros de URL.

Alguns exemplos de vulnerabilidades de exposição de informações no repositório Maven Central estão nos pacotes apache spark, jenkins core e keyclock-saml-core. O plugin de CI jenkins ssh-agent, por exemplo, expôs a chave privada SSH nos logs de build, que podiam ser acessados por qualquer pessoa com permissão de leitura.

O repositório PyPI também tem muitas vulnerabilidades em bibliotecas, incluindo casos de exposição de informações. Pacotes como django exibiam o hash da senha de um usuário para administradores que tinham apenas permissão de visualização. O pacote djangorestframework-api-key armazenava chaves de API em texto simples.

Gráfico de barras de vulnerabilidades de exposição de informações confidenciais em ecossistemas Java de 2016 a 2018; o Maven Central apresenta os maiores números, chegando a 53 em 2018.

Transmissão em texto simples de informações confidenciais

Por fim, outra vulnerabilidade específica do ecossistema npm que merece destaque é a CWE-319, também conhecida como transmissão em texto simples de informações confidenciais, na qual recursos são acessados por protocolos inseguros. Encontramos 44 novas vulnerabilidades divulgadas em pacotes de 2016. Esse número subiu para expressivos 110 pacotes em 2017, um aumento de 250%. 

"O nível de segurança de um ecossistema e a percepção pública sobre ele costumam ser muito diferentes. A falta de tipagem em JavaScript disseminou a ideia de que essa é uma linguagem insegura por causa da manipulação de tipos. Ainda assim, nos últimos anos, o número de vulnerabilidades descobertas em módulos npm foi menor do que o de vulnerabilidades encontradas no Maven Central. Ao mesmo tempo, algumas vulnerabilidades podem ter consequências mais graves porque o Node.js ainda é single-threaded. ReDoS (ou outros ataques de negação de serviço por esgotamento da CPU), muito mais comuns no universo Node.js, é um exemplo disso. Esperamos que os Worker Threads em breve permitam reduzir esses riscos no Node.js. Nos últimos anos, a comunidade de segurança do Node.js tem se tornado cada vez mais ativa, e podemos continuar trabalhando para tornar o ecossistema mais seguro no futuro."

Vladimir de Turckheim

Node.js Foundation, Node.js Security Working Group

Em destaque: pacotes maliciosos

Talvez você já tenha ouvido falar de pacotes maliciosos em diferentes contextos, como um contêiner Docker malicioso ou um pacote malicioso em um registro público de algum ecossistema. Também já falamos sobre desenvolvedores como meio de disseminação de malware em outros contextos, como o malware Induc, que infectava compiladores Delphi, e o XCodeGhost, que tinha como alvo desenvolvedores de iOS e OSx.

No entanto, nem todos os pacotes maliciosos são iguais. De modo geral, podemos classificá-los da seguinte forma quando se trata de registros de ecossistemas:

  • um ataque de typosquatting, em que um pacote malicioso usa um nome muito parecido com o de um pacote mais popular

  • o comprometimento da conta de CI ou do registro de quem mantém o pacote, que resulta na publicação de uma versão maliciosa, ou a presença de um pacote malicioso na lista de dependências de um projeto

  • a inclusão de um pacote malicioso (ou que se tornará malicioso após a inclusão) na lista de dependências de um projeto por meio de engenharia social

Em 2018, vimos todos esses tipos de pacotes maliciosos no ecossistema npm, conhecido por ser um dos registros mais afetados por pacotes maliciosos. O pacote que ganhou destaque na mídia em dezembro de 2018 foi o event-stream. Ele dependia de um pacote malicioso, introduzido por meio de uma tentativa aparentemente inocente de contribuir com um projeto de código aberto.

Esse ataque afetou impressionantes 8 milhões de downloads do pacote malicioso em apenas dois meses. Outro exemplo de 2018 é o pacote ESLint- scope, cuja conta de quem o mantinha foi comprometida. Também identificamos um total de 11 ataques de typosquatting com pacotes maliciosos publicados no registro npm em 2018. 

Em 2018, um pacote malicioso foi baixado um número recorde de 8 milhões de vezes. Ele foi um dos 25 ataques de typosquatting no npm e no PyPI

Além das tentativas comuns de typosquatting que já víamos, também observamos ataques mais sofisticados contra o ecossistema npm do que nos anos anteriores, como o ataque ao ESLint-scope. Com um nível de sofisticação muito maior, o incidente do event-stream revelou um grau elevado de conhecimento técnico e de direcionamento dos ataques, superior ao que já havíamos visto em outras tentativas maliciosas no ecossistema.

Em contraste com o registro npm, os únicos outros registros em que identificamos pacotes maliciosos foram o RubyGems, com apenas um pacote malicioso em 2018, e o Python, com dez pacotes maliciosos em 2017 e treze em 2018.

Continue lendo:

Comece a resolver desafios de capture the flag

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