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.
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.
Más información:
- Remote Code Execution on packagist.org: https://justi.cz/security/2018/08/28/packagist-org-rce.html
Fuente: Hispasec