Descrição
A aplicação web recebe um input do usuário vindo de uma aplicação onde que especifica o atributo que pode ser inicializado ou atualizado em um objeto, mas não controla as modificações do objeto prototype
adequadamente.
Descrição completa
Em adicionar ou modificar atributos de do objeto prototype
, é possível criar atributos que vão existir em toso os objetos ou substituir atributos críticos em atributos maliciosos. Isso pode ser problemático se o produto depende da existência ou não existência de certos atributos, ou atributos pré-definidos pelos usuários através do objeto prototype
.
Essa vulnerabilidade é frequentemente explorada ao usar caracteres especiais em em objetos chamados proto
, construtores
ou prototype
. Esses atributos dão acesso ao objeto prototype
. Essa vulnerabilidade é frequentemente encontrada no código que define atributos de objetos baseado na entrada do usuário.
Linguagem afetada
Consequência comum
Scope | Impacto |
---|---|
Integridade | O atacante pode injetar atributos que são utilizados em outros componentes |
Disponibilidade | O atacante pode sobrescrever atributos já existente com algum tipo incompatível, que pode levar a um crash |
Exemplos demonstrativos
Exemplo 1
Essa função define objetos baseado em um path separado por pontos:
function setValueByPath(object, path, value) {
const pathArray = path.split(".");
const attibuteToSet = pathArray.pop();
let objectToModify = object;
for (const attr of pathArray) {
if (typeof objectToModify[attr] !== 'object') {
objectToModify[attr] = {};
}
objectToModify = objectToModify[attr];
}
objectToModify[attributeToSet] = value;
return object;
}
Essa função está vulnerável, visto que ela não checa se o atributo passado pelo usuário é um prototype
. Esses códigos podem ser usados para adicionar isAdmin: true
para o prototype
.
setValueByPath({},"__proto__.isAdmin", true);
setValueByPath({}, "constructor.prototype.isAdmin", true)