
Lokaler Proof-of-Concept für CVE-2026-71557, der Pfad-Traversal im Dateisystem-Referenzspeicher von go-git demonstriert, einschließlich Exploit-Logik und Vergleich zwischen verwundbaren und gepatchten Versionen.
Dieses Repository ist ein sicherer lokaler PoC für CVE-2026-71557 auf Grundlage des öffentlichen Advisories von go-git GHSA-qgq7-7hm3-q39j.
Das nicht korrigierte storage/filesystem validierte die Namen von Loose References nicht ausreichend
und verwendete sie als Pfad .git/<reference-name>. Dadurch wird
bei einem Referenznamen wie refs/heads/../../config das .. normalisiert,
sodass .git/config außerhalb des eigentlichen Reference Storages überschrieben werden kann.
Dieser PoC ruft die tatsächliche go-git-API auf und zielt ausschließlich auf eine
in einem temporären Verzeichnis erstellte Dummy-.git/config. Es werden keine Verbindungen zu externen Git-Servern hergestellt, keine vorhandenen
Repositorys verändert und keine beliebigen Befehle ausgeführt.
Dieses Projekt dient ausschließlich Bildungszwecken und autorisierten ethischen Sicherheitstests. Verwenden Sie es nicht gegen Umgebungen ohne entsprechende Genehmigung.
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-Reference-Storage von storage/filesystemstorage/memoryIn der nicht korrigierten Version v5.19.1 übergab DotGit.SetRef den Referenznamen unverändert als Dateinamen
an setRef.
fileName := r.Name().String()
return d.setRef(fileName, content, old)
Die Wurzel des filesystem-backed Storages ist normalerweise .git. Der Referenzname
refs/heads/../../config wird nach der Pfadnormalisierung zu config, wodurch aus dem Schreiben des Referenzwerts ein
Schreiben von .git/config wird. Wenn ein bösartiger Git-Server solche Referenznamen
ankündigt und die Traversal auch nach dem Refspec-Mapping bei Clone/Fetch erhalten bleibt,
können angreiferkontrollierte Referenznamen diesen Codepfad erreichen.
Die korrigierte Version validiert Referenznamen an den Einstiegspunkten wie SetRef, Ref und RemoveRef des Filesystem-Storages
und lehnt Namen ab, die aus dem Reference Storage ausbrechen.
go.mod ist auf die verwundbare Version v5.19.1 festgelegt.
go run .
Erwartete Hauptausgabe:
[*] go-git version: v5.19.1
[*] crafted reference: refs/heads/../../config
[*] SetReference error: <nil>
[!] VULNERABLE: .git/config was overwritten through the reference name.
Der PoC führt folgende Schritte aus:
.git/configrefs/heads/../../config an SetReferenceDas folgende Skript führt denselben PoC nacheinander mit v5.19.1 und v5.19.2 unter Verwendung eines temporären Moduls aus,
ohne die go.mod im Repository zu verändern.
./scripts/run-version-matrix.sh
Erwartetes Ergebnis:
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.
Falls Sie die temporären Dateien überprüfen möchten, verwenden Sie -keep. Das angezeigte Verzeichnis wird
nicht automatisch gelöscht; entfernen Sie es nach der Prüfung manuell.
go run . -keep
Dieser PoC ruft die im Advisory beschriebenen verwundbaren Einstiegspunkte des Filesystem-Storages direkt auf und verifiziert das Überschreiben von Metadaten durch Path Traversal. Es wird weder ein bösartiger Git-Protocol-Server noch eine Transport-Schicht für Clone/Fetch implementiert.
v5-Nutzer sollten auf v5.19.2 oder neuer aktualisieren, v6-alpha-Nutzer auf v6.0.0-alpha.5 oder neuer.
Solange ein Update nicht möglich ist, sollten Sie mit filesystem-backed Storage nicht von nicht vertrauenswürdigen Git-Servern
klonen oder fetchen. Anwendungen, die ausschließlich storage/memory verwenden,
sind von dieser Schwachstelle nicht betroffen.