Poluição de Protótipo (Prototype Pollution)

· Padrão Frontend
Juan Kalleo
Juan Kalleo
Senior Fullstack
This page hasn't been translated to English yet — showing the original Portuguese content.

Vulnerabilidade JavaScript onde invasores modificam as propriedades base de objetos globais, alterando o comportamento da aplicação. Acontece tipicamente quando código faz merge/set recursivo de um objeto vindo de fora (JSON de usuário, querystring) num objeto real, sem filtrar chaves como __proto__/constructor/prototype — o invasor injeta uma dessas chaves no JSON, e o merge "vaza" pro protótipo global de Object, afetando todo objeto da aplicação a partir daquele ponto.

No padrão frontend

Não se aplica — o padrão de tratamento de dado do projeto não tem o padrão de código que abre essa vulnerabilidade. Verificado: nenhuma lib de merge profundo (lodash.merge, lodash.set, deepmerge) está instalada; nenhum Object.assign/spread recursivo mistura JSON vindo de fora com um objeto compartilhado ou global. JSON.parse aparece só em lib/auth.ts, pra ler o cache local do usuário — o resultado vira uma variável tipada isolada, nunca é mesclado em outro objeto:

export function getStoredUser<T = unknown>(): T | null {
  const raw = window.localStorage.getItem(USER_KEY);
  if (!raw) return null;
  try {
    return JSON.parse(raw) as T;
  } catch {
    return null;
  }
}

O resto do dado dinâmico do app (resposta da API, valores de formulário) passa por schema Zod, que também não faz merge recursivo — cada campo é validado e atribuído individualmente ao objeto de saída.

Quando isso importaria: se uma lib de merge profundo entrar no projeto no futuro (por exemplo, pra combinar configuração vinda de múltiplas fontes), o cuidado nesse momento é usar uma versão da lib que já filtra __proto__/constructor/prototype (as libs modernas de merge já fazem isso por padrão) ou validar essas chaves manualmente antes do merge.