La forma en que la plataforma GitHub Actions almacena los artefactos de construcción podría permitir a los atacantes inyectar código malicioso en proyectos de software con flujos de trabajo CI/CD (integración continua y entrega continua) que no realizan un filtrado adecuado al descargar artefactos. Los investigadores de ciberseguridad han identificado varios scripts de descarga de artefactos populares utilizados por miles de repositorios que son vulnerables a este problema.
“Descubrimos que cuando los artefactos se transfieren entre diferentes flujos de trabajo, existe un riesgo importante de envenenamiento de artefactos, una técnica en la que un atacante sustituye el contenido de un artefacto legítimo por un artefacto malicioso modificado para lanzar un ataque a la cadena de suministro”, del proveedor Los investigadores de la empresa de seguridad de la cadena Legit Security dijeron al analizar el problema.
Para atacar un proyecto vulnerable CI/CD pipeline que descarga y consume artefactos generados por otros flujos de trabajo, un atacante sólo necesitaría bifurcar el repositorio que contiene esos flujos de trabajo y modificarlos en la copia local para que generen artefactos falsos y luego devolver pull requests al repositorio original que no necesita aceptar estas solicitudes.
Fallo lógico en la API de almacenamiento de artefactos
GitHub Actions es una plataforma CI/CD para automatizar la creación y las pruebas de código de software. El servicio es gratuito para los repositorios públicos e incluye espacio de almacenamiento y tiempo de ejecución para los repositorios privados. Es ampliamente adoptado por proyectos que utilizan GitHub para alojar y gestionar sus repositorios de código fuente.

1 segundo de 27 segundosVolumen 0%
Los flujos de trabajo de Acciones de GitHub son procesos automatizados definidos en archivos .yml utilizando sintaxis YAML que se ejecutan cuando se producen determinados desencadenantes o eventos, como cuando se confirma nuevo código en un repositorio. Los artefactos de compilación son binarios compilados, registros y otros archivos que resultan de la ejecución de un flujo de trabajo y sus tareas individuales. Estos artefactos se guardan en cubos, y a cada ejecución de flujo de trabajo se le asigna un cubo específico desde el que puede cargar y posteriormente descargar archivos.
La “acción” (script) de referencia proporcionada por GitHub para descargar artefactos no admite la descarga de artefactos entre flujos de trabajo, pero la reutilización de artefactos generados por diferentes flujos de trabajo como entrada para pasos de compilación posteriores es un caso de uso común en los proyectos de software. Por eso los desarrolladores crean sus propios scripts personalizados que se basan en la API de acciones de GitHub para utilizar filtros más complejos para descargar artefactos, como los creados por archivos de flujo de trabajo específicos, usuarios específicos, ramas específicas, etc.
El problema descubierto por Legit Security es que la API no diferencia entre artefactos subidos por repositorios bifurcados y repositorios base, por lo que si un script de descarga filtra artefactos generados por un archivo de flujo de trabajo específico de un repositorio específico, la API servirá la última versión de los artefactos generados por ese archivo, Pero esta podría ser una versión maliciosa generada automáticamente a través de una operación pull request desde una versión bifurcada del repositorio.
“En pocas palabras: en un flujo de trabajo vulnerable, cualquier usuario de GitHub puede crear una rama que construye un artefacto”, dijeron los investigadores. “A continuación, este artefacto se inyecta en el proceso de creación del repositorio original y se modifica su resultado. Se trata de otra forma de ataque a la cadena de suministro de software en la que el atacante modifica el resultado de la compilación.
Los investigadores descubrieron cuatro acciones personalizadas desarrolladas por la comunidad para descargar todos los artefactos vulnerables. Una de ellas aparece como dependencia en más de 12.000 repositorios.
Ejemplo oxidado
Uno de los repositorios que utiliza este tipo de scripts personalizados en uno de sus flujos de trabajo es el repositorio oficial del lenguaje de programación Rust. El flujo de trabajo vulnerable llamado ci.yml es responsable de construir y probar el código del repositorio y utiliza una acción personalizada para descargar un artefacto llamado libgccjit.so (un archivo de biblioteca de Linux), que es proporcionado por un repositorio de terceros. Generación del flujo de trabajo.
Todo lo que un atacante tiene que hacer es bifurcar un repositorio de terceros, modificar el flujo de trabajo de ese repositorio para producir una versión maliciosa de la biblioteca, y emitir una solicitud de pull al repositorio original para producir el artefacto. Si un flujo de trabajo de Rust introdujera posteriormente una versión envenenada de la biblioteca, un atacante podría ejecutar código malicioso en el repositorio de Rust utilizando los permisos del flujo de trabajo.
“Una vez explotado, un atacante podría modificar las ramas del repositorio, pull requests, issues, releases y todas las entidades disponibles para los permisos de workflow token”, dijeron los investigadores.
Los usuarios deben aplicar un filtro más estricto a las descargas de artefactos
GitHub respondió al informe de Legit añadiendo más capacidades de filtrado a la API que los desarrolladores pueden utilizar para identificar mejor los artefactos creados por una instancia específica en ejecución de un flujo de trabajo (ID de ejecución del flujo de trabajo). Sin embargo, este cambio no puede ser forzado en las implementaciones existentes sin romper los flujos de trabajo, por lo que los usuarios tendrán que actualizar sus flujos de trabajo con un filtrado más estricto con el fin de estar protegidos.
Otra mitigación es filtrar los artefactos descargados por el hash del commit que los generó, o excluir completamente los artefactos creados por pull requests usando la opción exclude_pull_requests. Legit Security también se puso en contacto con el autor del script de descarga de artefactos personalizado vulnerable que descubrieron.
“Cuando se trata de la seguridad de la cadena de suministro, el enfoque siempre ha sido evitar que la gente contribuya con código malicioso, por lo que cada vez que haces un cambio en un repositorio, creas un pull request o haces una solicitud de cambio, GitHub tiene un montón de controles de validación incorporados”, dijo a CSO el Director de Tecnología de Legit Security, Liav Caspi. “Alguien tiene que aprobar tu código, alguien tiene que fusionarlo, así que alguien está involucrado. Lo que hemos estado tratando de encontrar son técnicas que exploten problemas lógicos en los que cualquiera pueda influir sin revisión, y creo que esta es una de ellas . Si alguien lo supiera, podría inyectar el artefacto sin ninguna aprobación”.”
Caspi explica que, normalmente, el flujo de trabajo de una canalización CI se ejecutará automáticamente en una solicitud de extracción para probar el código antes de revisarlo manualmente, y si la solicitud contiene algún artefacto que deba construirse, el flujo de trabajo lo hará. Dijo que un atacante sofisticado podría crear una pull request para construir un artefacto y luego borrar la solicitud cerrando el commit, y todo el ruido de actividad presente en los repositorios de código fuente actuales pasaría muy probablemente desapercibido y pasaría desapercibido.