In diesem Leitfaden können Sie beurteilen, ob Ihr Workflow das pull_request_target Ereignis verwenden und die sicherheitsrelevanten Risiken verstehen soll. Außerdem wird erläutert, welche Schutzmaßnahmen GitHub standardmäßig auf diese Risiken anwendet und wie man diese Schutzmaßnahmen bei Bedarf abwählen kann.
Risiken von pull_request_target
Workflows, die durch pull_request_target ausgelöst werden, werden mit erhöhten Vertrauensrechten ausgeführt: Der Job erhält das GITHUB_TOKEN des Basis-Repositorys sowie Zugriff auf Repository- und Organisationsgeheimnisse. Dies ist dasselbe Vertrauen, das auch Ereignissen wie push entgegengebracht wird, die nur von Mitwirkenden ausgelöst werden können, und genau das macht pull_request_target nützlich für Automatisierungen, die auf Pull Requests aus Forks reagieren, etwa zum Zuweisen von Labels, zur Triage oder zum Veröffentlichen authentifizierter Statusprüfungen.
Um zu verstehen, warum dies standardmäßig sicher ist und wie diese Sicherheit häufig unterbrochen wird, überprüfen Sie pull_request_target auf pull_request.
Das pull_request Ereignis (zusammen mit pull_request_review und pull_request_review_comment) ist ungewöhnlich: Es führt die Workflowdatei aus dem Zusammenführungs-Commit der Pullanforderung aus. Bei einem Pull Request, der aus einem Fork erstellt wurde, stammt dieser Commit von jemandem, der keinen Schreibzugriff auf das Basis-Repository hat. Um nicht vertrauenswürdigen Workflow-Code sicher auszuführen, GitHub beschränkt diese Ereignisse auf ein schreibgeschütztes GITHUB_TOKEN, verweigert den Zugriff auf andere Geheimnisse und wendet Fork-Genehmigungsrichtlinien an, um den Missbrauch von Rechenressourcen zu verhindern. Standardmäßig checkt actions/checkout in einem pull_request-Workflow auch den Merge-Commit des Pull Requests aus, sodass der ausgecheckte Code und der ausgeführte Workflow übereinstimmen.
pull_request_target nimmt eine wichtige und subtile Änderung vor: Der Workflow und jeder nachfolgende actions/checkout-Aufruf, der keinen ref angibt, werden aus dem Standard-Branch des Basis-Repositorys und nicht aus dem Pull Request übernommen. Da nur vertrauenswürdiger Code aus dem Standard-Branch ausgeführt wird, ist es sicher, Geheimnisse und ein Token mit Lese- und Schreibzugriff zu gewähren. Standardmäßig wird kein Code aus dem Fork ausgeführt.
Sie gehen ein Risiko ein, wenn der Autor eines Workflows diesen Standardwert außer Kraft setzt, um den Code des Forks auszuführen. Entwickler wählen pull_request_target häufig aus, weil sie die Pullanforderung einer Verzweigung über CI ausführen möchten und Zugriff auf geheime Schlüssel haben, z. B. zum Ausführen von Tests, die eine private Registrierung benötigen. Dazu richten sie actions/checkout auf den Head des Pull Requests statt auf den Standard-Branch, was unsicher ist:
# INSECURE. Provided as an example only.
on:
pull_request_target:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: Test
run: make test
Der Auscheckschritt allein führt keinen nicht vertrauenswürdigen Code aus. Die Workflowdatei selbst stammt weiterhin aus dem Standard-Branch. Die Sicherheitsanfälligkeit wird durch den nächsten Schritt abgeschlossen, in dem Code ausgeführt wird, der im aktuellen Arbeitsverzeichnis ausgecheckt ist. Hier führt make test ein Makefile aus, das vom Head der Pull-Anfrage stammt. Ein Angreifer muss nur einen Pull Request aus einem Fork öffnen, dessen Makefile (oder Build-Skript, Testbefehl, Abhängigkeit oder Konfigurationsdatei) schädliche Befehle enthält. Diese Befehle werden dann mit den geheimen Schlüsseln und Token des Basis-Repositorys ausgeführt.
Dieses Muster wird als "pwn-Anforderung" bezeichnet und ist die Ursache mehrerer Lieferkettenkompromittierungen. Weitere Informationen finden Sie unter Verhindern von Pwn-Anfragen im GitHub Security Lab. Zu den gängigen verwundbaren Formen gehören:
- Auschecken des Head- oder Merge-Commits eines Pull Requests in
actions/checkout(ref: ${{ github.event.pull_request.head.sha }},ref: refs/pull/${{ github.event.pull_request.number }}/merge) und anschließendes Erstellen, Testen oder anderweitiges Ausführen des Ergebnisses. repository:auf den Fork (repository: ${{ github.event.pull_request.head.repo.full_name }}) festlegen, um den Branch des Forks direkt abzurufen.- Abrufen des Codes des Pull Requests außerhalb von
actions/checkout(zum Beispiel mitgit fetch,gh pr checkoutoder durch Herunterladen eines Artefakts aus einempull_request-Lauf eines Forks) und anschließendes Ausführen.
Pwn-Anfragen sind auch nicht auf pull_request_target beschränkt. Jedes Ereignis, das mit geheimen Schlüsseln ausgeführt wird, kann eine pwn-Anforderung einführen, wenn es nicht vertrauenswürdigen Code auscheckt oder herunterlädt und ausführt. Beispielsweise ist ein issue_comment oder workflow_run Workflow, der den Code eines Pull Requests eines Forks abruft und ausführt, auf die gleiche Weise anfällig. Ein workflow_run Workflow sollte Artefakte, die von anderen Workflows hochgeladen wurden, als nicht vertrauenswürdige Daten behandeln, da ihr Inhalt aus einem Fork stammen kann.
Standardrichtlinie für pull_request_target
Um Ihre Workflows vor nicht vertrauenswürdigen Pullanforderungen zu schützen, stellt eine Standardereignisrichtlinie bereit, GitHub die das pull_request_target Ereignis in öffentlichen Repositorys blockiert.
Funktionsweise der Standardrichtlinie
Für öffentliche Repositorys, die noch nicht über eine entsprechende Aktionsereignisrichtlinie verfügen, fügt GitHub eine Standardrichtlinie hinzu, die Workflows blockiert, die durch pull_request_targetausgelöst werden. Weitere Informationen zu Richtlinien finden Sie unter Informationen zu den Actions-Richtlinien.
Die Standardrichtlinie:
- Gilt nicht für private oder interne Repositorys.
- Ersetzt keine anwendbare Ereignisrichtlinie, die Sie bereits konfiguriert haben.
- Wird derzeit im Auswertungsmodus ausgeführt. In diesem Modus werden Workflowausführungen weiterhin ausgeführt, Sie können jedoch mithilfe von Richtlinienerkenntnissen Ausführungen identifizieren, die nach der Durchsetzung blockiert würden.
Am 2. November 2026 erzwingt GitHub die Standardrichtlinie für betroffene Repositorys, die die Standardrichtlinie pull_request_target vor der allgemeinen Verfügbarkeit verwendet haben.
Überprüfen der Auswirkungen vor der Durchsetzung
Während sich die Richtlinie im Auswertungsmodus befindet, überprüfen Sie die Erkenntnisse zu Ihrer Richtlinie, um Workflows zu identifizieren, die pull_request_target verwenden und bei Durchsetzung der Richtlinie blockiert würden.
Entscheiden Sie für jeden betroffenen Workflow, ob pull_request_target noch erforderlich ist:
- Wenn der Workflow
pull_request_targetnicht benötigt, aktualisieren Sie ihn, damit er gegebenenfalls ein sichereres Ereignis verwendet, z. B.pull_request. - Wenn der Workflow weiterhin
pull_request_targetverwenden muss, erstellen oder aktualisieren Sie eine entsprechende Actions-Ereignisrichtlinie, diepull_request_targetausdrücklich zulässt. - Wenn Sie
pull_request_targetnicht zulassen möchten, behalten Sie die Standardrichtlinie bei. Nach der Erzwingung blockiert GitHub Workflows, die durch dieses Ereignis ausgelöst werden.
Warnung
Nur dann pull_request_target zulassen, wenn es erforderlich ist. Workflows, die durch dieses Ereignis ausgelöst werden, sollten keinen Code aus einem nicht vertrauenswürdigen Pull Request auschecken, erstellen oder ausführen, der Zugriff auf Repository-Geheimnisse oder ein privilegiertes GITHUB_TOKEN hat.
Weitere Informationen zum Konfigurieren von Ereignisrichtlinien und zum Anzeigen von Einblicken finden Sie unter Steuern, wer GitHub ActionsWorkflows ausführen kann. Informationen zum programmgesteuerten Verwalten von Richtlinien finden Sie unter REST-API-Endpunkte für GitHub Actions-Richtlinien.
Entscheiden, ob pull_request_target verwendet werden soll
Einige Workflows müssen den Code von Pull Requests aus Forks mit erhöhtem Vertrauensniveau auschecken, und genau deshalb wurde pull_request_target überhaupt erst geschaffen. Zum Beispiel das Erstellen von Coverage-Berichten, die eine private Artefakt-Registry erfordern, oder das Erstellen und Ausführen authentifizierter Prüfungen für die durch den Pull Request eingeführten Änderungen. Berücksichtigen Sie die folgenden Fragen, bevor Sie pull_request_target verwenden oder das allow-unsafe-pr-checkout-Flag in actions/checkout aktivieren.
-
Können Sie stattdessen verwenden
pull_request?pull_requestwird durch dieselben Ereignisse ausgelöst wiepull_request_targetund führt den Workflow-Code aus dem Merge-Branchpull_requestaus. Dies erfolgt bei Pull Requests aus Forks auf sichere Weise und mit den oben beschriebenen Schutzmaßnahmen. Wenn kein zusätzlicher geheimer Zugriff erforderlich ist, verwenden Siepull_request. Komplexere Workflows können neu strukturiert werden, um die potenziell gefährliche Behandlung von Pull-Anforderungscode vom Zugriff auf geheime Schlüssel zu trennen. Weitere Informationen finden Sie unter Verhindern von Pwn-Anfragen im GitHub Security Lab. -
Wird der ausgecheckte Code jemals ausgeführt? Dies ist der Fehler, der pwn-Anforderungsrisiken einführt. Am häufigsten geschieht dies mit
actions/checkout, indem Sie den Head eines Pull-Requests in das Arbeitsverzeichnis auschecken und ihn anschließend ausführen. Wenn diepathEingabe nicht festgelegt ist,actions/checkoutwird der Code in das$GITHUB_WORKSPACEVerzeichnis geschrieben, das in der Regel das Arbeitsverzeichnis ist, in dem nachfolgende Befehle ausgeführt werden. Die Ausführung ist nicht auf Ihre eigenen Schritte beschränkt: Build- und Testbefehle wienpm installundnpm run build, sowie Konfigurationsdateien und Abhängigkeiten, die der Code mit sich bringt, können alle vom Angreifer gesteuerten Code ausführen. Für die Ausführung ist kein offensichtlicher Buildschritt erforderlich. Sie müssen sicherstellen, dass der ausgecheckte Code nur als Daten überprüft und nie vor der Verwendung einespull_request_targetEreignisses ausgeführt wird.
Härtung eines pull_request_target Workflows
Wenn Sie bestätigt haben, dass Sie dies benötigen pull_request_target, wenden Sie diese Steuerelemente an, um die Auswirkungen dieses risikoreichen Ereignisses einzuschränken. Dies gilt unabhängig davon, ob Ihr Workflow Pull-Request-Code auscheckt.
-
Schränken Sie geheime Schlüssel ein. Vergewissern Sie sich, dass für
GITHUB_TOKENnur die geringstmöglichen Berechtigungen festgelegt sind und dass für den Workflow nur die erforderlichen Repository- und Organisationsgeheimnisse verwendet werden. Weitere Informationen findest du unter Verwenden von GITHUB_TOKEN für die Authentifizierung in Workflows. -
Verstehen sie die Auswirkungen auf das Zwischenspeichern. Um das Risiko einer Cache-Vergiftung zu verringern, haben Workflows, die durch
pull_request_targetausgelöst werden, im Geltungsbereich des Standard-Branches nur Lesezugriff auf den Cache. Diese Workflows können vorhandene Cacheeinträge wiederherstellen, aber sie können nicht erstellen oder überschreiben, sodass sie sich nicht auf die Ausführung anderer, nicht verknüpfter Workflows über den freigegebenen Cache auswirken können. Wenn ein solcher Workflow versucht, einen Cache zu speichern, schlägt die Speicherung fehl, aber der Schritt und der Auftrag wird fortgesetzt, und der Fehler wird als Warnung im Workflowprotokoll gemeldet. Wenn Ihr Workflow den Cache füllen muss, speichern Sie ihn in einem Workflow, der mit einem vertrauenswürdigen Trigger ausgeführt wird, wie z. B.push. Ein Workflow oder Job kann von dieser schreibgeschützten Einschränkung ausgenommen werden, indem er explizit ein schreibfähigescache-modedeklariert. Bei einempull_request_target-Workflow führt dies jedoch das Risiko einer Cache-Vergiftung wieder ein, das durch diese Einschränkung verhindert werden soll. Weitere Informationen findest du unter Referenz zum Zwischenspeichern von Abhängigkeiten. -
Stellen Sie sicher, dass die zugrunde liegende Berechnung isoliert und kurzlebig ist. Wenn selbstgehostete Runner verwendet werden, müssen Sie bestätigen, dass die Runner-Umgebung ordnungsgemäß gegenüber internen Ressourcen abgeschottet ist und nicht über mehrere GitHub Actions Ausführungen hinweg wiederverwendet wird. Weitere Informationen findest du unter Referenz zur sicheren Verwendung.
-
Setzen Sie GitHub Actions bewährte Sicherheitsverfahren durch. Neben den spezifischen Risiken von pwn-Anforderungen können andere häufige Sicherheitsrisiken, z. B. die Einfügung von Befehlen, vorhanden sein und sich auf den code auswirken, der in diesem privilegierten Ereignis ausgeführt wird. Weitere Informationen finden Sie unter "Schützen Ihrer GitHub Actions und Workflows: Nicht vertrauenswürdige Eingaben aus der GitHub Security Lab. Aktivieren Sie GitHub Actions für CodeQL, um allgemeine GitHub Actions Schwachstellen zu identifizieren und sich proaktiv davor zu schützen. Weitere Informationen findest du unter Konfigurieren des Standardsetups für das Code-Scanning.
Abmelden von integrierten Schutzfunktionen
Wenn Sie die oben genannten Fragen durchgearbeitet und bestätigt haben, dass Ihr Workflow pull_request_target erfordert und diese sicher verwendet, können Sie die standardmäßige Ereignisrichtlinie und den actions/checkoutSchutz deaktivieren.
Wenn allow-unsafe-pr-checkout: true als actions/checkout festgelegt wird, können Head-Refs von Pull Requests aus Forks ausgecheckt werden. Tun Sie dies nur, nachdem Sie bestätigt haben, dass der ausgecheckte Code niemals ausgeführt wird. Die Eingabe wird absichtlich benannt, um in der Codeüberprüfung und statischen Analyse leicht zu erkennen.
Dieser Schutz gilt nur für Fork-Pull-Request-Referenzen. Das Auschecken anderer nicht vertrauenswürdiger Code, z. B. ein nicht verwandtes Drittanbieterrepository, das Abrufen von Code mit git fetch oder gh pr checkoutoder das Ausführen eines heruntergeladenen Artefakts, wird von den actions/checkout Prüfungen nicht abgedeckt.