«Prototype Pollution» o Contaminación de Prototipos: la peligrosa y subestimada vulnerabilidad que afecta a las aplicaciones de JavaScript.
A principios de 2019, los investigadores de seguridad de Snyk revelaron detalles de una vulnerabilidad grave en Lodash, una popular biblioteca de JavaScript, que permitía a los piratas informáticos atacar múltiples aplicaciones web.
El agujero de seguridad era un error de contaminación prototipo , un tipo de vulnerabilidad que permite a los atacantes explotar las reglas del lenguaje de programación JavaScript y comprometer las aplicaciones de varias maneras.
¿Qué es la contaminación por prototipos?
JavaScript está basado en prototipos: cuando se crean nuevos objetos, estos transfieren las propiedades y métodos del «objeto» prototipo, que contiene funcionalidades básicas como toString, constructor y hasOwnProperty.
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.
Aquí hay un ejemplo simple de cómo funciona la contaminación prototipo. El siguiente código cambia el valor de la función toString en el prototipo a un código arbitrario:
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"
Ahora, cada vez que se llama a toString() en un objeto, aparecerá un cuadro de alerta con el mensaje «polluted» (a menos que un objeto anule explícitamente Object.toString() con su propia implementación). Dado que toString se usa ampliamente en JavaScript del lado del cliente, esto causará una interrupción en la ejecución de la aplicación.
Otros ataques de contaminación de prototipos implican agregar propiedades y métodos al objeto para manipular el comportamiento de una aplicación.
“[La contaminación del prototipo] no es completamente única, ya que es, más o menos, un tipo de ataque de inyección de objetos”, dice el investigador de seguridad Mohammed Aldoub. “Sin embargo, es especial porque definitivamente no es uno de los principales tipos de vulnerabilidad que la mayoría de la gente conoce.»
“Es oscuro porque se dirige principalmente a lenguajes/marcos específicos y porque no está tan bien documentado como otros. Sin embargo, no es menos peligroso que otras vulnerabilidades ‘convencionales’”.
¿Cuál es el impacto de la contaminación del prototipo?
“El impacto de la contaminación de prototipos depende de la aplicación”, dice el investigador de seguridad Michał Bentkowski.
“En pocas palabras, cada vez que un código JavaScript accede a una propiedad que no existe en un objeto (que incluye verificar la existencia de la propiedad), podemos cambiar el resultado de la verificación con la contaminación del prototipo”.
Agregó: “Dependiendo de la lógica exacta de la aplicación, la contaminación del prototipo puede generar prácticamente todas las vulnerabilidades web populares: Ejecución Remota de Código (RCE), Secuencias de Comandos entre Sitios ( XSS ), Inyección de SQL , etc.»
En los navegadores web, la contaminación de prototipos suele provocar ataques XSS (consulte el ejemplo anterior). En 2019, por ejemplo, un prototipo de error de contaminación que se encontró en la biblioteca de JavaScript jQuery dejó a muchas aplicaciones web vulnerables a este tipo de ataques.
Pero es probable que surjan otras vulnerabilidades. “La explotación del lado del cliente de la contaminación de prototipos no está bien cubierta actualmente”, dice Bentkowski, quien actualmente está trabajando en una descripción detallada de cómo las vulnerabilidades en esta categoría pueden eludir los desinfectantes HTML populares como html-sanitize y DOMPurify.
Del lado del servidor, el impacto de la contaminación de los prototipos es más conocido.
“El impacto de la contaminación de prototipos en el lado del servidor es, al menos, la denegación de servicio al hacer que el servidor Node.js se bloquee”, dice el investigador de seguridad Posix a The Daily Swig . “Sin embargo, ciertamente tiene el potencial de vincularse con otras vulnerabilidades, como la ejecución remota de código”.

Necesita una herramienta que analice vulnerabilidades en tus sitios o aplicaciones web?, ponte en contacto con nosotros para ayudarte, contamos con las mejores herramientas como Burp Suite, Veracode, Fortify, Acunetix, Invicti y mas.
Contacto..
El año pasado, Bentkowski descubrió un prototipo de error de contaminación en Kibana, una biblioteca de visualización de datos, que hizo posible crear un «reverse shell» y lograr RCE.
Luego, en julio de este año, Posix informó sobre el mismo tipo de falla en la popular biblioteca Express-FileUpload, que podría permitir que un hacker obtenga acceso de shell remoto a un servidor Node.js.
En el mismo mes, el investigador de seguridad Francesco Soncina descubrió un prototipo de vulnerabilidad de contaminación en la biblioteca de JavaScript de mapeo de objetos TypeORM que permitió a los piratas informáticos realizar ataques de inyección SQL en aplicaciones Node.js.
“Si la aplicación final, dependiendo de la biblioteca, tiene evaluación dinámica de código o dispositivos de ejecución de comandos, el atacante puede desencadenar potencialmente la ejecución de comandos arbitrarios en la máquina de destino”, escribió Soncina.
Y en septiembre de 2020, Snyk informó que una función de transferencia en la popular biblioteca node-forge de JavaScript contenía una vulnerabilidad que podría permitir a los atacantes llevar a cabo prototipos de ataques de contaminación contra aplicaciones.
La vulnerabilidad recibió una puntuación de 9,8 de gravedad alta y una prueba de concepto mostró que setPath se puede usar para contaminar la propiedad __prototype__ del objeto base, lo que da como resultado modificaciones en toda la aplicación.

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.
“Supongo que confiar en la entrada del usuario es la raíz real del problema, por lo que los desarrolladores deben tener mucho cuidado con los campos de objetos que pueden ser influenciados por los usuarios”, dice Aldoub.
Otro problema es la forma en que se escriben muchas aplicaciones de JavaScript. “El patrón de codificación que conduce a la contaminación del prototipo es extremadamente común en el código JavaScript”, señala Bentkowski.
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;
En este caso, los atacantes pueden usar la contaminación del prototipo para anular alguna opción y manipular la lógica de la aplicación.
Un tipo popular de defensa es crear listas de bloqueo donde los desarrolladores eliminan campos riesgosos de las cadenas de entrada. Pero esto es más fácil decirlo que hacerlo.
“Tienes que enumerar todas las posibilidades de campos riesgosos y todas las permutaciones para codificar dichos campos, lo cual es una hazaña inconmensurablemente difícil”, dice Aldoub.
Por ejemplo, con la vulnerabilidad de Lodash antes mencionada, los desarrolladores inicialmente verificaron las cadenas en el campo __proto__ , pero luego se dieron cuenta de que el constructor también era un objetivo potencial para la contaminación del prototipo.
“¿Qué pasaría si se descubriera que otro campo es explotable?” dice Aldoub.
Otro paso importante es verificar los módulos de dependencia de las posibles vulnerabilidades de contaminación del prototipo, lo que presenta sus propios desafíos.
“Desde el punto de vista de un desarrollador de aplicaciones, es muy difícil verificar todos los módulos en uso”, explicó Posix. “Por lo tanto, antes de su uso, es necesario verificar que el módulo esté completamente validado”.
Un error subestimado
Todos los investigadores con los que habló The Daily Swig expresaron una preocupación común: que la contaminación de prototipo no está recibiendo suficiente atención.
“Sentí un potencial infinito en este tipo de vulnerabilidad. Pero en comparación con las posibilidades, no creo que se haya investigado lo suficiente”, dice Posix, quien se ha centrado en prototipos de ataques de contaminación desde el año pasado.
“La comunidad necesita aprender y practicar este tipo de vulnerabilidad con más profundidad y atención, ya que todavía es oscuro y peligroso”, dice Aldoub.
Bentkowski agrega: “La contaminación de prototipos puede tener un impacto serio en la seguridad de las aplicaciones web, pero no existen muchas fuentes que muestren casos reales de su explotación».
“Entonces, este es un objetivo perfecto para la investigación”, dice el investigador, haciendo una analogía con la deserialización de Java, otro tipo de vulnerabilidad peligrosa que pasó desapercibida durante muchos años.
Una presentación realizada por investigadores de seguridad en FoxGlove en 2015 mostró el potencial destructivo de la deserialización de Java y finalmente le dio la tracción que se merece en la comunidad de seguridad.
“Siento que este tipo de avance aún está por llegar para la contaminación prototipo”, dice Bentkowski.
NORTH NETWORKS es Distribuidor Oficial y brinda licencias nuevas, renovaciones y servicios profesionales de las herramientas DAST, SAST y PenTest mas importantes.
Pongase en contacto y le ayudaremos a analizar sus requerimientos para poder brindarle la herramienta que mejor se ajuste a sus requerimientos.
Si te ha gustado, ¡compártelo con tus amigos!


