Se identifico una vulnerabilidad en Composer que compromete el repositorio PHP de Packagist

mayo 03, 2021 , 0 Comments

Hace pocos dias se dio a conocer la noticia de que se ha identificado una vulnerabilidad crítica en el administrador de dependencias de Composer (CVE-2021-29472) que permite ejecutar comandos arbitrarios en el sistema al procesar un paquete con un valor de URL especialmente formado que determina la dirección para descargar el código fuente.

El problema se manifiesta en los componentes GitDriver, SvnDriver y HgDriver utilizados con los sistemas de control de fuente Git, Subversion y Mercurial. La vulnerabilidad se corrigió en las versiones Composer 1.10.22 y 2.0.13.

En particular, el repositorio de paquetes Packagist predeterminado de Composer, que contiene 306.000 paquetes de desarrollador PHP y ofrece más de 1.400 millones de descargas mensuales, se ve particularmente afectado.

En el ecosistema PHP, Composer es la principal herramienta para administrar e instalar dependencias de software. Los equipos de desarrollo de todo el mundo lo utilizan para facilitar el proceso de actualización y garantizar que las aplicaciones funcionen sin esfuerzo en todos los entornos y versiones.

El experimento mostró que si había información sobre el problema, los atacantes podían tomar el control de la infraestructura de Packagist e interceptar las credenciales de los mantenedores o redirigir la descarga de paquetes a un servidor de terceros, organizando la entrega de variantes de paquetes con cambios maliciosos a sustituir una puerta trasera durante la instalación de dependencias.

El peligro para los usuarios finales está limitado por el hecho de que el contenido de composer.json suele estar definido por el usuario y los enlaces a la fuente se pasan al acceder a repositorios de terceros, que suelen ser fiables. El golpe principal recayó sobre el repositorio Packagist.org y el servicio Private Packagist, que llaman a Composer con la transferencia de datos recibidos de los usuarios. Los atacantes podrían ejecutar su código en servidores Packagist colocando un paquete especialmente diseñado.

El equipo de Packagist resolvió la vulnerabilidad dentro de las 12 horas posteriores a la notificación de la vulnerabilidad. Los investigadores notificaron en forma privada a los desarrolladores de Packagist el 22 de abril y el problema se solucionó el mismo día. Una actualización pública de Composer con una solución para la vulnerabilidad se publicó el 27 de abril y los detalles se revelaron el 28 de abril. Una auditoría de los registros en los servidores de Packagist no reveló ninguna actividad sospechosa asociada con la vulnerabilidad.

Los errores de inyección de argumentos son una clase de errores realmente interesante que a menudo se pasan por alto durante las revisiones de código y se pasan por alto por completo en las interacciones de caja negra

El problema se debe a un error en el código de validación de URL en el archivo raíz composer.json y en los enlaces de descarga de origen. El error ha estado presente en el código desde noviembre de 2011. Packagist usa capas especiales para administrar las descargas de código sin estar vinculado a un sistema de control de fuente específico, que se ejecuta llamando a «fromShellCommandline» con argumentos de línea de comando.

El meollo del problema es que el método ProcessExecutor permitió especificar cualquier parámetro de llamada adicional en la URL. Tal escape faltaba en los controladores GitDriver.php, SvnDriver.php y HgDriver.php. El ataque GitDriver.php se vio obstaculizado por el hecho de que el comando «git ls-remote» no admitía la especificación de argumentos adicionales después de la ruta.

Un ataque a HgDriver.php resultó posible pasando el parámetro «–config» a la utilidad «hq», que permite organizar la ejecución de cualquier comando manipulando la configuración «alias.identify».

Al enviar un paquete de prueba con una URL similar a Packagist, los investigadores se aseguraron de que después de ser publicado, su servidor recibiera una solicitud HTTP de uno de los servidores de Packagist en AWS que contenía una lista de los archivos en el directorio actual.

Cabe señalar que los mantenedores no identificaron ningún signo de explotación previa de esta vulnerabilidad en la instancia pública del packagist.

Finalmente si estás interesado en conocer más al respecto, puedes consultar los detalles en el siguiente enlace.


Some say he’s half man half fish, others say he’s more of a seventy/thirty split. Either way he’s a fishy bastard.