
CVE-2026-71557 के लिए स्थानीय प्रूफ-ऑफ-कॉन्सेप्ट जो go-git फाइलसिस्टम रेफरेंस स्टोरेज में पाथ ट्रैवर्सल दर्शाता है, जिसमें एक्सप्लॉइट लॉजिक और असुरक्षित-बनाम-सुरक्षित संस्करण तुलना शामिल है।
यह रिपॉज़िटरी go-git की सार्वजनिक एडवाइज़री GHSA-qgq7-7hm3-q39j पर आधारित CVE-2026-71557 का सुरक्षित स्थानीय PoC है।
फिक्स से पहले storage/filesystem loose reference के नाम को पर्याप्त रूप से सत्यापित नहीं करता था और उसे .git/<reference-name> पथ के रूप में उपयोग करता था। इसलिए, refs/heads/../../config जैसा reference नाम पास करने पर .. सामान्यीकृत हो जाता है, और सामान्य 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 reference नाम को सीधे फ़ाइल नाम के रूप में setRef को पास करता था।
fileName := r.Name().String()
return d.setRef(fileName, content, old)
filesystem-backed storage का रूट आमतौर पर .git होता है। reference नाम refs/heads/../../config पथ सामान्यीकरण के बाद config बन जाता है, इसलिए reference मान का लेखन .git/config के लेखन में बदल जाता है। यदि कोई दुर्भावनापूर्ण Git सर्वर ऐसे reference नाम का विज्ञापित करता है और clone/fetch के दौरान refspec मैपिंग के बाद भी traversal बना रहता है, तो हमलावर-नियंत्रित reference नाम इस कोड पथ तक पहुँच सकता है।
फिक्स किया गया संस्करण filesystem storage के SetRef, Ref, RemoveRef जैसे प्रवेश बिंदुओं पर reference नाम को सत्यापित करता है और 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 प्रोटोकॉल सर्वर या clone/fetch की transport परत को लागू नहीं करता है।
v5 उपयोगकर्ता v5.19.2 या उसके बाद के संस्करण में, और v6 alpha उपयोगकर्ता v6.0.0-alpha.5 या उसके बाद के संस्करण में अपडेट करें। जब तक अपडेट संभव न हो, filesystem-backed storage के साथ अविश्वसनीय Git सर्वर से clone/fetch न करें। केवल storage/memory का उपयोग करने वाले अनुप्रयोग इस भेद्यता से प्रभावित नहीं होते हैं।