Saltar al contenido principal

W - I - Prototype pollution

Prototype Pollution es un ataque de inyección que se dirige a los tiempos de ejecución de JavaScript. Con la contaminación de prototipos, un atacante podría controlar los valores predeterminados de las propiedades de un objeto. Esto permite que el atacante altere la lógica de la aplicación y también puede conducir a la denegación de servicio o en casos extremos.

JavaScript, es un lenguaje de programación orientado a objetos basado en prototipos. Cada objeto está vinculado a un "prototipo". Cuando invocamos el método en un objeto, JavaScript primero verificará si definimos explícitamente el método para el objeto dado. Si no lo hemos hecho, buscará su definición en el prototipo del objeto.toString.

La vulnerabilidad de contaminación del prototipo es exclusiva del lenguaje JavaScript. contaminación prototipo se refiere a la situación en la que se cambia la propiedad de los objetos fundamentales.prototype.

La herencia basada en objetos le da a JavaScript la flexibilidad y eficiencia que los programadores web han llegado a amar, pero también lo hace vulnerable a la manipulación.

Los actores malintencionados pueden realizar cambios en toda la aplicación en todos los objetos modificando el objeto, de ahí el nombre de contaminación de prototipos.

Curiosamente, los atacantes ni siquiera necesitan modificar el objeto directamente; pueden acceder a él a través de la propiedad ‘ __proto__ ‘ de cualquier objeto de JavaScript. Y una vez que realiza un cambio en el objeto, se aplica a todos los objetos de JavaScript en una aplicación en ejecución, incluidos los creados después de la manipulación.

Ejemplo:

let customer = {name: "person", address: "here"}
console.log(customer.toString())
//output: "[object Object]"
customer.__proto__.toString = ()=>{alert("polluted")}
console.log(customer.toString())
// alert box pops up: "polluted"

const x = {y:42}

x.y // 42
x.z // undefined

Object.prototype.y = 'hello y'
Object.prototype.z = 'hello z'

x.y // 42
x.z // 'hello z'

¿Cómo evitarlo?

Se debe evitar palabras clave por defecto como lo son: {_bsontype: "Code"}, constructor, __proto__, Si se está utilizando alguna de estas palabras clave en los datos de una solicitud, puede anular las palabras clave predeterminadas configurando la nueva opción requestKeywordDenylist de Parse Server [], especificando sus propias palabras clave según sea necesario. Esta característica de seguridad busca que las palabras clave sean confidenciales en los datos de solicitud para evitar la contaminación del prototipo de JavaScript.

¿Cómo se ejecuta el Prototype Pollution? En primera instancia los atacantes observan las vulnerabilidades o errores de las aplicaciones en los datos que expone para efectuar solicitudes al servidor mediante HTTP POST y HTTP GET y de esta manera efectuar la contaminación de prototipos ingresando a través del URL comandos para la obtención de información:

Mitigación

Se recomienda lo siguiente:

Instalar las actualizaciones del fabricante disponibles en medios oficiales del proveedor, previo análisis del impacto que podría provocar en los servicios críticos para el negocio de su organización.

Aunque la solución es más amplia e incluye varios aspectos de la vulnerabilidad, se puede lograr una solución rápida y específica parcheando el controlador MongoDB Node.js

¿Cómo fortalecer las aplicaciones contra los ataques de contaminación de prototipos?

Al igual que muchas otras vulnerabilidades de seguridad, los atacantes aprovechan prototipos de errores de contaminación a través de la entrada del usuario en aplicaciones web y envían su código malicioso en campos de texto, encabezados y archivos.

Por ejemplo, muchas bibliotecas de JavaScript aceptan un objeto de opciones y verifican la presencia de propiedades específicas en el objeto. En caso de que alguna propiedad no esté presente, por defecto tienen alguna opción predefinida (ejemplo a continuación)

options.someOption = options.someOption || default.someOption;

Recomendamos parchear cualquier prototipo de vulnerabilidad de contaminación que identifique en sus sitios web, independientemente de si estos están combinados con dispositivos explotables. Incluso si está seguro de que no se ha perdido ninguno, no hay garantía de que las futuras actualizaciones de su propio código o cualquier biblioteca que use no introduzcan nuevos gadgets, allanando el camino para exploits viables.

en Node JS podemos usar paquetes como AJV, para validar nuestros datos a la base de datos y con ello reducir el riesgo de que contaminen la información enviada y recibida, en el front invalidar las propiedades antes mencionadas.

Links de apoyo: