jueves, 30 de agosto de 2018

Encontrado RCE en packagist, servidor de paquetes de PHP

El error, ya corregido, permitía a usuarios autenticados ejecutar comandos en el proceso de subida de un nuevo paquete.





Composer es un gestor de paquetes empleado en proyectos PHP, similar a npm (NodeJS) o pip (Python), que emplea como servidor de paquetes por defecto packagist.org. El investigador Max Justicz ha encontrado una vulnerabilidad en el proyecto packagist, que permitía ejecutar comandos arbitrarios en la máquina que ejecuta el servidor de paquetes.


El fallo se encuentra en el campo de subida desde un repositorio VCS (Git/Mercurial/Subversion) para crear un proyecto desde la url. Para el valor de este campo se estaba empleando un comando shell que no escapaba el parámetro introducido, lo que hacía posible introducir valores como '$(comando_a_ejecutar)' para realizar cualquier acción en la máquina, como podría ser tomar el control de la misma, o modificar los paquetes subidos con fines maliciosos.

Demostración de cómo se explota la vulnerabilidad. Fuente: Max Justicz Blog.

El investigador, notificó el fallo al equipo de packagist, el cual solucionó la vulnerabilidad rápidamente. No se tiene información de que este error haya sido aprovechado con anterioridad. En caso de tener un servidor packagist público (el proyecto es de código abierto), se recomienda actualizar inmediatamente o restringir las subidas de paquetes hasta solucionar el problema.

Al desarrollar, deben extremarse las precauciones al ejecutar comandos del sistema, al tratarse de un punto crítico que permite vulnerabilidades RCE (Remote Code Execution), sobre todo si se usan parámetros que son introducidos por el usuario. En vez de escapar deliberadamente los argumentos, es recomendable utilizar funciones seguras que escapen los argumentos por defecto, como es el caso de las funciones del módulo subprocess de Python.

No es la primera vez que se encuentra una vulnerabilidad en un servidor de paquetes, con el riesgo de descargar paquetes infectados en producción. Para impedir este tipo de ataques, los gestores de paquetes de los diferentes lenguajes de programación, deben incluir el hash del paquete descargado en desarrollo, como ya ocurre en NodeJS con npm (package-lock.json) y con el nuevo estándar de Python: Pipfile. La vulnerabilidad encontrada pone de manifiesto la necesidad de incluir una medida similar en Composer.




Juan José Oyague
joyague@hispasec.com


Más información:

Remote Code Execution on packagist.org:
https://justi.cz/security/2018/08/28/packagist-org-rce.html