
Prueba de concepto local para CVE-2026-71557 que demuestra el path traversal en el almacenamiento de referencias del sistema de archivos de go-git, incluyendo la lógica de explotación y la comparación entre versiones vulnerables y corregidas.
Este repositorio es un PoC local seguro de CVE-2026-71557, basado en el aviso público de go-git GHSA-qgq7-7hm3-q39j.
La versión anterior de storage/filesystem no validaba suficientemente el nombre de las loose references y lo usaba como ruta .git/<reference-name>. Por ello, al pasar un nombre de referencia como refs/heads/../../config, los .. se normalizan y se puede sobrescribir .git/config, que se encuentra fuera del reference storage previsto.
Este PoC invoca la API real de go-git y solo actúa sobre un .git/config simulado creado en un directorio temporal. No se conecta a servidores Git externos, no modifica repositorios existentes ni ejecuta comandos arbitrarios.
Este proyecto tiene como único fin la educación y la verificación de seguridad ética y autorizada. No lo utilice en entornos sin permiso.
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/memoryEn la v5.19.1 anterior a la corrección, DotGit.SetRef pasaba el nombre de referencia directamente como nombre de archivo a setRef.
fileName := r.Name().String()
return d.setRef(fileName, content, old)
La raíz del storage respaldado por filesystem suele ser .git. El nombre de referencia refs/heads/../../config se convierte en config tras la normalización de la ruta, por lo que la escritura del valor de la referencia se transforma en una escritura de .git/config. Si un servidor Git malicioso anuncia un nombre de referencia de este tipo y el traversal persiste tras el mapeo de refspec durante el clone/fetch, un nombre de referencia controlado por el atacante podría llegar a esta ruta de código.
La versión corregida valida el nombre de referencia en los puntos de entrada como SetRef, Ref y RemoveRef del storage de filesystem, y rechaza los nombres que se salen del reference storage.
go.mod está fijado a la versión vulnerable v5.19.1.
go run .
Salida principal esperada:
[*] go-git version: v5.19.1
[*] crafted reference: refs/heads/../../config
[*] SetReference error: <nil>
[!] VULNERABLE: .git/config was overwritten through the reference name.
El PoC realiza lo siguiente:
.git/config.refs/heads/../../config a SetReference.El siguiente script ejecuta el mismo PoC de forma secuencial con v5.19.1 y v5.19.2, usando un módulo temporal sin modificar el go.mod del repositorio.
./scripts/run-version-matrix.sh
Resultado esperado:
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 desea inspeccionar los archivos temporales, añada -keep. El directorio mostrado no se eliminará automáticamente, así que elimínelo manualmente después de revisarlo.
go run . -keep
Este PoC invoca directamente el punto de entrada vulnerable del filesystem storage descrito en el aviso y verifica la sobrescritura de metadatos mediante path traversal. No implementa un servidor de protocolo Git malicioso ni la capa de transporte de clone/fetch.
Los usuarios de v5 deben actualizar a v5.19.2 o posterior, y los usuarios de v6 alpha a v6.0.0-alpha.5 o posterior. Mientras no pueda actualizar, no haga clone/fetch desde servidores Git no confiables con storage respaldado por filesystem. Las aplicaciones que usan únicamente storage/memory no se ven afectadas por esta vulnerabilidad.