Entender el riesgo de las inyecciones de código
Cuando cree flujos de trabajo, acciones personalizadas y acciones compuestas, siempre debe plantearse si el código podría ejecutar entradas no fiables de atacantes. Esto puede ocurrir cuando un atacante agrega comandos y scripts malintencionados a un contexto. Cuando tu flujo de trabajo se ejecuta, estas secuencias podrían interpretarse como código que luego se ejecutará en el ejecutor.
Los atacantes pueden agregar su propio contenido malintencionado al contexto de github, que se debe tratar como una entrada potencialmente no fiable. Normalmente, estos contextos terminan con body, default_branch, email, head_ref, label, message, name, page_name, ref y title. Por ejemplo: github.event.issue.title o github.event.pull_request.body.
Debes asegurarte de que estos valores no fluyan directamente hacia los flujos de trabajo, acciones, llamados a las API ni a cualquier otro lugar en donde se puedan itnerpretar como còdigo ejecutable. Al adoptar el mismo enfoque de programación defensiva que usaría con cualquier otro código de aplicación privilegiado, puede contribuir a reforzar la seguridad al usar GitHub Actions. Para obtener información sobre algunos de los pasos que podría realizar un atacante, consulta Referencia de uso seguro.
Además, hay otras fuentes menos obvias de entradas no confiables, tales como los nombres de rama y las direcciones de correo electrónico, que pueden ser bastante flexibles en su contenido permitido. Por ejemplo, zzz";echo${IFS}"hello";# sería un nombre de rama válido y un posible vector de ataque para un repositorio de destino.
Las siguientes secciones explican còmo puedes ayudar a mitigar el riesgo de inyecciòn de scripts.
Ejemplo de un ataque de inyecciòn de scripts
Un ataque de inyección de scripts puede ocurrir directamente dentro del script en línea de un flujo de trabajo. En el siguiente ejemplo, una acción utiliza una expresión para probar la validez del título de una solicitud de cambios, pero también agrega el riesgo de ocasionar una inyección de scripts:
- name: Check PR title
run: |
title="${{ github.event.pull_request.title }}"
if [[ $title =~ ^octocat ]]; then
echo "PR title starts with 'octocat'"
exit 0
else
echo "PR title did not start with 'octocat'"
exit 1
fi
Este ejemplo es vulnerable a la inyección de scripts, ya que el comando run se ejecuta en un script de shell temporal en el ejecutor. Antes de ejecutar el script de shell, las expresiones dentro ${{ }} se evalúan y, a continuación, se sustituyen por los valores resultantes, lo que puede hacer que sea vulnerable a la inserción de comandos del shell.
Para insertar comandos en este flujo de trabajo, el atacante podría crear una solicitud de incorporación de cambios denominada a"; ls $GITHUB_WORKSPACE":

En este ejemplo, el carácter " se utiliza para interrumpir la sentencia title="${{ github.event.pull_request.title }}", lo que permite que el comando ls se ejecute en el runner. Puede ver la salida del comando ls en el registro:
Run title="a"; ls $GITHUB_WORKSPACE""
README.md
code.yml
example.js
Para conocer las mejores prácticas de seguridad de los runners, consulta Referencia de uso seguro.