Aikido

Prevenindo a poluição de protótipos em seu repositório

Willem DelbareWillem Delbare
|
#

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:

Prevenindo a poluição de protótipo implementando nopp, passo 1: exemplo de commit para importar a biblioteca.
Importando a biblioteca nopp (passo 1)

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.

Prevenindo a poluição de protótipo implementando nopp, passo 2: fazendo um pequeno refactor para corrigir o uso do AWS
Fazendo um pequeno refactor para corrigir o uso do AWS (passo 2)

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.

4.7/5

Proteja seu software agora

Comece Gratuitamente
Não é necessário cc
Agendar uma demonstração
Seus dados não serão compartilhados · Acesso somente leitura · Não é necessário cartão de crédito

Fique seguro agora

Proteja seu código, Cloud e runtime em um único sistema centralizado.
Encontre e corrija vulnerabilidades rapidamente de forma automática.

Não é necessário cartão de crédito | Resultados da varredura em 32 segundos.