
CVE-2026-71557 のローカル概念実証(PoC)。go-git のファイルシステム参照ストレージにおけるパストラバーサルを実証し、悪用ロジックと脆弱版/修正版のバージョン比較を含みます。
このリポジトリは、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 サーバーがこのような参照名を
advertise し、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 に安全な marker を書き込むrefs/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 のみを利用する
アプリケーションは、この脆弱性の影響を受けません。