该仓库是基于 go-git 公开公告 GHSA-qgq7-7hm3-q39j 的 CVE-2026-71557 安全本地 PoC。
修复前的 storage/filesystem 未充分验证 loose reference 名称,并将其用作
.git/<reference-name> 的路径。因此,当传入 refs/heads/../../config 之类的
引用名称时,.. 会被规范化,从而可以覆盖位于原始 reference storage 之外的
.git/config。
此 PoC 会调用真实的 go-git API,仅针对临时目录内创建的虚拟 .git/config。
不会连接外部 Git 服务器、修改现有仓库或执行任意命令。
本项目仅用于教育目的以及经授权的道德安全验证。请勿在未经许可的环境中使用。
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.5storage/filesystem 的 dotgit reference storagestorage/memory在修复前的 v5.19.1 中,DotGit.SetRef 将引用名称原样作为文件名传递给
setRef。
fileName := r.Name().String()
return d.setRef(fileName, content, old)
filesystem-backed storage 的根目录通常是 .git。引用名称
refs/heads/../../config 在路径规范化后变为 config,因此对引用值的写入会
变成对 .git/config 的写入。如果恶意 Git 服务器通告此类引用名称,并且在
clone/fetch 时经 refspec mapping 后 traversal 仍然保留,则攻击者控制的引用
名称可能到达此代码路径。
修复版在 filesystem storage 的 SetRef、Ref、RemoveRef 等入口处验证引用
名称,并拒绝超出 reference storage 范围的名称。
go.mod 已固定为易受攻击的 v5.19.1。
go run .
预期的主要输出:
[*] go-git version: v5.19.1
[*] crafted reference: refs/heads/../../config
[*] SetReference error: <nil>
[!] VULNERABLE: .git/config was overwritten through the reference name.
PoC 执行以下操作:
.git/config 写入安全 markerrefs/heads/../../config 的 hash reference 传递给 SetReference以下脚本在不修改仓库内 go.mod 的情况下,使用临时 module 依次运行
v5.19.1 和 v5.19.2 的相同 PoC。
./scripts/run-version-matrix.sh
预期的判定结果:
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.
如需查看临时文件,请加上 -keep。显示的目录不会被自动删除,请在确认后
手动删除。
go run . -keep
此 PoC 直接调用公告中所述的 filesystem storage 易受攻击入口,验证路径遍历 导致的 metadata overwrite。未实现恶意 Git protocol server 或 clone/fetch 的 transport 层。
v5 用户请更新至 v5.19.2 或更高版本,v6 alpha 用户请更新至
v6.0.0-alpha.5 或更高版本。在无法更新期间,请不要在 filesystem-backed
storage 中从不受信任的 Git 服务器执行 clone/fetch。仅使用 storage/memory
的应用程序不受此漏洞影响。