
Investigando sobre la vulnerabilidad CVE-2023-26136
Investigando la vulnerabilidad CVE-2023-26136
Las versiones del paquete tough-cookie anteriores a la 4.1.3 son vulnerables a Prototype Pollution debido al manejo inadecuado de cookies al usar CookieJar en modo rejectPublicSuffixes=false. Este problema surge de la forma en que se inicializan los objetos.
https://nvd.nist.gov/vuln/detail/CVE-2023-26136
JavaScript tiene el concepto de objetos, que es algo similar a los diccionarios. Un objeto puede contener un conjunto de variables de diferentes tipos (por ejemplo, string, Boolean, int, etc.), el nombre de la variable es una clave y su valor es el valor, si continuamos con la analogía de diccionarios y objetos. Más precisamente, el objeto es análogo a la estructura de datos del diccionario en sí, y cada variable es análoga a un par clave-valor. Los objetos también tienen la palabra clave proto que permite agregar variables adicionales a un objeto modificando su prototipo. Prototype Pollution es un ataque en el que el atacante contamina su objeto agregándole variables adicionales mediante la palabra clave proto. La siguiente interacción con la consola del navegador demuestra el ataque.
Como podemos ver, tenemos dos usuarios: admin1 y user1. El objeto admin1 tiene una variable booleana: "isAdmin", que está establecida en true. User1 no tiene esta variable en absoluto. En la línea 7, agregamos la variable isAdmin al prototipo de user1, y aunque es evidente en la línea 10 que la variable no se ha agregado al objeto user1 en sí, la consola responde positivamente, esta vez, cuando verificamos el valor de user1.isAdmin. Esto se debe a que user1 está heredando las propiedades de su prototipo.
También vale la pena mencionar que el prototipo es un objeto en sí mismo, que a su vez hereda propiedades y métodos de su prototipo, creando así una cadena de prototipos. La cadena termina con un prototipo nulo, por lo tanto, un enfoque razonable para prevenir Prototype Pollution es hacer que el objeto con el que estamos trabajando herede explícitamente de un prototipo nulo.
Las cookies (a menudo conocidas como cookies de internet) son archivos de texto con pequeños fragmentos de datos —como un nombre de usuario y contraseña— que se utilizan para identificar tu computadora mientras usas una red. Se utilizan cookies específicas para identificar usuarios concretos y mejorar su experiencia de navegación web.
Cortesía de Kaspersky: https://www.kaspersky.com/resource-center/definitions/cookies
CookieJar es un objeto para almacenar cookies.
Según la descripción de la vulnerabilidad, surge de la forma en que Tough-Cookie inicializa las Cookies. Dado que las Cookies son objetos, son, al menos teóricamente, vulnerables a Prototype Pollution.
Al poder manipular objetos y particularmente cookies, a través del prototipo del objeto, el atacante puede potencialmente acceder a datos no autorizados, ejecutar código remoto, causar una denegación de servicio, secuestrar la sesión si el sitio web depende de cookies para gestionar la sesión y extraer datos sensibles de las propias cookies.
El parche se realizó en el archivo: memstore.js. Según el seguimiento del problema así como el parche introducido en la versión 4.1.3, para parchear la vulnerabilidad, necesitamos almacenar las cookies en un mapa o crear el objeto this.idx. Al crear this.idx usando: this.idx = Object.create(null); en lugar de this.idx = {}, practico mi sugerencia sobre cómo prevenir Prototype Pollution en la introducción, heredando de un prototipo nulo y cortando la cadena de prototipos.
Snyk publicó una Prueba de Concepto (PoC) para la vulnerabilidad discutida. Construí index.js basándome en ella. Lo envolví en una lógica try-catch para capturar excepciones si surgían, agregué salida adicional para seguir el progreso de las pruebas y terminé con el resultado requerido (por ejemplo, "EXPLOITED SUCCESSFULLY" o "EXPLOITED FAILED"). Al ejecutar el comando: npm install [email protected] && node index.js Obtenemos la siguiente salida:
Al ejecutar el comando: npm install ./tough-cookie-2.5.0-PATCHED.tgz && node index.js Obtenemos la siguiente salida:
En ambos escenarios (ejecutando con la versión publicada 2.5.0 y ejecutando con mi versión parcheada), logramos configurar tanto la cookie normal como la cookie explotada, pero en la versión parcheada, no pudimos acceder a la cookie explotada.
En esta tarea aprendí sobre el ataque Prototype Pollution, aprendí sobre el objeto JavaScript y me introduje al paquete Tough-Cookie.