Um dos desenvolvedores de pacotes JavaScript realizou um experimento criando e hospedando no repositório NPM um pacote "everything", que abrange como dependências todos os pacotes existentes no repositório. Para implementar tal possibilidade, o pacote "everything" está ligado diretamente a cinco pacotes "@everything-registry/chunk-N", que por sua vez se conectam como dependências a mais de 3000 pacotes "sub-chunk-N", cada um dos quais se vincula a 800 pacotes existentes no repositório.
A publicação do "everything" no NPM levou a dois efeitos interessantes. Primeiro, o pacote "everything" se tornou uma espécie de ferramenta para realizar ataques DoS, já que tentar instalá-lo resulta no download de milhões de pacotes hospedados no NPM, esgotando o espaço em disco disponível ou interrompendo os processos de compilação. Estatísticas mostram que o pacote foi baixado cerca de 250 vezes, mas ninguém impede que ele seja adicionado como dependência a outro pacote após o comprometimento da conta do desenvolvedor para realizar uma sabotagem. Além disso, involuntariamente, alguns serviços e ferramentas que monitoram e verificam novos pacotes hospedados no NPM se tornaram vulneráveis ao ataque.
Em segundo lugar, a publicação do pacote "everything" bloqueou efetivamente a possibilidade de remoção de quaisquer pacotes no NPM que estivessem na lista de suas dependências. Um pacote no NPM só pode ser removido pelo autor se ainda não estiver sendo utilizado como dependência em outros pacotes, mas após a publicação do "everything", todas as dependências foram abrangidas por todos os pacotes no repositório. Curiosamente, a remoção do próprio pacote "everything" também foi bloqueada, uma vez que há 9 anos foi publicado um pacote de teste chamado "everything-else", no qual a string "everything" foi listada entre as dependências. Assim, o pacote "everything" após sua publicação acabou como dependência de outro pacote.
Fonte: opennet.ru
