"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Etapas para prevenir ataques de poluição de protótipo em JavaScript

Etapas para prevenir ataques de poluição de protótipo em JavaScript

Publicado em 31/07/2024
Navegar:396

Steps to Preventing Prototype Pollution Attacks in JavaScript

No mundo da segurança da web, a poluição de protótipos é uma vulnerabilidade sutil, mas potencialmente devastadora, que pode levar a consequências graves se não for tratada adequadamente. Neste blog, exploraremos o que é a poluição por protótipo, como ela ocorre e, o mais importante, como evitá-la. Vamos mergulhar!

O que é poluição por protótipo?

A poluição de protótipo é um tipo de vulnerabilidade que afeta aplicativos JavaScript. Ocorre quando um invasor consegue injetar propriedades no protótipo de um objeto, que podem então se propagar para todos os objetos que herdam desse protótipo. Isso pode levar a um comportamento inesperado, incluindo a capacidade de substituir métodos e propriedades existentes, comprometendo, em última análise, a segurança e a funcionalidade do aplicativo.

Como acontece a poluição do protótipo

Para entender como acontece a poluição de protótipos, precisamos examinar mais de perto os objetos e protótipos JavaScript. Em JavaScript, todo objeto possui um protótipo, que é outro objeto do qual o primeiro objeto herda propriedades e métodos. Este encadeamento de protótipo permite uma pesquisa eficiente de propriedades, mas também abre a porta para possíveis ataques se não for tratado corretamente.

Aqui está um exemplo simples de como a poluição de protótipos pode ocorrer:

let obj = {};
console.log(obj.constructor); // function Object() { [native code] }

obj.__proto__.polluted = true;
console.log({}.polluted); // true

Neste exemplo, ao modificar a propriedade proto de obj, afetamos inadvertidamente todos os objetos que compartilham o mesmo protótipo, demonstrando como é fácil poluir a cadeia de protótipos.

Exemplo do mundo real de protótipo de poluição

Considere um cenário em que a entrada do usuário é usada para estender ou mesclar objetos sem a validação adequada. Um caso de uso comum é mesclar parâmetros de consulta em um objeto de configuração.

const merge = require('lodash/merge');

let config = {};
let query = JSON.parse('{"__proto__":{"admin":true}}');

merge(config, query);

console.log(config.admin); // undefined
console.log({}.admin); // true

Neste exemplo, a função merge da biblioteca Lodash é usada para combinar configuração com consulta. No entanto, o objeto de consulta controlado pelo invasor inclui uma propriedade proto que polui o protótipo do objeto global, configurando admin como true para todos os objetos.

Prevenindo a poluição do protótipo

Para proteger seus aplicativos da poluição por protótipos, considere implementar as seguintes medidas:

1. Evite estender protótipos nativos:
Não estenda protótipos nativos (por exemplo, Object.prototype) diretamente, pois isso pode levar a conflitos e vulnerabilidades de segurança.

Exemplo: evite estender protótipos nativos
Evite fazer isso:

Object.prototype.polluted = true; // Extending native prototype

let obj = {};
console.log(obj.polluted); // true

Em vez disso, crie métodos utilitários dentro do seu próprio namespace:

const myUtils = {
  polluted: function() {
    // Your method implementation
  }
};

let obj = {};
console.log(obj.polluted); // undefined

2. Validar entrada do usuário:
Sempre valide e higienize a entrada do usuário antes de usá-la para construir ou modificar objetos. Use bibliotecas como Joi ou Validator para impor regras rígidas de validação de entrada.

Exemplo: validar a entrada do usuário usando Joi

const Joi = require('joi');

const schema = Joi.object({
  admin: Joi.boolean().required()
});

const input = JSON.parse('{"admin":true}');

const { error, value } = schema.validate(input);

if (error) {
  console.error('Invalid input:', error.details);
} else {
  console.log('Valid input:', value);
}

3. Use métodos de objetos seguros:

Prefira usar métodos de objetos seguros que não atravessem a cadeia de protótipos, como Object.create(null) para criar objetos simples sem um protótipo.

Exemplo: Use métodos de objetos seguros

let safeObj = Object.create(null);
safeObj.admin = false;

console.log(safeObj.constructor); // undefined
console.log(safeObj.admin); // false

4. Congelar o protótipo:

Congele o Object.prototype para evitar modificações na cadeia de protótipos. Isso pode ser feito usando Object.freeze().

Exemplo: Congelando o Protótipo

Object.freeze(Object.prototype);

let obj = {};
try {
  obj.__proto__.polluted = true;
} catch (e) {
  console.error('Attempt to modify prototype failed:', e);
}

console.log({}.polluted); // undefined

5. Atualizar dependências:

Atualize regularmente suas dependências para garantir que você está usando as versões mais recentes que incluem patches de segurança. Vulnerabilidades em bibliotecas de terceiros são frequentemente exploradas para ataques de poluição de protótipos.

Exemplo: atualização de dependências usando npm

npm update

Execute este comando regularmente para garantir que todos os seus pacotes estejam atualizados.

6. Monitorar e testar:
Implemente monitoramento e testes automatizados para detectar e mitigar vulnerabilidades de poluição de protótipos. Ferramentas como auditoria npm podem ajudar a identificar pacotes vulneráveis ​​em seu projeto.

Exemplo: monitoramento e teste com auditoria npm

npm audit

Execute este comando para verificar se há vulnerabilidades em seu projeto. Ele fornece um relatório dos problemas encontrados e sugere etapas de correção.

Conclusão

A poluição por protótipos é uma vulnerabilidade crítica que pode ter consequências de longo alcance se não for controlada. Ao compreender como isso ocorre e implementar práticas recomendadas para evitá-lo, você pode aumentar significativamente a segurança de seus aplicativos JavaScript. Fique atento, mantenha suas dependências atualizadas e sempre valide a entrada do usuário para se proteger contra esse vetor de ataque insidioso.

Se você achou este blog útil, não se esqueça de compartilhá-lo com seus colegas desenvolvedores e entusiastas de segurança. Manter-se informado e proativo é fundamental para manter uma segurança robusta na web. Boa codificação!

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/rigalpatel001/steps-to-preventing-prototype-pollution-attacks-in-javascript-118g?1 Se houver alguma violação, entre em contato com [email protected] para excluir isto
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3