Se você chegou a esta página diretamente de um Pull Request do Aikido Autofix e apenas quer aprender como finalizar o PR, pule para ‘Como implementar’.
O ecossistema JavaScript tem um problema e ele é chamado de prototype pollution. Para uma empresa SaaS que desenvolve com JavaScript/npm, tipicamente até 20-30% de todas as vulnerabilidades conhecidas (CVE) detectadas nas dependências são causadas por prototype pollution. Elas geralmente não são fáceis de explorar, mas em casos graves, podem levar a falhas de execução remota de código. Isso significa que são difíceis de ignorar completamente.
Duas maneiras de prevenir prototype pollution
Há suporte experimental no Node.js para congelar o protótipo por padrão sob uma flag chamada --frozen-intrinsics. Habilitar essa flag impede todos os ataques de poluição de protótipo. No entanto, ainda não podemos recomendá-lo porque é experimental e também não funcionará em bases de código de frontend. Isso impediria você de construir a mesma proteção em seu frontend e backend.
Uma alternativa é nopp (No Prototype Pollution), uma biblioteca de 14 linhas que congela o protótipo (e alguns outros pontos de entrada).
Como implementar
1. Importando a biblioteca
Depois de instalar o nopp, tudo o que você precisa fazer é ir ao script que inicia seu aplicativo. Lá você simplesmente requer a biblioteca, depois de ter requerido todas as suas outras bibliotecas. Exemplo de commit abaixo:

2. Verificação de segurança em todo o aplicativo para bibliotecas que dependem de manipulação de protótipo
A razão pela qual estamos congelando o protótipo depois de incluir outras bibliotecas é que algumas de suas outras bibliotecas podem depender da alteração do protótipo para funcionar! Mesmo depois de garantir o congelamento do protótipo DEPOIS de incluir outras bibliotecas, ainda é possível que você precise de algum refactoring antes que seu aplicativo funcione novamente!
Um exemplo disso é o próprio aws-sdk da Amazon para Node.js, que faz alterações no protótipo durante a construção de objetos como “new AWS.S3(..)”. Nesses casos, você pode ter que fazer um refactor como mostrado abaixo, garantindo que o objeto seja criado quando seu processo Node.js for inicializado e não durante uma fase posterior.

Garantir que seu aplicativo ainda funcione após essa alteração pode ser um investimento de tempo maior para repositórios maiores com baixa cobertura de testes. Para repositórios menores, valerá a pena nunca mais ter que lidar com a poluição de protótipo. Para repositórios maiores, isso pode ser mais complexo, mas o investimento em engenharia provavelmente ainda terá um ROI positivo a longo prazo.
Proteja seu software agora


.jpg)
.avif)
