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” which can be modified using the mutator “__proto__”. The ability to modify existing code is a designed feature that allows for easy extension of existing objects, with more properties and methods.
Prototype pollution attacks like this exploit this 'design flaw'’ by injecting objects incompatible with existing ones to cause errors, which can lead to Denial of Service or shell execution.
The attack is possible thanks to the function “parseNested” provided by express-fileupload. When enabled, this option is responsible for interpreting uploaded JSON data into nested objects. The express-fileupload module provides various options for uploading and managing files in a Node.js application. 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.
