Skip to main content

Skripteinfügungen

Informationen zu den Sicherheitsrisiken im Zusammenhang mit Skripteinfügungen und GitHub Actions-Workflows

Informationen zum Risiko der Skripteinschleusung

Beim Erstellen von Workflows, benutzerdefinierten Aktionen und zusammengesetzten Aktionen sollten Sie immer überprüfen, ob dein Code gegebenenfalls nicht vertrauenswürdige Eingaben von Angreiferinnen ausführen kann. Dies kann passieren, wenn Angreiferinnen bösartige Befehle und Skripts zu einem Kontext hinzufügen. Bei der Ausführung deines Workflows werden diese Zeichenfolgen möglicherweise als Code interpretiert, der dann im Runner ausgeführt wird.

Angreifer*innen können dem github-Kontext eigene bösartige Inhalte hinzufügen, die als potenziell nicht vertrauenswürdige Eingaben behandelt werden sollten. Diese Kontexte enden üblicherweise auf body, default_branch, email, head_ref, label, message, name, page_name,ref und title. Beispiel: github.event.issue.title oder github.event.pull_request.body

Du solltest sicherstellen, dass diese Werte nicht direkt in Workflows, Aktionen, API-Aufrufen oder an anderen Stellen eingefügt werden, an denen sie als ausführbarer Code interpretiert werden können. Indem du denselben defensiven Programmieransatz wie bei anderem privilegiertem Anwendungscode verwendest, kannst du zur Sicherheitshärtung bei der Verwendung von GitHub Actions beitragen. Informationen zu möglichen Schritten, die ein Angreifer ausführen kann, findest du unter Referenz zur sicheren Verwendung.

Darüber hinaus gibt es weitere weniger offensichtliche Quellen für potenziell nicht vertrauenswürdige Eingaben. Dazu zählen z. B. Verzweigungsnamen und E-Mail-Adressen, die in Bezug auf ihre zulässigen Inhalte ziemlich flexibel sein können. zzz";echo${IFS}"hello";# ist beispielsweise ein zulässiger Verzweigungsname, der ein möglicher Angriffsvektor für ein Zielrepository wäre.

In den folgenden Abschnitten wird erläutert, wie du das Risiko der Skripteinschleusung verringern kannst.

Beispiel für einen Angriff durch Skripteinschleusung

Ein Angriff durch Skripteinschleusung kann direkt innerhalb des Inlineskripts eines Workflows auftreten. Im folgenden Beispiel verwendet eine Aktion einen Ausdruck, um die Gültigkeit eines Pull Request-Titels zu testen. Dies geht jedoch mit dem Risiko der Skripteinschleusung einher:

      - 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

Bei diesem Beispiel besteht das Risiko der Skripteinschleusung, da der Befehl run innerhalb eines temporären Shellskripts im Runner ausgeführt wird. Vor der Ausführung des Shellskripts werden die Ausdrücke innerhalb von ${{ }} ausgewertet und anschließend durch die resultierenden Werte ersetzt. Bei diesem Vorgang besteht die Möglichkeit, dass Shellbefehle eingeschleust werden.

Angreifer*innen könnten einen Pull Request mit dem Titel a"; ls $GITHUB_WORKSPACE" erstellen, um Befehle in diesem Workflow einzuschleusen:

Screenshot des Titels eines Pull Requests im Bearbeitungsmodus. Ein neuer Titel wurde in das Feld eingegeben: a"; ls $GITHUB_WORKSPACE".

In diesem Beispiel wird die title="${{ github.event.pull_request.title }}"-Anweisung mithilfe des Zeichens " unterbrochen, damit der Befehl ls im Runner ausgeführt werden kann. Die Ausgabe des Befehls ls erscheint im Protokoll:

Run title="a"; ls $GITHUB_WORKSPACE""
README.md
code.yml
example.js

Bewährte Methoden, die Runner sicher halten, findest du unter Referenz zur sicheren Verwendung.