
Gitea diffpatch RCE (CVE-2026-60004) PoC - repo-write to RCE as Gitea service account
Gitea-diffpatch-Endpunkt PoC für Remote-Codeausführung. Ein Konto mit Schreibberechtigung für ein Repository (auf Instanzen mit offener Registrierung genügt eine anonyme Registrierung) kann auf dem Server als Gitea-Dienstkonto beliebige Shell-Befehle ausführen.
POST /api/v1/repos/{owner}/{repo}/diffpatch wendet einen vom Angreifer kontrollierten Patch in einem gemeinsamen bare temporären Klon-Repository an:
git apply --index --recount --cached --binary # Git ≥ 2.32 时追加 -3 三路合并回退
Angriffskette: denselben Patch zweimal einreichen → add/add-Konflikt → der Drei-Wege-Merge-Fallback checkt den Index-Pfad aus (selbst mit --cached) → im bare-Repository ist root = $GIT_DIR, und das ausgecheckte hooks/post-index-change (100755) wird zum aktiven Git-Hook → Git führt ihn beim Schreiben des Index automatisch aus → RCE.
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H470d34b1)-3 Drei-Wege-Merge)diffpatch-Endpunkt verfügbar# 设置账户密码
export GITEA_PASSWORD='account-password'
python3 gitea_diffpatch_rce_poc.py \
https://<gitea-base-url> \
<username> \
'id; uname -srm; pwd'
| Parameter | Beschreibung |
|---|---|
url | Gitea-Basis-URL |
username |
Abhängigkeiten: Python 3 + lokaler git-Client.
PoC-Ablauf: Authentifizierung → privates initialisiertes Repository erstellen → Patch für hooks/post-index-change erstellen → zweimal hintereinander an diffpatch senden (löst add/add-Konflikt aus) → Git führt den Hook aus → Befehlsausgabe über authentifiziertes Smart HTTP abrufen. Kein ausgehender Callback, die Ausgabe wird in-band zurückgesendet.
Nur für Sicherheitsforschung, Schwachstellenverifizierung und defensive Tests gedacht. Dieser PoC erstellt auf der Zielinstanz ein Repository, übermittelt Patches und löst die Ausführung von Serverbefehlen aus. Bitte nur auf einer selbst gehosteten Testinstanz ausführen, nicht gegen nicht autorisierte oder Produktionsumgebungen verwenden.
| Vorhandener Gitea-Benutzername (Verfügbarkeit: standardmäßig offene Registrierung) |
command | Shell-Befehl, der auf dem Ziel ausgeführt werden soll |
GITEA_PASSWORD | Kontopasswort (Umgebungsvariable oder interaktive Eingabe) |