¿Prototype Pollution?
La vulnerabilidad Prototype Pollution es una forma de ataque en el cual un atacante puede inyectar propiedades arbitrarias en los prototipos de objetos nativos de JavaScript, lo que puede llevar a la modificación de las propiedades y comportamientos de todos los objetos que heredan de esos prototipos.
¿Qué es un prototipo en JavaScript?
En JavaScript, los objetos pueden heredar propiedades y métodos de un prototipo. Cada objeto tiene un prototipo (accesible a través de __proto__
o Object.getPrototypeOf
), y el prototipo a su vez tiene su propio prototipo, formando una cadena de prototipos (prototype chain). Por ejemplo, si se crea un objeto vacío {}
, este hereda de Object.prototype
.
¿Qué es Prototype Pollution?
Prototype Pollution ocurre cuando un atacante puede modificar el prototipo de objetos nativos, como Object.prototype
, Array.prototype
, etc., añadiendo o sobrescribiendo propiedades. Esto afecta a todos los objetos que heredan de ese prototipo, lo que puede tener consecuencias devastadoras para la aplicación.
Ejemplo de Prototype Pollution
Consideremos el siguiente ejemplo simplificado:
En este ejemplo, params
se parsea desde un JSON que contiene la propiedad __proto__
. Al asignar este objeto, se modifica el prototipo de todos los objetos, añadiendo una propiedad polluted
con el valor "yes"
. Ahora, cualquier objeto creado en el programa tiene una propiedad polluted
con ese valor.
¿Por qué surge la vulnerabilidad?
La vulnerabilidad de Prototype Pollution puede surgir en los siguientes escenarios:
Manipulación Insegura de Objetos: Cuando el código permite a los usuarios o datos externos modificar objetos directamente, sin sanitizar o validar adecuadamente las claves.
Bibliotecas Vulnerables: Algunas bibliotecas pueden manejar de manera insegura la asignación de propiedades en objetos, permitiendo la contaminación de prototipos. Esto es común en bibliotecas que manipulan datos JSON, query strings, etc.
Falta de Sanitización: No filtrar o validar adecuadamente las propiedades de los objetos que se construyen o modifican a partir de datos no confiables.
Escenarios Comunes Donde Puede Surgir
Aplicaciones Web: En aplicaciones web que procesan datos de entrada del usuario, como formularios, parámetros de URL, o datos JSON, un atacante podría enviar datos especialmente diseñados para modificar los prototipos.
APIs: APIs que aceptan y procesan datos JSON de clientes pueden ser vulnerables si no sanitizan adecuadamente las propiedades de los objetos.
Bibliotecas de Terceros: Usar bibliotecas de terceros que no están adecuadamente protegidas contra esta vulnerabilidad puede introducir Prototype Pollution en tu aplicación.
Prevención
Para prevenir la vulnerabilidad de Prototype Pollution, se deben seguir varias prácticas:
Sanitización de Datos: Filtrar y sanitizar las propiedades de los objetos antes de procesarlos. Asegurarse de que los datos no contengan claves peligrosas como
__proto__
,constructor
,prototype
.Validación de Entradas: Implementar una validación estricta de los datos de entrada para asegurarse de que solo las propiedades esperadas sean permitidas.
Uso Seguro de Bibliotecas: Elegir y usar bibliotecas que sean seguras y mantenerlas actualizadas para protegerse contra vulnerabilidades conocidas.
Última actualización
¿Te fue útil?