Vulnerabilidad crítica en un módulo de nodeJS permite a los atacantes inyectar código

Un módulo de nodeJS con millones de descargas tiene una falla de seguridad que puede permitir a los atacantes producir DoS(Denegación de Servicios) u obtener acceso a una Shell remota completa.

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, conocida como «Contaminación de prototipos», 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 esta «falla de diseño» al inyectar tipos incompatibles de objetos en los existentes para causar errores, lo que lleva a la Denegación de Servicio o ejecutar una shell. El ataque real 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.

Posix, el investigador de seguridad que descubrió esta falla, explica en una publicación de blog: «El módulo express-fileupload proporcionavarias opciones para cargar y administrar archivos en la aplicación [Node.js]. Entre ellos, el argumento de parseNested hace que el argumento sea plano». Por ejemplo, si una aplicación estaba utilizando el módulo «express-fileupload» para facilitar la carga de archivos, y la opción «parseNested» establecida en «true», esto indicaría a la aplicación del lado del servidor que comience a aplanar los datos recibidos en objetos JSON anidados.

    Si ingresa {"a.b.c": true} como input, internamente se procesa como {"a":
    {"b": {"c": true}}}"

Cuando se proporciona una carga útil simple en el encabezado HTTP «Content-Disposition», un atacante puede proporcionar un valor «__proto __. ToString» para activar el ataque. Esencialmente, la solicitud HTTP anula y corrompe el método incorporado «toString» de cada objeto presente en su código. Entonces, 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 del investigador, «express-fileupload» solucionó la vulnerabilidad, y los usuarios afectados deben descargar la versión 1.1.9 parcheada desde npm.

Fuente: blog.segu-info.com.ar

Comments are closed.