Recentemente o npm-registry teve um incidente que deixou uma grande quantidade de pacotes altamente dependentes, como o require-from-string, indisponíveis. Embora o incidente tenha sido relativamente simples de resolver, descobriu-se uma grande vulnerabilidade de segurança que poderia ter sido explorada para injetar código malicioso em projetos usando o npm.
De acordo com o relatório oficial, a causa raiz deste incidente foi um erro de decisão ao remover o usuário floatdrop e tornar todos os seus pacotes indisponíveis e bloqueados. Esta decisão foi impulsionada pela publicação de um pacote contendo spam que também incluiu o README para um pacote legítimo do floatdrop. Devido aos READMEs iguais, o sistema anti-spam do npm marcou o floatdrop como spammer, o que levou à remoção do usuário e de todos os seus pacotes.
A equipe do npm rapidamente descobriu que floatdrop era um usuário legítimo e que alguns de seus pacotes eram muito utilizados agindo rapidamente para restaurá-los. Porém, no espaço de tempo necessário para isso, vários pacotes com o mesmo nome que os removidos foram publicados e instalados um número de vezes não especificado.
Ainda que a equipe do npm tenha confirmado que estes pacotes não eram maliciosos, incidentes assim poderiam ser explorados para injetar código malicioso em projetos usando npm. É importante lembrar que o npm tem uma política que previne a exclusão de pacotes em menos de 24 horas após a publicação visando tornar impossível o reuso dos nomes destes pacotes. Porém essa política não era aplicada a pacotes excluídos como spam. Isto tem como base o fato que os spammers não deveriam impedir que nomes legítimos fossem usados.
Em resposta a este incidente, a equipe do npm adotou uma série de medidas, a mais importante delas foi implementar uma espera de 24hs para a republicação de qualquer pacote removido, incluindo pacotes contendo spam. Com isso fica muito difícil a injeção de código malicioso através da substituição de um pacote removido, porém requer que a equipe do npm atue dentro de uma janela de 24hs para restaurar e tornar um pacote legítimo antes que alguém possa reutilizá-lo.
Adicionalmente, a equipe do npm estabelecerá uma série de diretrizes para tornar mais improvável que pacotes legítimos sejam removidos erroneamente.