From 2699fb42a398a68e59de92506a940d992dc21974 Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 25 Jun 2025 00:23:23 +0000 Subject: [PATCH] Translated ['src/pentesting-ci-cd/github-security/abusing-github-actions --- src/images/CH_logo_ads.png | Bin 0 -> 27107 bytes .../abusing-github-actions/README.md | 103 ++++++++++++------ 2 files changed, 72 insertions(+), 31 deletions(-) create mode 100644 src/images/CH_logo_ads.png diff --git a/src/images/CH_logo_ads.png b/src/images/CH_logo_ads.png new file mode 100644 index 0000000000000000000000000000000000000000..b407c8929d67e14a8e254ad9bc76ac1e9f8525f7 GIT binary patch literal 27107 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 [!WARNING] -> Github debería liberar un [**flujo**](https://github.com/github/roadmap/issues/74) que **permita el acceso entre repositorios** dentro de GitHub, para que un repositorio pueda acceder a otros repositorios internos utilizando el `GITHUB_TOKEN`. +> Github debería lanzar un [**flujo**](https://github.com/github/roadmap/issues/74) que **permita el acceso entre repositorios** dentro de GitHub, para que un repositorio pueda acceder a otros repositorios internos utilizando el `GITHUB_TOKEN`. Puedes ver los posibles **permisos** de este token en: [https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token](https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token) @@ -81,7 +91,7 @@ https://api.github.com/repos///pulls \ {{#endtabs }} > [!CAUTION] -> Tenga en cuenta que en varias ocasiones podrá encontrar **tokens de usuario de github dentro de los entornos de Github Actions o en los secretos**. Estos tokens pueden otorgarle más privilegios sobre el repositorio y la organización. +> Ten en cuenta que en varias ocasiones podrás encontrar **tokens de usuario de github dentro de los entornos de Github Actions o en los secretos**. Estos tokens pueden darte más privilegios sobre el repositorio y la organización.
@@ -179,13 +189,13 @@ El desencadenador de flujo de trabajo **`pull_request`** ejecutará el flujo de
> [!NOTE] -> Como la **limitación predeterminada** es para **contribuyentes de primera vez**, podrías contribuir **corrigiendo un error/tipografía válido** y luego enviar **otras PRs para abusar de tus nuevos privilegios de `pull_request`**. +> Como la **limitación predeterminada** es para **contribuyentes primerizos**, podrías contribuir **corrigiendo un error/tipografía válido** y luego enviar **otras PRs para abusar de tus nuevos privilegios de `pull_request`**. > > **Probé esto y no funciona**: ~~Otra opción sería crear una cuenta con el nombre de alguien que contribuyó al proyecto y eliminó su cuenta.~~ Además, por defecto **previene permisos de escritura** y **acceso a secretos** al repositorio objetivo como se menciona en la [**documentación**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflows-in-forked-repositories): -> Con la excepción de `GITHUB_TOKEN`, **los secretos no se pasan al runner** cuando un flujo de trabajo es desencadenado desde un repositorio **forked**. El **`GITHUB_TOKEN` tiene permisos de solo lectura** en solicitudes de extracción **de repositorios forked**. +> Con la excepción de `GITHUB_TOKEN`, **los secretos no se pasan al runner** cuando se desencadena un flujo de trabajo desde un repositorio **forked**. El **`GITHUB_TOKEN` tiene permisos de solo lectura** en solicitudes de extracción **de repositorios forked**. Un atacante podría modificar la definición de la Github Action para ejecutar cosas arbitrarias y agregar acciones arbitrarias. Sin embargo, no podrá robar secretos ni sobrescribir el repositorio debido a las limitaciones mencionadas. @@ -201,7 +211,7 @@ El desencadenador de flujo de trabajo **`pull_request_target`** tiene **permiso Ten en cuenta que el desencadenador de flujo de trabajo **`pull_request_target`** **se ejecuta en el contexto base** y no en el proporcionado por la PR (para **no ejecutar código no confiable**). Para más información sobre `pull_request_target`, [**consulta la documentación**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target).\ Además, para más información sobre este uso específico y peligroso, consulta este [**post del blog de github**](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/). -Puede parecer que debido a que el **flujo de trabajo ejecutado** es el definido en la **base** y **no en la PR**, es **seguro** usar **`pull_request_target`**, pero hay **algunos casos en los que no lo es**. +Puede parecer que, dado que el **flujo de trabajo ejecutado** es el definido en la **base** y **no en la PR**, es **seguro** usar **`pull_request_target`**, pero hay **algunos casos en los que no lo es**. Y este tendrá **acceso a secretos**. @@ -219,14 +229,14 @@ types: ``` Además, según la documentación: El flujo de trabajo iniciado por el evento `workflow_run` puede **acceder a secretos y escribir tokens, incluso si el flujo de trabajo anterior no lo fue**. -Este tipo de flujo de trabajo podría ser atacado si **depende** de un **flujo de trabajo** que puede ser **activado** por un usuario externo a través de **`pull_request`** o **`pull_request_target`**. Un par de ejemplos vulnerables se pueden [**encontrar en este blog**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability)**.** El primero consiste en que el flujo de trabajo activado por **`workflow_run`** descarga el código del atacante: `${{ github.event.pull_request.head.sha }}`\ +Este tipo de flujo de trabajo podría ser atacado si **depende** de un **flujo de trabajo** que puede ser **activado** por un usuario externo a través de **`pull_request`** o **`pull_request_target`**. Un par de ejemplos vulnerables pueden ser [**encontrados en este blog**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability)**.** El primero consiste en que el flujo de trabajo activado por **`workflow_run`** descarga el código del atacante: `${{ github.event.pull_request.head.sha }}`\ El segundo consiste en **pasar** un **artifact** del código **no confiable** al flujo de trabajo **`workflow_run`** y usar el contenido de este artifact de una manera que lo haga **vulnerable a RCE**. ### `workflow_call` TODO -TODO: Verificar si al ejecutarse desde un pull_request el código utilizado/descargado es el de la fuente o el del PR bifurcado. +TODO: Verificar si al ejecutarse desde un pull_request el código utilizado/descargado es el del origen o del PR bifurcado. ## Abusando de la Ejecución Bifurcada @@ -269,10 +279,10 @@ message: | ¡Gracias! -El código potencialmente **no confiable se está ejecutando durante `npm install` o `npm build`** ya que los scripts de construcción y los **paquetes referenciados son controlados por el autor del PR**. +El código **no confiable potencialmente se está ejecutando durante `npm install` o `npm build`** ya que los scripts de construcción y los **paquetes referenciados son controlados por el autor del PR**. > [!WARNING] -> Un dork de github para buscar acciones vulnerables es: `event.pull_request pull_request_target extension:yml`, sin embargo, hay diferentes formas de configurar los trabajos para que se ejecuten de manera segura incluso si la acción está configurada de manera insegura (como usar condicionales sobre quién es el actor que genera el PR). +> Un dork de github para buscar acciones vulnerables es: `event.pull_request pull_request_target extension:yml` sin embargo, hay diferentes formas de configurar los trabajos para que se ejecuten de manera segura incluso si la acción está configurada de manera insegura (como usar condicionales sobre quién es el actor que genera el PR). ### Inyecciones de Script en Contexto @@ -286,19 +296,59 @@ gh-actions-context-script-injections.md Según la documentación: Puede hacer que una **variable de entorno esté disponible para cualquier paso posterior** en un trabajo de flujo de trabajo definiendo o actualizando la variable de entorno y escribiendo esto en el archivo de entorno **`GITHUB_ENV`**. -Si un atacante pudiera **inyectar cualquier valor** dentro de esta **variable env**, podría inyectar variables de entorno que podrían ejecutar código en pasos posteriores como **LD_PRELOAD** o **NODE_OPTIONS**. +Si un atacante pudiera **inyectar cualquier valor** dentro de esta variable **env**, podría inyectar variables de entorno que podrían ejecutar código en pasos posteriores como **LD_PRELOAD** o **NODE_OPTIONS**. -Por ejemplo ([**esto**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability-0) y [**esto**](https://www.legitsecurity.com/blog/-how-we-found-another-github-action-environment-injection-vulnerability-in-a-google-project)), imagina un flujo de trabajo que confía en un artifact subido para almacenar su contenido dentro de la variable de entorno **`GITHUB_ENV`**. Un atacante podría subir algo como esto para comprometerlo: +Por ejemplo ([**esto**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability-0) y [**esto**](https://www.legitsecurity.com/blog/-how-we-found-another-github-action-environment-injection-vulnerability-in-a-google-project)), imagine un flujo de trabajo que confía en un artifact subido para almacenar su contenido dentro de la variable de entorno **`GITHUB_ENV`**. Un atacante podría subir algo como esto para comprometerlo:
+### Dependabot y otros bots de confianza + +Como se indica en [**esta publicación de blog**](https://boostsecurity.io/blog/weaponizing-dependabot-pwn-request-at-its-finest), varias organizaciones tienen una Acción de Github que fusiona cualquier PRR de `dependabot[bot]` como en: +```yaml +on: pull_request_target +jobs: +auto-merge: +runs-on: ubuntu-latest +if: ${ { github.actor == 'dependabot[bot]' }} +steps: +- run: gh pr merge $ -d -m +``` +Lo cual es un problema porque el campo `github.actor` contiene al usuario que causó el último evento que activó el flujo de trabajo. Y hay varias formas de hacer que el usuario `dependabot[bot]` modifique un PR. Por ejemplo: + +- Hacer un fork del repositorio de la víctima +- Agregar la carga útil maliciosa a tu copia +- Habilitar Dependabot en tu fork añadiendo una dependencia desactualizada. Dependabot creará una rama corrigiendo la dependencia con código malicioso. +- Abrir un Pull Request al repositorio de la víctima desde esa rama (el PR será creado por el usuario, así que aún no pasará nada) +- Luego, el atacante regresa al PR inicial que Dependabot abrió en su fork y ejecuta `@dependabot recreate` +- Luego, Dependabot realiza algunas acciones en esa rama, que modificaron el PR sobre el repositorio de la víctima, lo que hace que `dependabot[bot]` sea el actor del último evento que activó el flujo de trabajo (y por lo tanto, el flujo de trabajo se ejecuta). + +Pasando a otro tema, ¿qué pasaría si en lugar de fusionar, la Acción de Github tuviera una inyección de comandos como en: +```yaml +on: pull_request_target +jobs: +just-printing-stuff: +runs-on: ubuntu-latest +if: ${ { github.actor == 'dependabot[bot]' }} +steps: +- run: echo ${ { github.event.pull_request.head.ref }} +``` +Bueno, la publicación del blog original propone dos opciones para abusar de este comportamiento, siendo la segunda: + +- Hacer un fork del repositorio de la víctima y habilitar Dependabot con alguna dependencia desactualizada. +- Crear una nueva rama con el código de inyección de shell malicioso. +- Cambiar la rama predeterminada del repositorio a esa. +- Crear un PR desde esta rama al repositorio de la víctima. +- Ejecutar `@dependabot merge` en el PR que Dependabot abrió en su fork. +- Dependabot fusionará sus cambios en la rama predeterminada de tu repositorio bifurcado, actualizando el PR en el repositorio de la víctima, haciendo que ahora `dependabot[bot]` sea el actor del último evento que activó el flujo de trabajo y utilizando un nombre de rama malicioso. + ### Acciones de Github de Terceros Vulnerables #### [dawidd6/action-download-artifact](https://github.com/dawidd6/action-download-artifact) -Como se mencionó en [**esta publicación de blog**](https://www.legitsecurity.com/blog/github-actions-that-open-the-door-to-cicd-pipeline-attacks), esta Acción de Github permite acceder a artifacts de diferentes flujos de trabajo e incluso repositorios. +Como se menciona en [**esta publicación del blog**](https://www.legitsecurity.com/blog/github-actions-that-open-the-door-to-cicd-pipeline-attacks), esta Acción de Github permite acceder a artefactos de diferentes flujos de trabajo e incluso repositorios. -El problema es que si el parámetro **`path`** no está configurado, el artifact se extrae en el directorio actual y puede sobrescribir archivos que podrían ser utilizados o incluso ejecutados más tarde en el flujo de trabajo. Por lo tanto, si el Artifact es vulnerable, un atacante podría abusar de esto para comprometer otros flujos de trabajo que confían en el Artifact. +El problema es que si el parámetro **`path`** no está configurado, el artefacto se extrae en el directorio actual y puede sobrescribir archivos que podrían ser utilizados o incluso ejecutados en el flujo de trabajo. Por lo tanto, si el artefacto es vulnerable, un atacante podría abusar de esto para comprometer otros flujos de trabajo que confían en el artefacto. Ejemplo de flujo de trabajo vulnerable: ```yaml @@ -347,16 +397,16 @@ path: ./script.py Si una cuenta cambia su nombre, otro usuario podría registrar una cuenta con ese nombre después de un tiempo. Si un repositorio tenía **menos de 100 estrellas antes del cambio de nombre**, Github permitirá que el nuevo usuario registrado con el mismo nombre cree un **repositorio con el mismo nombre** que el eliminado. > [!CAUTION] -> Así que si una acción está utilizando un repositorio de una cuenta no existente, aún es posible que un atacante pueda crear esa cuenta y comprometer la acción. +> Así que si una acción está utilizando un repositorio de una cuenta no existente, todavía es posible que un atacante pueda crear esa cuenta y comprometer la acción. -Si otros repositorios estaban utilizando **dependencias de los repositorios de este usuario**, un atacante podrá secuestrarlos. Aquí tienes una explicación más completa: [https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/](https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/) +Si otros repositorios estaban utilizando **dependencias de estos repositorios de usuario**, un atacante podrá secuestrarlos. Aquí tienes una explicación más completa: [https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/](https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/) --- ## Pivotar Repositorio > [!NOTE] -> En esta sección hablaremos sobre técnicas que permitirían **pivotar de un repositorio a otro** suponiendo que tenemos algún tipo de acceso al primero (ver la sección anterior). +> En esta sección hablaremos sobre técnicas que permitirían **pivotar de un repositorio a otro** suponiendo que tenemos algún tipo de acceso en el primero (ver la sección anterior). ### Envenenamiento de Caché @@ -536,18 +586,9 @@ Incluso si **Github** intenta **detectar valores secretos** en los registros de (Técnica de [**aquí**](https://divyanshu-mehta.gitbook.io/researchs/hijacking-cloud-ci-cd-systems-for-fun-and-profit)) Primero que nada, cualquier PR levantada es claramente visible al público en Github y a la cuenta de GitHub objetivo. En GitHub, por defecto, **no podemos eliminar un PR de internet**, pero hay un giro. Para las cuentas de Github que están **suspendidas** por Github, todos sus **PRs son eliminados automáticamente** y removidos de internet. Así que, para ocultar tu actividad, necesitas o bien hacer que tu **cuenta de GitHub sea suspendida o que tu cuenta sea marcada**. Esto **ocultará todas tus actividades** en GitHub de internet (básicamente eliminará todos tus PR de explotación). -Una organización en GitHub es muy proactiva en reportar cuentas a GitHub. Todo lo que necesitas hacer es compartir "algunas cosas" en un Issue y se asegurarán de que tu cuenta sea suspendida en 12 horas :p y ahí lo tienes, has hecho tu explotación invisible en github. +Una organización en GitHub es muy proactiva en reportar cuentas a GitHub. Todo lo que necesitas hacer es compartir “algunas cosas” en un Issue y se asegurarán de que tu cuenta sea suspendida en 12 horas :p y ahí lo tienes, has hecho tu explotación invisible en github. > [!WARNING] -> La única forma en que una organización puede darse cuenta de que ha sido objetivo es revisar los registros de GitHub desde SIEM, ya que desde la interfaz de GitHub el PR sería eliminado. - -## Herramientas - -Las siguientes herramientas son útiles para encontrar flujos de trabajo de Github Action e incluso encontrar algunos vulnerables: - -- [https://github.com/CycodeLabs/raven](https://github.com/CycodeLabs/raven) -- [https://github.com/praetorian-inc/gato](https://github.com/praetorian-inc/gato) -- [https://github.com/AdnaneKhan/Gato-X](https://github.com/AdnaneKhan/Gato-X) -- [https://github.com/carlospolop/PurplePanda](https://github.com/carlospolop/PurplePanda) +> La única forma en que una organización puede darse cuenta de que ha sido objetivo es revisar los registros de GitHub desde SIEM, ya que desde la interfaz de usuario de GitHub el PR sería eliminado. {{#include ../../../banners/hacktricks-training.md}}