Skip to main content

O quanto realmente sabemos sobre o comportamento dos pacotes no registro do npm?

Escrito por
How much do you really know about the npm package registry

22 de abril de 2019

0 minutos de leitura

No Relatório sobre o Estado da Segurança de Código Aberto de 2019, compartilhamos detalhes sobre o crescimento dos repositórios de pacotes por linguagem nos últimos anos. Como mostramos, o npm fica em primeiro lugar todos os anos, com ampla vantagem.

Quando este artigo foi escrito, o npm contava com mais de 960 mil pacotes e registrou a adição de mais de 250 mil pacotes somente em 2018.

Diante disso, você já se perguntou o quanto sabe sobre o comportamento dos pacotes no ecossistema npm? Quantos pacotes estão conectados entre si?

Vamos explorar o maior registro de pacotes de código aberto da atualidade!

Em seu trabalho de pesquisa publicado recentemente, K. Vaidya, Ruturaj & De Carli, Lorenzo & Davidson, Drew & Rastogi, Vaibhav. (2019). Security Issues in Language-based Sofware [sic] Ecosystems, os autores estudam ataques de segurança a repositórios de linguagens de código aberto, como npm e PyPI, com foco principalmente em pacotes maliciosos e em como eles são afetados pelas características próprias de cada ecossistema de linguagem.

Achei o estudo muito interessante e quis transformar alguns dos dados da pesquisa em perguntas que pudesse publicar em um espaço aberto, como o Twitter, para entender como desenvolvedores JavaScript percebem a saúde dos pacotes e as conexões com outros pacotes no ecossistema npm.

Ideias equivocadas sobre os pacotes no registro do npm

Extraí pontos de dados desse artigo de pesquisa relacionados às perguntas a seguir, para publicá-las como uma enquete geral:

  1. Qual porcentagem dos pacotes no npm não tem dependências nem dependentes?

  2. Qual é a profundidade média de uma cadeia de dependências de pacotes no npm?

  3. Quantos pacotes no npm poderiam ser considerados *abandonados? (* com base em uma métrica como a falta de lançamentos nos últimos 12 meses)

Depois de escolher essas perguntas intrigantes, publiquei enquetes no Twitter e reuni as respostas.

Pacotes órfãos no npm

Primeira pergunta: Qual porcentagem dos pacotes no npm não tem dependências nem dependentes?

959.567? no npm
Qual porcentagem dos pacotes no #npm não tem dependências nem dependentes?#javascript #nodejs #npmjsCompartilhe, por favor!

— Liran Tal (@liran_tal) 15 de abril de 2019

A resposta correta é: 28% dos pacotes no npm não têm dependências nem dependentes.

Como podemos ver, 66% das pessoas acreditam que o registro do npm é uma rede muito complexa de conexões entre pacotes. No entanto, segundo o artigo de pesquisa, apenas 28% de todos os pacotes no registro do npm não têm dependências nem dependentes — opção escolhida por apenas 7% dos participantes.

No repositório PyPI, esse número sobe para 36%.

Profundidade das cadeias de dependências no npm

Segunda pergunta: Qual é a profundidade média de uma cadeia de dependências de pacotes no npm?

O #npmjs tem 961.600
A profundidade média de uma cadeia de dependências de pacotes no npm é:#javascript #nodejs #npmjsCompartilhe, por favor!

— Liran Tal (@liran_tal) 17 de abril de 2019

A resposta correta é: em média, a cadeia de dependências de pacotes no npm tem 4,39 pacotes de profundidade.

O relatório conclui que a profundidade da árvore de dependências — ou seja, o comprimento da cadeia de dependências mais longa — é, em média, superior a quatro pacotes. No PyPI, em comparação, esse número é de apenas 1,7.

Tabela 3 que compara os grafos de dependências de pacotes do npm e do PyPI por número de nós, grau de saída médio, tamanho da árvore de dependências e profundidade da árvore.

Podemos deduzir disso que desenvolvedores JavaScript preferem criar unidades de código menores e reutilizáveis e, de fato, reutilizá-las em vários projetos.

Pacotes abandonados no npm

Terceira pergunta: Quantos pacotes no npm poderiam ser considerados abandonados?

Mais uma enquete interessante!
Quantos pacotes no #npm poderiam ser considerados abandonados[1]?

[1] com base em uma métrica como a falta de lançamentos nos últimos 12 meses. Compartilhe, por favor. #javascript #nodejs #npmjs #opensource— Liran Tal (@liran_tal) 18 de abril de 2019

A resposta correta é: 61% dos pacotes no npm não tiveram nenhum lançamento nos últimos 12 meses.

Dando continuidade a pesquisas anteriores, este estudo definiu pacotes abandonados com base em uma métrica de lançamentos. Em outras palavras, um pacote era considerado abandonado quando seu responsável pela manutenção não publicava nenhum lançamento nos últimos 12 meses.

Não é fácil distinguir pacotes sem manutenção daqueles que já têm todos os recursos necessários e simplesmente chegaram a um estágio de maturidade que dispensa novos lançamentos. Embora alguns possam questionar essa métrica, os números são impressionantes.

O relatório identificou cerca de 496 mil pacotes no npm (de aproximadamente 801 mil na época do estudo) sem nenhum lançamento nos últimos 12 meses. Isso representa 61% dos pacotes no npm sem qualquer lançamento novo.

No repositório PyPI, o número é semelhante: 57% de todos os pacotes não tiveram nenhum lançamento nos últimos 12 meses.

Pacotes abandonados são baixados com menos frequência? Na verdade, não.

Como o relatório mostra, o total acumulado de downloads chega a bilhões em ambos os ecossistemas.

O gráfico a seguir lista 20 dos pacotes mais baixados que consideramos abandonados com base no relatório. Esses pacotes, como wordwrap e is-object, somam centenas de milhões de downloads por ano.

Gráfico de barras que mostra downloads de pacotes abandonados do npm, com wordwrap e lodash na liderança e valores geralmente decrescentes entre 20 pacotes.

Resumo

Com o crescimento do software de código aberto, podemos esperar mais estudos sobre repositórios públicos de pacotes por linguagem e sua segurança.

Gráfico de linhas que mostra o total de pacotes indexados no Maven Central, npm, NuGet, PyPI e RubyGems de janeiro de 2017 a janeiro de 2019.

O estudo conclui o seguinte:

  • Recomenda melhorias para repositórios de pacotes e gerenciadores de pacotes. Por exemplo, no contexto de ataques de typosquatting, recomenda-se alertar os usuários quando instalarem pacotes errados que não pretendiam instalar.

  • A natureza desses ecossistemas indica que eles são "terreno fértil para exploração, e o número de incidentes só aumentará no futuro", como afirma o relatório.

Use código aberto. Mantenha-se seguro.

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.