FlawOpen

flawopen.com/Poluição de protótipo/lodash.merge()

lodash.merge() é seguro contra poluição de protótipo?

CWE-1321: Prototype PollutionGuia de referência
Short answer

Pense em uma mesclagem profunda como copiar etiquetas de um arquivo alheio para os registros principais da aplicação. Em versões antigas, certos caminhos do Lodash podiam tratar nomes especiais de propriedades como instruções para alcançar o estado compartilhado dos protótipos. As correções recentes bloqueiam caminhos conhecidos, mas copiar todos os campos da requisição ainda permite atribuição em massa. Valide os campos aceitos pela aplicação.

VULNERÁVEL — versões afetadas do Lodash
const _ = require("lodash");

const settings = {};
const input = request.body;

_.merge(settings, input);
_.set(settings, request.query.path, request.query.value);
CORRIGIDO — atualize e construa uma forma conhecida
const allowedLocales = new Set(["en", "fr"]);
const input = request.body;

const settings = {
  theme: input.theme === "dark" ? "dark" : "light",
  locale: allowedLocales.has(input.locale)
    ? input.locale
    : "en",
};

Como funciona o caminho da vulnerabilidade

Em uma versão afetada, JSON não confiável ou um caminho controlado pelo chamador chega a uma função vulnerável do Lodash. Uma mesclagem recursiva ou operação de caminho trata incorretamente um componente especial e altera ou remove uma propriedade de um protótipo nativo. Outro código pode então ler essa propriedade herdada; o efeito depende da propriedade e do gadget alcançável na aplicação. Poluição de protótipo, por si só, não comprova execução remota de código.

Os advisories do pacote npm lodash têm escopos distintos: CVE-2018-16487 afetou defaultsDeep, merge e mergeWith antes de 4.17.11; CVE-2019-10744 afetou defaultsDeep antes de 4.17.12; CVE-2020-8203 afetou pick, set, setWith, update, updateWith e zipObjectDeep antes de 4.17.19. CVE-2025-13465 afetou unset e omit até 4.17.22, corrigido em 4.17.23. Depois, CVE-2026-2950 afetou esses dois métodos na versão 4.17.23, corrigido em 4.18.0. A versão mais recente consultada para este guia é 4.18.1. Esses limites são específicos do pacote: confira separadamente os advisories de lodash-es, pacotes modulares e builds distribuídos pelo sistema operacional.

Como verificar e corrigir a dependência

npm install lodash@^4.18.1 npm ls lodash npm audit npm explain lodash

Atualize as cópias diretas e transitivas, registre o lockfile atualizado e inspecione cópias vendorizadas ou incluídas no bundle. Não passe dados da requisição diretamente a mesclagens profundas nem a APIs de caminho; crie um novo objeto com campos validados e permitidos. O exemplo evita chaves e caminhos escolhidos pelo atacante. Na verificação de 2026-10-05, Lodash 4.18.1 é a versão mais recente; acompanhe os advisories para correções posteriores.

Perguntas frequentes

lodash.merge() é seguro na versão mais recente?

Os advisories consultados para o pacote npm lodash listam as correções relevantes em versões posteriores; 4.18.1 é a versão mais recente verificada aqui. Mantenha-a atualizada, confira todas as cópias instaladas e evite mesclar corpos de requisição por completo, pois isso pode causar atribuição em massa.

Poluição de protótipo sempre leva à execução remota de código?

Não. A poluição altera ou remove propriedades herdadas. O impacto depende do que a aplicação lê ou invoca depois e se isso alcança um gadget sensível. Descreva o efeito demonstrado, sem presumir RCE.

lodash-es e pacotes lodash.* têm os mesmos limites de versão?

Não necessariamente. Os advisories podem definir versões afetadas e corrigidas diferentes para cada pacote. Confira o nome exato, a entrada do lockfile e o advisory; não aplique automaticamente o limite de lodash a todas as distribuições.

Referências

Veja também Poluição de protótipos JavaScript: causas e correções Object.assign() e Prototype Pollution: o que é seguro? JSON.parse() causa poluição de protótipo? JSON.parse() é mais seguro que eval()?