Gh Actions - Context Script Injections

Support HackTricks

Grundinformationen

Beachten Sie, dass es bestimmte GitHub-Kontexte gibt, deren Werte von dem Benutzer kontrolliert werden, der den PR erstellt. Wenn die GitHub-Aktion diese Daten verwendet, um irgendetwas auszuführen, könnte dies zu willkürlicher Codeausführung führen. Diese Kontexte enden typischerweise mit body, default_branch, email, head_ref, label, message, name, page_name, ref und title. Zum Beispiel (Liste aus diesem Bericht):

  • github.event.comment.body

  • github.event.issue.body

  • github.event.issue.title

  • github.head_ref

  • github.pull_request.*

  • github.*.*.authors.name

  • github.*.*.authors.email

Beachten Sie, dass es weniger offensichtliche Quellen für potenziell nicht vertrauenswürdige Eingaben gibt, wie z.B. Branch-Namen und E-Mail-Adressen, die in Bezug auf ihren erlaubten Inhalt recht flexibel sein können. Zum Beispiel wäre zzz";echo${IFS}"hello";# ein gültiger Branch-Name und könnte ein möglicher Angriffsvektor für ein Ziel-Repository sein.

Beispiel eines Skriptinjektionsangriffs

Ein Skriptinjektionsangriff kann direkt innerhalb des Inline-Skripts eines Workflows auftreten. Im folgenden Beispiel verwendet eine Aktion einen Ausdruck, um die Gültigkeit eines Pull-Request-Titels zu testen, fügt jedoch auch das Risiko einer Skriptinjektion hinzu:

- 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

Bevor das Shell-Skript ausgeführt wird, werden die Ausdrücke innerhalb von ${{ }} ausgewertet und dann mit den resultierenden Werten ersetzt, was es anfällig für Shell-Befehlsinjektionen machen kann.

Um Befehle in diesen Workflow einzufügen, könnte der Angreifer eine Pull-Anfrage mit dem Titel a"; ls $GITHUB_WORKSPACE" erstellen.

In diesem Beispiel wird das "-Zeichen verwendet, um die title="${{ github.event.pull_request.title }}"-Anweisung zu unterbrechen, wodurch der ls-Befehl auf dem Runner ausgeführt werden kann.

Last updated