
Preuve de concept locale pour CVE-2026-71557 démontrant une traversée de chemin dans le stockage de références du système de fichiers de go-git, incluant la logique d'exploitation et la comparaison entre les versions vulnérable et corrigée.
Ce dépôt est un PoC local sûr de CVE-2026-71557, basé sur l'avis public de go-git GHSA-qgq7-7hm3-q39j.
Avant le correctif, storage/filesystem n'avait pas suffisamment validé le nom des loose references
et l'utilisait comme chemin .git/<reference-name>. Ainsi, un nom de référence tel que
refs/heads/../../config voyait ses .. normalisés, ce qui permettait d'écraser le fichier .git/config
situé en dehors du stockage de références légitime.
Ce PoC appelle les vraies API de go-git et ne cible qu'un faux .git/config créé dans un répertoire
temporaire. Il n'établit aucune connexion à un serveur Git externe, ne modifie aucun dépôt existant
et n'exécute aucune commande arbitraire.
Ce projet est destiné uniquement à des fins éducatives et à des tests de sécurité éthiques autorisés. Ne l'utilisez pas contre un environnement sans permission.
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:U/C:N/I:H/A:L)github.com/go-git/go-git/v5 <= 5.19.1github.com/go-git/go-git/v6 <= 6.0.0-alpha.45.19.26.0.0-alpha.5dotgit de storage/filesystemstorage/memoryDans la version v5.19.1 antérieure au correctif, DotGit.SetRef transmettait directement le nom de
référence comme nom de fichier à setRef.
fileName := r.Name().String()
return d.setRef(fileName, content, old)
La racine du stockage adossé au filesystem est généralement .git. Le nom de référence
refs/heads/../../config devient config après normalisation du chemin ; l'écriture de la valeur
de référence se transforme donc en écriture de .git/config. Si un serveur Git malveillant
advertise un tel nom de référence et que le traversal subsiste après le mapping des refspecs lors
d'un clone/fetch, un nom de référence contrôlé par l'attaquant peut atteindre ce chemin de code.
La version corrigée valide les noms de référence aux points d'entrée tels que SetRef, Ref et
RemoveRef du stockage filesystem, et rejette tout nom sortant du stockage de références.
go.mod est verrouillé sur la version vulnérable v5.19.1.
go run .
Sortie principale attendue :
[*] go-git version: v5.19.1
[*] crafted reference: refs/heads/../../config
[*] SetReference error: <nil>
[!] VULNERABLE: .git/config was overwritten through the reference name.
Le PoC effectue les opérations suivantes :
.git/configrefs/heads/../../config à SetReferenceLe script suivant exécute séquentiellement le même PoC avec v5.19.1 et v5.19.2 en utilisant des
modules temporaires, sans modifier le go.mod du dépôt.
./scripts/run-version-matrix.sh
Verdict attendu :
go-git v5.19.1
[!] VULNERABLE: .git/config was overwritten through the reference name.
go-git v5.19.2
[+] FIXED: the crafted reference was rejected and .git/config stayed intact.
Si vous souhaitez consulter les fichiers temporaires, ajoutez -keep. Les répertoires affichés ne
sont alors pas supprimés automatiquement ; supprimez-les manuellement après vérification.
go run . -keep
Ce PoC vérifie l'écrasement de métadonnées par path traversal en appelant directement la porte d'entrée vulnérable du stockage filesystem décrite dans l'avis. Il n'implémente ni serveur de protocole Git malveillant, ni couche transport de clone/fetch.
Les utilisateurs de v5 doivent mettre à jour vers v5.19.2 ou une version ultérieure, et les
utilisateurs de l'alpha v6 vers v6.0.0-alpha.5 ou une version ultérieure. En attendant la mise à
jour, évitez de cloner ou de récupérer (fetch) depuis des serveurs Git non fiables avec un stockage
adossé au filesystem. Les applications qui n'utilisent que storage/memory ne sont pas affectées
par cette vulnérabilité.