Un módulo de nodeJS con millones de descargas, cuenta con una vulnerabilidad que puede permitir un ataque de Denegación de Servicio (Two) en un servidor u obtener acceso a shell remoto completo.
Asignado al CVE-2020-7699, la vulnerabilidad radica en el componente npm “express-fileupload”, que se ha descargado al menos 7.3 millones de veces desde npm. La estimación es conservadora, ya que no tiene en cuenta las descargas de GitHub, sitios web espejo y otros repositorios clonados. Este tipo de vulnerabilidad generalmente ocurre en el código JavaScript (JS) debido a la naturaleza fundamental del lenguaje. Debido a que JS es un lenguaje basado en prototipos, cada objeto, función y estructura de datos en el lenguaje tiene una propiedad inherente “Prototype” que puede modificarse mediante el mutador “__proto__”. La capacidad de modificar el código existente es una característica prevista que permite la fácil extensión de los objetos existentes, con más propiedades y métodos.
Los ataques de creación de prototipos como este aprovechan este ‘fallo de diseño’ inyectando objetos incompatibles con los existentes para causar errores, lo que lleva a la Denegación de Servicio o ejecutar una shell.
El ataque es posible gracias a la función “parseNested” proporcionada por express-fileupload. Cuando está habilitada, esta opción es responsable de interpretar los datos JSON cargados en objetos anidados. El módulo express-fileupload proporciona varias opciones para cargar y administrar archivos en la aplicación Node.js. Entre ellos, el argumento de parseNested hace que el argumento sea plano.
Cuando se proporciona una carga útil en el encabezado HTTP “Content-Disposition”, un atacante puede proporcionar un valor “__proto __. ToString” para activar el ataque. Básicamente, la solicitud HTTP anula y corrompe el método incorporado “toString” de cada objeto presente en su código. Then, si el “Object.prototype.toString” puede contaminarse, esto causa un error, y para cada solicitud siempre se devuelve un ERROR 500.
Una variación más sofisticada permite a un atacante obtener un shell en el sistema vulnerable. A las pocas horas de recibir el informe de un investigador, “express-fileupload” solucionó la vulnerabilidad, y los usuarios afectados deben descargar la versión 1.1.9 parcheada desde npm.