Skip to content

Prototype Pollution

O Prototype Pollution é um ataque específico de JavaScript que explora a natureza dos protótipos da linguagem para injetar propriedades em objetos base.


O Risco

Como quase tudo em JavaScript herda de Object.prototype, poluir esse objeto significa que todos os objetos criados na aplicação herdarão as propriedades injetadas. Isso pode causar negação de serviço (DoS), alteração da lógica de negócio ou até execução de código remoto (RCE) em ambientes Node.js.

  • Exemplo de código vulnerável:
javascript
function merge(target, source) {
  for (let key in source) {
    if (typeof target[key] === 'object' && typeof source[key] === 'object') {
      merge(target[key], source[key]);
    } else {
      target[key] = source[key];
    }
  }
}

// O atacante envia:
merge(userConfig, JSON.parse('{"__proto__": {"isAdmin": true}}'));

Após esse merge, qualquer objeto criado na aplicação terá isAdmin: true por padrão.


Melhores Práticas

✅ Como fazer

  • Use Object.create(null) para criar objetos que não possuem protótipo.
  • Valide as chaves de entrada contra palavras proibidas como __proto__, constructor e prototype.
  • Use Map em vez de objetos literais para armazenar dados dinâmicos baseados em chaves de usuários.
  • Mantenha bibliotecas de utilitários (como lodash) atualizadas.

❌ Como não fazer

  • Não realize merges profundos (deep merge) de objetos de forma recursiva sem validar as chaves.