Gh Actions - Context Script Injections

Support HackTricks

Basic Information

Note that there are certain github contexts whose values are contrôlés par l'utilisateur créant le PR. If the github action is using that data to execute anything, it could lead to exécution de code arbitraire. These contexts typically end with body, default_branch, email, head_ref, label, message, name, page_name,ref, and title. For example (list from this writeup):

  • github.event.comment.body

  • github.event.issue.body

  • github.event.issue.title

  • github.head_ref

  • github.pull_request.*

  • github.*.*.authors.name

  • github.*.*.authors.email

Note that here are des sources moins évidentes d'entrées potentiellement non fiables, telles que les noms de branches et les adresses e-mail, qui peuvent être assez flexibles en termes de contenu autorisé. For example, zzz";echo${IFS}"hello";# would be a valid branch name and would be a possible attack vector for a target repository.

Example of a script injection attack

A script injection attack can occur directly within a workflow's inline script. In the following example, an action uses an expression to test the validity of a pull request title, but also adds the risk of script injection:

- 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

Avant que le script shell ne soit exécuté, les expressions à l'intérieur de ${{ }} sont évaluées puis substituées par les valeurs résultantes, ce qui peut les rendre vulnérables à l'injection de commandes shell.

Pour injecter des commandes dans ce flux de travail, l'attaquant pourrait créer une demande de tirage avec un titre de a"; ls $GITHUB_WORKSPACE"

Dans cet exemple, le caractère " est utilisé pour interrompre l'instruction title="${{ github.event.pull_request.title }}", permettant ainsi l'exécution de la commande ls sur le runner.

Support HackTricks

Last updated