
tough-cookie v2.5.0 parcheado que corrige la vulnerabilidad de contaminación de prototipos CVE-2023-26136 con Object.create(null) en MemoryCookieStore, incluyendo demostración del exploit y pruebas unitarias.
Este repositorio contiene una versión parcheada del paquete tough-cookie, versión 2.5.0, para abordar la vulnerabilidad crítica de Contaminación de Prototipos (CVE-2023-26136). La vulnerabilidad permite a atacantes manipular la cadena de prototipos inyectando propiedades en objetos JavaScript. Esto puede dar lugar a comportamientos inesperados, riesgos de seguridad como ejecución remota de código y problemas de compatibilidad en aplicaciones que dependen de este paquete.
Las versiones del paquete tough-cookie anteriores a la v4.1.3 son vulnerables a la Contaminación de Prototipos cuando se usa CookieJar con el modo rejectPublicSuffixes=false. La vulnerabilidad surge del manejo inadecuado de cookies, específicamente cuando cookie.domain se establece como . Esto permite a los atacantes modificar el objeto base , causando potencialmente problemas generalizados en toda la aplicación.
__proto__Object.prototypePara más detalles sobre el CVE-2023-26136, consulta:
La contaminación de prototipos puede introducir varios riesgos críticos, incluyendo:
Vulnerabilidades de Seguridad: Al modificar el Object.prototype base, los atacantes pueden manipular el comportamiento de los objetos, potencialmente escalando privilegios, accediendo a datos sensibles o eludiendo mecanismos de seguridad en la aplicación.
Denegación de Servicio (DoS): Contaminar la cadena de prototipos puede causar comportamientos inesperados en el sistema, provocando fallos, bucles infinitos o agotamiento de recursos, haciendo que la aplicación no esté disponible para usuarios legítimos.
Problemas de Compatibilidad: Cambiar el Object.prototype puede causar errores y comportamientos inesperados al interactuar con otras librerías o frameworks. Las dependencias que se basan en cadenas de prototipos pueden romperse, llevando a problemas de integración o comportamiento defectuoso de la aplicación durante las actualizaciones.
Comportamiento Inesperado de la Aplicación: La contaminación de prototipos puede provocar un comportamiento errático del programa, incluyendo corrupción de datos, brechas de seguridad y potencialmente exponer la aplicación a más explotaciones.
El parche implica modificar la clase MemoryCookieStore, específicamente el método putCookie, para prevenir la contaminación de prototipos creando objetos sin prototipo. Los cambios clave incluyen:
Object.create(null) en lugar de {} para crear objetos sin prototipo.cookie.domain = __proto__.Para instalar la versión parcheada de tough-cookie, usa el siguiente comando:
npm install ./tough-cookie-2.5.0-PATCHED.tgz
Este repositorio incluye una prueba unitaria diseñada para verificar que la vulnerabilidad de contaminación de prototipos se ha solucionado exitosamente.
La prueba, llamada prototype_pollution_test, verifica específicamente que establecer cookies con un dominio de __proto__ ya no afecta la cadena de prototipos de JavaScript. Esto asegura que se previene la contaminación de prototipos, manteniendo la integridad de la aplicación.
Para ejecutar las pruebas y confirmar la corrección, ejecuta el siguiente comando:
npm test
Para demostrar el exploit tanto en la versión original como en la parcheada, sigue los pasos a continuación:
Instala la versión vulnerable de tough-cookie:
npm install [email protected] && node index.js
Salida Esperada:
Polluted object: {
Slonser: Cookie="Slonser=polluted; Domain=__proto__; Path=/notauth; hostOnly=false; aAge=5ms; cAge=5ms",
Auth: Cookie="Auth=Lol; Domain=google.com; Path=/notauth; hostOnly=false; aAge=5ms; cAge=5ms"
} EXPLOITED SUCCESSFULLY
Esto indica que el prototipo de un objeto ha sido contaminado, confirmando que la vulnerabilidad está presente en la versión original.
npm install ./tough-cookie-2.5.0-PATCHED.tgz && node index.js
Salida Esperada:
EXPLOIT FAILED
Esto muestra que el exploit ha sido bloqueado exitosamente, confirmando que la vulnerabilidad de contaminación de prototipos ha sido corregida.
El proceso para abordar la vulnerabilidad de Contaminación de Prototipos en tough-cookie v2.5.0 implicó varios pasos metódicos para asegurar que la corrección fuera completa y efectiva. A continuación se presenta una visión general del enfoque que seguí:
Comencé investigando la Contaminación de Prototipos (CVE-2023-26136) para entender su impacto. La vulnerabilidad permite a los atacantes inyectar propiedades en la cadena de prototipos a través de la propiedad cookie.domain, potencialmente causando riesgos de seguridad como ejecución remota de código.
Exploré issues y discusiones de GitHub sobre la vulnerabilidad, incluyendo la corrección en tough-cookie v4.1.3, que usa Object.create(null) para prevenir la contaminación de prototipos. Esto me ayudó a identificar los cambios necesarios para corregir v2.5.0.
Comparé v2.5.0 con v4.1.3 para entender las diferencias y señalar los cambios necesarios. La modificación clave implicó usar objetos sin prototipo para prevenir la explotación.
Actualicé la clase MemoryCookieStore para usar Object.create(null) en lugar de {}, asegurando que no haya contaminación de prototipos.
Escribí pruebas unitarias para verificar la corrección y creé un script de demostración del exploit (index.js) para mostrar cómo se previene la vulnerabilidad en la versión parcheada.
Finalmente, documenté la corrección, incluyendo instrucciones de instalación y prueba, y empaqueté la versión parcheada (tough-cookie-2.5.0-PATCHED.tgz) para fácil distribución.
Archivos Añadidos/Editados desde v2.5.0
index.js: Script principal para demostrar la vulnerabilidad y la corrección.lib/memstore.js: La clase MemoryCookieStore modificada para prevenir la contaminación de prototipos.test/ietf_data/parser.json: Actualizado para corregir fechas obsoletas en los datos de prueba.test/prototype_pollution_test.js: Pruebas unitarias para verificar que la contaminación de prototipos está corregida.tough-cookie-2.5.0-PATCHED.tgz: La versión parcheada del paquete tough-cookie.