Blog
dark mode light mode Search Archivos descargables
Search

La polución de prototipos en el lado del cliente y sus riesgos (Client-Side Prototype Pollution)

Client-Side Prototype Pollution

Piensa en cómo personalizas tu teléfono móvil: eliges un fondo de pantalla, organizas las aplicaciones según tus preferencias y ajustas las configuraciones para que se adapten a tus necesidades. Esta personalización es posible porque el sistema operativo proporciona una estructura base que puedes modificar.

En el desarrollo de software, algo similar ocurre con la herencia en programación orientada a objetos. Permite a los desarrolladores construir nuevas funcionalidades sobre las existentes, ajustándolas como si personalizaran su espacio de trabajo digital. Sin embargo, cuando esta “personalización” se hace sin precauciones, como en el caso de “Client-Side Prototype Pollution” o en español: “Polución de Prototipos en JavaScript”, puede introducir vulnerabilidades.

En este artículo, exploraremos Client-Side Prototype Pollution, explicando su naturaleza y cómo puede surgir esta vulnerabilidad. Discutiremos los riesgos y consecuencias asociadas, así como los mecanismos de protección recomendados para garantizar la seguridad de las aplicaciones web.

¿Qué es client-side prototype pollution?

Prototype Pollution es una vulnerabilidad de JavaScript que se da cuando un atacante puede manipular el “prototype” de un objeto.

El término “prototype” en JavaScript, se refiere a una propiedad interna de los objetos que se puede utilizar para definir propiedades que se comparten entre todas las instancias de ese objeto. Dicho de otra forma, “prototype” es como una especie de plantilla interna que tienen los objetos. En JavaScript, cuando se cambia algo en el “prototype” de un objeto, esto afecta a todas las copias (instancias) que se creen de ese objeto.

¿Cómo surgen las vulnerabilidades client-side prototype pollution?

A veces, en JavaScript, existe una forma de manipular el funcionamiento normal de las cosas. Esto sucede cuando una parte del código permite mezclar información de diferentes partes y no se asegura de sanitizar bien esa información antes de usarla. Esto sería como agregar nueva información a una parte del código que no debería permitirlo.

Hay una parte específica en el código llamada “proto” que puede ser utilizada de manera maliciosa. Si un atacante logra meter información dañina usando “proto“, esa información se mezcla con el código de una forma peligrosa.

Aunque esto puede suceder con diferentes partes del código, es más común que ocurra con una parte llamada “Object.prototype”, que funciona como una plantilla general para múltiples objetos en JavaScript. Esto puede afectar muchas partes del programa y hacer que se comporte de manera peligrosa.

¿Cuáles son los riesgos?

Al explotar esta vulnerabilidad, un atacante podría:

  • Manipular la lógica de la aplicación, potencialmente eludiendo las medidas de seguridad o introduciendo un comportamiento malicioso.
  • Agregar nuevas propiedades que pueden provocar una variedad de ataques, incluidos bloqueos de aplicaciones, exposición de datos y ejecución arbitraria de código JavaScript al encontrar dispositivos explotables.

Mecanismos de protección sugeridos

Estas formas de mitigación están más enfocadas en desarrolladores. Los desarrolladores deberían usar new Set() o new Map() en lugar de usar objetos literales:

let allowedTags = new Set();
allowedTags.add('b');
if(allowedTags.has('b')){
  //...
}

let options = new Map();
options.set('spaces', 1);
let spaces = options.get('spaces')

Si es necesario utilizar objetos, se deben crear utilizando Object.create(null) para garantizar que no hereden del prototipo del objeto:

let obj = Object.create(null);

Si requieres objetos literales, como último recurso, puedes utilizar la propiedad __proto__:

let obj = {__proto__:null};

También puedes utilizar Object.freeze() y Object.seal() para evitar que se modifiquen los prototipos integrados. Sin embargo, esto puede dañar la aplicación si las bibliotecas que utilizan modifican los prototipos integrados.

Node.js también ofrece la posibilidad de eliminar completamente la propiedad proto usando el indicador –disable-proto=delete. Ten en cuenta que esta es una medida de defensa en profundidad.

Prototype Pollution aún es posible utilizando las propiedades constructor.prototype, pero eliminar __proto__ ayuda a reducir la superficie de ataque y prevenir ciertos ataques.

Conclusión

La polución de prototipos en JavaScript, representa un riesgo significativo para la seguridad en el desarrollo de aplicaciones del lado del cliente. Al manipular los prototipos de objetos de manera inadecuada, los atacantes pueden alterar el comportamiento esperado de una aplicación, llevando a fallos de seguridad y potenciales brechas de datos.

Si te preocupa la seguridad de tus aplicaciones frente a riesgos como la polución de prototipos, en Hackmetrix estamos listos para ayudarte. Ofrecemos servicios especializados para identificar y remediar este tipo de vulnerabilidades, asegurando que tu desarrollo sea seguro y robusto. Contáctanos para más información y asegura la protección de tus aplicaciones.

Solicitar demo hackmetrix