Uma espiada da Snyk no relatório sobre o estado da segurança do código aberto no Node.js e no npm em 2019
9 de outubro de 2019
0 minutos de leituraNo Relatório sobre o Estado da Segurança do Código Aberto de 2019, buscamos avaliar o cenário da segurança do código aberto em diferentes ecossistemas de linguagens de programação. Para isso, analisamos as respostas de mais de 500 usuários e mantenedores de projetos de código aberto, que compartilharam informações sobre seus processos, seu conhecimento dos riscos de segurança do código aberto e o nível de habilidade do mantenedor médio.
Além das informações obtidas com os participantes da pesquisa, também analisamos dados de diversas fontes públicas e privadas, incluindo a Snyk Vulnerability Database, para avaliar como os problemas de segurança variam entre as linguagens, quanto tempo os usuários levam para adotar versões atualizadas com correções de segurança e muito mais. No relatório deste ano, também investigamos como as vulnerabilidades afetam quem usa Docker e o que você precisa saber para reduzir os riscos de segurança.
Faça um teste rápido para verificar se há vulnerabilidades conhecidas em repositórios públicos do GitHub e pacotes npm.
O ecossistema npm
Ao consultar a Snyk Vulnerability Database, identificamos vários tipos de vulnerabilidade com presença marcante e significativa nos ecossistemas JavaScript e Node.js. O primeiro grupo é o de travessia de caminhos e diretórios (Path and Directory Traversal), que se destaca no ecossistema npm, com números recordes em 2017 e 2018: 146 e 143 divulgações, respectivamente. Os outros ecossistemas estão bem atrás — ou será que estão na frente? De qualquer forma, ter menos vulnerabilidades relatadas é bom para eles!
Centenas dessas vulnerabilidades podem ser atribuídas ao trabalho de pesquisa em segurança realizado pela Snyk em colaboração com Liang Gong, pesquisador de segurança no Facebook e doutorando em ciência da computação em Berkeley. A pesquisa revelou dezenas de vulnerabilidades de travessia de diretórios no ecossistema npm. Além disso, mostrou que servidores web estáticos e dinâmicos são comuns no registro npm, pois atendem a uma necessidade recorrente em muitos casos de uso de desenvolvimento.

Outro tipo de vulnerabilidade interessante, quase exclusivo do Node.js, é a negação de serviço por expressão regular (ReDoS). Esse tipo de ataque explora vulnerabilidades de complexidade não linear no pior caso, às quais alguns padrões de regex podem levar. Em um ambiente de execução de thread único, isso pode ser devastador — por isso o Node.js é tão afetado por esse tipo de vulnerabilidade. É claro que esse cenário pode mudar com a crescente popularidade das tecnologias sem servidor. Em um modelo de pagamento por uso, um ataque ReDoS pode provocar o escalonamento dinâmico do sistema e gerar custos elevados para quem oferece o serviço — talvez até uma situação de negação de financiamento!
O ambiente de execução Node.js é conhecido por seus muitos pontos fortes. O loop de eventos de thread único é um deles, mas também pode ser seu ponto mais fraco quando usado incorretamente. Isso acontece com mais frequência do que você imagina. Em março de 2018, uma atualização de segurança do ambiente de execução oficial do Node.js incluiu uma correção para uma vulnerabilidade ReDoS de alta gravidade no módulo de caminhos principal, que afetava as versões da linha Node.js 4.x. A correção para a vulnerabilidade, descoberta por James Davis, da Virginia Tech, também foi incluída no Node.js 6.x e em versões posteriores para mitigar o problema.
Para mostrar como essa vulnerabilidade é característica do Node.js, analisamos outros ecossistemas entre 2016 e 2019 e descobrimos que apenas uma vulnerabilidade ReDoS foi relatada no PHP, em 2017. Nos ecossistemas Java e Ruby, uma vulnerabilidade foi relatada em cada um deles, em 2018. Já no Node.js, foram relatadas 116 vulnerabilidades no total nos últimos três anos, e o ritmo de divulgação está aumentando. Ainda assim, é importante distinguir entre as vulnerabilidades existentes no código e aquelas que são efetivamente relatadas. Esses números não mostram quantas vulnerabilidades foram introduzidas nas bases de código nesse período, mas sim quantas foram descobertas e eliminadas. Também poderíamos ter olhado para este gráfico e ficado satisfeitos por ver que há um foco maior em encontrar e eliminar vulnerabilidades ReDoS, pois isso significa que provavelmente veremos menos problemas em ambientes reais daqui para a frente.

Continue lendo para conhecer outras descobertas do relatório e confira o novo Relatório sobre o Estado da Segurança do Código Aberto de 2020!