Vulnerabilidad crítica en el módulo “express-fileupload” de Node.js permitiría a un atacante realizar ataques de denegación de servicios (DoS)

A modo de contextualizar la descripción de la vulnerabilidad, una breve definición de:

  • Node.js, es un entorno de ejecución multiplataforma de código abierto basado en el lenguaje Javascript y orientado a eventos asíncronos.
  • Node Package Manager o npm, es el gestor de paquetes por defecto para Node.js, el cual permite obtener cualquier librería con una simple línea de código.
  • express-fileupload, es un módulo que provee múltiples opciones para la carga y administración de archivos dentro de una aplicación Node.js

¿Qué pasó?

Recientemente fue descubierta una vulnerabilidad de riesgo crítico que afecta al módulo “express-fileupload” de Node.js en versiones anteriores a la 1.1.9. Dicho módulo al día de hoy ha sido descargado más de 7 millones de veces desde el npm (Node Package Manager).

El fallo, ha sido identificado con el CVE-2020-7699 y se trata de una vulnerabilidad de Prototype Pollution, este tipo de vulnerabilidad ocurre debido a la propia naturaleza de Javascript como un lenguaje basado en prototipos, donde cada objeto, función y estructura de datos cuenta con una propiedad “Prototype”, la cual es modificable mediante el mutador “proto”, esta característica permite modificar la extensión de objetos ya existentes con más propiedades y métodos. Los ataques del tipo Prototype Pollution aprovechan este fallo para inyectar tipos de objetos incompatibles en los objetos ya existentes, todo esto con el fin de causar errores, lo que provocaría ataques de denegación de servicios (DoS) y en algunos casos la ejecución remota de código.

Detalles Técnicos

El ataque es posible debido a la característica “parseNested” de express-upload, la cual se encarga de anidar los datos JSON cargados en objetos. A continuación se muestra una configuración vulnerable de express-fileupload:

Fuente: Github

Sabiendo esto, un atacante podría realizar una solicitud HTTP maliciosa incluyendo en el encabezado HTTP “Content-Disposition” el valor “proto.toString”, con esto lograr sobreescribir y corromper todos los métodos toString presentes en todos los objetos del código fuente, llevando a un ataque de denegación de servicios (DoS).

Además de esto, es posible que el atacante obtenga una shell en el sistema vulnerable. Sin embargo, esto sólo puede ocurrir si la víctima además de utilizar una versión de express-fileupload vulnerable, también utiliza el motor de plantillas EJS (Embedded JavaScript templates). Si estos factores se cumplen un atacante podría enviar una solicitud HTTP maliciosa que sobreescriba la opción “outputFunctionName” de EJS, con el objetivo de iniciar un “child_process” de Node.js, este nuevo proceso generaría una shell reversa y una vez que la conexión sea establecida permitiría al atacante ejecutar código arbitrario en el servidor.

Recomendaciones:

  • Actualizar el módulo express-fileupload a la versión 1.1.9, desde el siguiente enlace.
  • Además como medidas de mitigación a esta vulnerabilidad se recomienda:
    • Realizar una validación del esquema de entrada JSON,
    • Evitar el uso de funciones de fusión recursivas inseguras,
    • Considerar el uso de objetos sin prototipo (ejemplo: Object.create(null)), para romper la cadena del prototipo y prevenir posibles ataques,
    • Finalmente, como práctica recomendada utilizar Map en lugar de Object.

Referencias:

Compartir: