Gh Actions - Context Script Injections
Informations de base
Notez qu'il existe certains contextes github dont les valeurs sont contrôlées par l'utilisateur créant la PR. Si l'action github utilise ces données pour exécuter quelque chose, cela pourrait conduire à une exécution de code arbitraire. Ces contextes se terminent généralement par body
, default_branch
, email
, head_ref
, label
, message
, name
, page_name
,ref
, et title
. Par exemple (liste issue de ce 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
Notez qu'il existe 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é. Par exemple, zzz";echo${IFS}"hello";#
serait un nom de branche valide et pourrait être un vecteur d'attaque possible pour un dépôt cible.
Exemple d'une attaque par injection de script
Une attaque par injection de script peut se produire directement dans le script en ligne d'un workflow. Dans l'exemple suivant, une action utilise une expression pour tester la validité d'un titre de pull request, mais ajoute également le risque d'injection de script :
Avant l'exécution du script shell, les expressions à l'intérieur de ${{ }}
sont évaluées puis remplacées par les valeurs résultantes, ce qui peut le rendre vulnérable à l'injection de commandes shell.
Pour injecter des commandes dans ce workflow, l'attaquant pourrait créer une pull request 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 à la commande ls
d'être exécutée sur le runner.
Dernière mise à jour