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

ScopeImpacto
IntegridadeO atacante pode injetar atributos que são utilizados em outros componentes
DisponibilidadeO 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)