"everything" impede desenvolvedores de removerem seus próprios pacotes npm
4 de Janeiro de 2024

Durante as férias, a biblioteca de pacotes npm foi inundada com mais de 3.000 pacotes, incluindo um chamado "everything", e outros chamados com uma variação da palavra.

O pacote é muito bem nomeado, pois ao baixar "everything" ele gradualmente puxará todos os pacotes npm que já foram publicados no registro npmjs.com para seu computador, podendo fazer com que ele fique sem armazenamento.

Mas essa é apenas a ponta do iceberg.

Se você está perguntando, "Mas quem iria instalar 'everything'?" - isso ignora um efeito colateral maior do pacote.

Uma vez que esses 3.000+ pacotes conseguem incluir todos os pacotes npm do registro npmjs.com como sua dependência, os autores de pacotes npm que já publicaram no registro npm agora não seriam capazes de remover seus pacotes à vontade, por causa da política do npm.

O que pode ter começado como uma brincadeira simples, acabou tendo repercussões maiores para todos os autores em todo o ecossistema npm.

Instalar "everything" poderia simplesmente fazer o seu computador ficar sem espaço de armazenamento e desacelerar, mas a mera existência do pacote em npmjs.com impede autores - não relacionados a este pacote - de despublicar seus pacotes do maior registro de software JavaScript do mundo.

O pacote "everything" tem apenas 5 subpacotes, publicados sob o escopo "@everything-registry", listados como suas dependências, conforme observado pelo BleepingComputer.

Esses 5 pacotes, no entanto, gradualmente conseguem puxar todos os pacotes presentes no registro inteiro como uma dependência.

Por exemplo, "everything" puxa "@everything-registry/chunk-2", que pode tentar puxar vários outros pacotes do mesmo autor, como "@everything-registry/sub-chunk-1623."

Cada um desses subpacotes (ou "chunks" como o autor os chama), inclui cerca de 800 projetos npm como sua dependência.

Considerando que o autor de "everything" publicou mais de 3.000 tais pacotes (chunks), cada um com centenas de dependências, um único comando `npm install everything`, começará a resolver o que se chama de dependências transitivas, e acabará baixando milhões de pacotes.

gdi2290 aka PatrickJS, por trás desta brincadeira, pediu desculpas por "quaisquer dificuldades que este pacote tenha causado", e contatou os administradores do npm para resolver o problema.

Uma foto preservada da discussão agora removida do GitHub é fornecida abaixo:

"Imagine que você fez um experimento, publicou um pacote no NPM e agora quer remover o seu pacote NPM.

Você não pode fazer isso se outros pacotes estão usando isso", escreve Jossef Harush, Chefe de Segurança de Cadeia de Fornecimento de Software na Checkmarx em um post no blog da empresa.

Harush, que rotulou esta campanha como "inferno das dependências", acrescenta: "O problema é que, desde que 'everything' depende de todos os pacotes (inclusive o seu), seu pacote fica preso, e há algum pacote desconhecido impedindo-o de removê-lo."

O pesquisador traçou comparações entre "everything" e o pacote "no-one-left-behind" publicado em janeiro de 2023 que tentou realizar a mesma façanha.

Ao contrário de alguns registros de software open-source como o Maven Central, que são imutáveis e normalmente impedem os autores de removerem seus componentes publicados, npm e PyPI tradicionalmente permitem que os desenvolvedores excluam, ou "puxem" suas versões à vontade.

Após um incidente em 2016, que envolveu o autor do left-pad removendo seu pacote npm em protesto e quebrando uma grande parte da internet, o npm tornou mais difícil para os autores despublicar pacotes.

Uma dessas mudanças na política, envolveu permitir que os autores despublicassem pacotes apenas se nenhum outro pacote no registro npm é dependente dele.

Ironicamente, essa política também deixou PatrickJS, o autor de "everything", incapaz de remover facilmente seus pacotes de brincadeira, devido à longa cadeia de dependências.

O BleepingComputer observou que, na manhã desta data, enquanto o "everything" continua a viver no registro, os milhares de pacotes "scoped" do "@everything-registry" usados por ele agora foram tornados privados, resolvendo potencialmente o problema.

Publicidade

Curso gratuito de Python

O curso Python Básico da Solyd oferece uma rápida aproximação à linguagem Python com diversos projetos práticos. Indo do zero absoluto até a construção de suas primeiras ferramentas. Tenha também suporte e certificado gratuitos. Saiba mais...