
Prova di concetto locale per CVE-2026-71557 che dimostra il path traversal nell'archiviazione dei riferimenti su filesystem di go-git, inclusa la logica dell'exploit e il confronto tra la versione vulnerabile e quella corretta.
Questo repository è un PoC locale e sicuro basato sull'avviso pubblico di go-git GHSA-qgq7-7hm3-q39j per CVE-2026-71557.
Prima della correzione, storage/filesystem non validava a sufficienza i nomi dei
loose reference e li utilizzava come percorso .git/<reference-name>. Di conseguenza,
passando un nome di riferimento come refs/heads/../../config, i .. venivano
normalizzati e si poteva sovrascrivere .git/config, che si trova al di fuori del
reference storage legittimo.
Questo PoC invoca le API reali di go-git e prende di mira esclusivamente un
.git/config fittizio creato in una directory temporanea. Non effettua connessioni
a server Git esterni, non modifica repository esistenti e non esegue comandi arbitrari.
Questo progetto è destinato esclusivamente a scopi educativi e a verifiche di sicurezza etiche autorizzate. Non utilizzarlo in ambienti non autorizzati.
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 di storage/filesystemstorage/memoryNella v5.19.1 precedente alla correzione, DotGit.SetRef passava il nome del
riferimento direttamente a setRef come nome di file.
fileName := r.Name().String()
return d.setRef(fileName, content, old)
La root dello storage basato su filesystem è solitamente .git. Poiché il nome di
riferimento refs/heads/../../config diventa config dopo la normalizzazione del
percorso, la scrittura del valore del riferimento si trasforma nella scrittura di
.git/config. Se un server Git malevolo annuncia tali nomi di riferimento e la
traversal sopravvive al mapping dei refspec durante clone/fetch, nomi di riferimento
controllati dall'attaccante possono raggiungere questo percorso di codice.
La versione corretta valida i nomi dei riferimenti nei punti di ingresso di
filesystem storage come SetRef, Ref e RemoveRef, rifiutando i nomi che
escono dal reference storage.
go.mod è fissato alla versione vulnerabile v5.19.1.
go run .
Output principale atteso:
[*] go-git version: v5.19.1
[*] crafted reference: refs/heads/../../config
[*] SetReference error: <nil>
[!] VULNERABLE: .git/config was overwritten through the reference name.
Il PoC esegue le seguenti operazioni:
.git/configrefs/heads/../../config a SetReferenceIl seguente script esegue in sequenza lo stesso PoC con le versioni v5.19.1 e v5.19.2
utilizzando moduli temporanei, senza modificare go.mod del repository.
./scripts/run-version-matrix.sh
Esito atteso:
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.
Se desideri ispezionare i file temporanei, usa l'opzione -keep. La directory
indicata non viene eliminata automaticamente, quindi rimuovila manualmente dopo la
verifica.
go run . -keep
Questo PoC verifica la sovrascrittura dei metadati tramite path traversal invocando direttamente i punti di ingresso vulnerabili di filesystem storage descritti nell'avviso. Non implementa un server del protocollo Git malevolo né il livello di trasporto di clone/fetch.
Gli utenti della v5 devono aggiornare a v5.19.2 o successiva, gli utenti della v6
alpha a v6.0.0-alpha.5 o successiva. Finché non è possibile aggiornare, non eseguire
clone/fetch da server Git non attendibili con storage basato su filesystem. Le
applicazioni che utilizzano esclusivamente storage/memory non sono interessate da
questa vulnerabilità.