Com mais de 17 milhões de desenvolvedores de software em todo o mundo, a falha Manifest Confusion coloca em risco o ecossistema NPM.
O NPM (Node Package Manager) é um gerenciador de pacotes para a linguagem de programação JavaScript e o padrão para o ambiente amplamente utilizado Node.js.
O gerenciador de pacotes ajuda os proprietários de projetos a automatizar a instalação, atualização e configuração de pacotes de software hospedados no banco de dados “registro npm” em npmjs.com.
Em 2020, a plataforma foi adquirida pela Microsoft por meio do GitHub e, hoje, estima-se que mais de 17 milhões de desenvolvedores de software em todo o mundo a utilizem, baixando 208 bilhões de pacotes por mês.
Agora, o registro do NPM sofre de uma falha de segurança chamada “Manifest Confusion” (confusão manifesta), que prejudica a confiabilidade dos pacotes e permite que invasores ocultem malware em dependências ou executem scripts maliciosos durante a instalação.
Falha Manifest Confusion coloca em risco o ecossistema NPM
Darcy Clarke, ex-gerente de engenharia do GitHub e npm, destacou o problema do Manifest Confusion em um artigo em seu blog, explicando que, apesar de seu ex-empregador saber do problema desde pelo menos novembro de 2022, pouco foi feito para lidar com os riscos associados.
O registro NPM também é imensamente popular entre os desenvolvedores, pois contém uma ampla variedade de pacotes que podem ser usados para estender os recursos de um aplicativo sem exigir trabalho de desenvolvimento adicional.
No entanto, sua popularidade o torna um alvo principal para que os agentes de ameaças distribuam pacotes maliciosos para controlar os computadores do desenvolvedor, roubar credenciais ou até mesmo implantar ransomware.
Manifest Confusion ocorre há uma inconsistência entre as informações do manifesto de um pacote apresentadas no registro npm e o arquivo ‘package.json’ real no tarball do pacote npm publicado usado quando o pacote é instalado.
Os dados do manifesto enviados ao NPM ao publicar um pacote e o package.json contêm informações sobre o nome do pacote, a versão e outros metadados, como scripts usados na implantação, dependências de compilação etc.
Os dois são enviados separadamente para o registro npm, e a plataforma não valida se eles correspondem, então seus dados podem diferir e ninguém saberia, a menos que examinasse seu conteúdo.
Isso permite que um agente de ameaça modifique os dados do manifesto enviados com um novo pacote para remover dependências e scripts para que não apareçam no registro do NPM.
No entanto, esses scripts e dependências ainda existem no arquivo package.json e serão executados quando o pacote for instalado.
Essa “Manifest Confusion” é ilustrada na imagem abaixo, mostrando que não há dependências listadas no NPM para o pacote de prova de conceito de Clarke, embora haja dependências listadas no package.json.
Os riscos que surgem da inconsistência de “confusão manifesta” incluem envenenamento de cache, instalação de dependências desconhecidas, execução de scripts desconhecidos e potencialmente também ataques de downgrade.
“E, para ser claro, não são apenas dependências ocultas”, alertou o CEO da Socket, Feross Aboukhadijeh, que disse que suas ferramentas não são afetadas por esse problema.
“A confusão manifesta também permite que um invasor inclua scripts de instalação ocultos. Esses scripts e dependências ocultos não aparecerão no site do npm ou na maioria das ferramentas de segurança, mesmo que sejam instalados pela CLI do npm.”
Infelizmente, a comunidade npm e todos os principais gerenciadores de pacotes, incluindo npm@6, npm@9, yarn@1 e pnpm@7, são afetados por esse problema.
Infelizmente, isso leva a uma falta de confiança no Registro NPM, pois as dependências, números de versão e até nomes de pacotes podem não ser precisos.
Em vez disso, os desenvolvedores devem ler manualmente o package.json para determinar os números de versão, quais dependências serão instaladas e quais scripts serão executados.
Problema ainda não resolvido
Clarke diz que o GitHub sabe sobre problemas de confusão de manifestos desde pelo menos 2022, e um relatório de bug arquivado no repositório GitHub da CLI npm sobre o pacote node-canvas
parece confirmar isso.
O engenheiro enviou um relatório detalhado do HackerOne que apresentava exemplos do problema em 9 de março de 2023.
Em 21 de março de 2023, o GitHub encerrou o tíquete, respondendo que estava lidando com o problema internamente. Ainda assim, eles ainda não corrigiram os riscos e não os comunicaram à comunidade npm.
Clarke menciona que, devido ao tamanho do npm e ao fato de que ele segue essa prática insegura há muitos anos, resolver esse problema está longe de ser trivial.
Até que o GitHub elabore um plano para lidar com a confusão do manifesto no npm, Clarke sugere que os autores e mantenedores de pacotes removam a dependência dos dados do manifesto e, em vez disso, obtenham todos os metadados, exceto o nome e a versão dos arquivos ‘package.json’ que são menos propensos a manipulação.
Outra medida de proteção seria usar um proxy de registro entre o banco de dados do pacote e o cliente npm, que poderia implementar verificações e validações adicionais para garantir a consistência entre os dados do manifesto e as informações no tarball do pacote.
A BleepingComputer entrou em contato com o GitHub sobre o problema e atualizaremos esta postagem assim que recebermos uma resposta.