
CVE-2026-71557에 대한 로컬 개념 증명(PoC)으로, go-git 파일시스템 참조 저장소에서 경로 순회(path traversal) 취약점을 시연하며, 익스플로잇 로직과 취약 버전 대비 수정 버전 비교를 포함합니다.
이 리포지토리는 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의 취약한 진입점을 직접 호출하여 path traversal을 통한 metadata overwrite를 검증합니다. 악의적인 Git protocol 서버나 clone/fetch의 transport 계층은 구현하지 않았습니다.
v5 사용자는 v5.19.2 이상, v6 alpha 사용자는 v6.0.0-alpha.5 이상으로
업데이트하십시오. 업데이트할 수 없는 동안에는 filesystem-backed storage에서
신뢰할 수 없는 Git 서버로부터 clone/fetch하지 마십시오. storage/memory만
사용하는 애플리케이션은 이 취약점의 영향을 받지 않습니다.