
CVE-2026-52813 (Gogs Path Traversal → Git Hooks RCE) रक्षात्मक रिपोर्ट: मूल कारण और पैच विश्लेषण, Sigma/SIEM पहचान नियम, IOCs, गैर-हस्तक्षेपी संस्करण स्कैनर। कोई शस्त्रीकृत PoC नहीं।
सुरक्षा अनुसंधान / ब्लू टीम के लिए writeup। इस रिपॉजिटरी में हथियारीकृत PoC शामिल नहीं है। पुनरुत्पादन की आवश्यकता वाले शोधकर्ता कृपया आधिकारिक सलाहकार द्वारा उद्धृत सार्वजनिक PoC का उपयोग करें।
| प्रोजेक्ट | सामग्री |
|---|---|
| CVE | CVE-2026-52813 |
| उर्फ़ | GHSA-c39w-43gm-34h5 / GO-2026-5305 |
| प्रभावित संस्करण | Gogs < 0.14.3 |
| सुधार संस्करण | 0.14.3 — PR #8334 |
| CVSS 3.1 | 10.0 Critical AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H |
| CWE | CWE-23 सापेक्ष पथ ट्रैवर्सल → RCE |
| पूर्व शर्त | एक सामान्य पंजीकृत खाता (डिफ़ॉल्ट रूप से खुला पंजीकरण होने पर = अनधिकृत RCE) |
Gogs में संगठन बनाते समय, वेब फॉर्म में AlphaDashDot अक्षर सत्यापन है जो / को रोकता है, लेकिन REST API POST /api/v1/user/orgs में नहीं। हमलावर API के माध्यम से ../ युक्त संगठन नाम सबमिट करता है, सत्यापन को बायपास करके सीधे os.MkdirAll(repoutil.UserPath(org.Name), 0777) (internal/database/org.go:165) तक पहुंचता है, और रिपॉजिटरी निर्देशिका को किसी भी फाइल सिस्टम पथ पर लिखता है। Gogs के वेब एडिटर अस्थायी कार्य ट्री (local-r/<repo_id>/) के साथ, दूसरे रिपॉजिटरी के स्थानीय चेकआउट में दुर्भावनापूर्ण hooks/update रखा जा सकता है, जो git द्वारा स्वचालित रूप से निष्पादित होता है → git उपयोगकर्ता के रूप में RCE।
| Gogs संस्करण | स्थिति |
|---|---|
< 0.14.3 | प्रभावित, तुरंत अपग्रेड करें |
>= 0.14.3 | ठीक किया गया |
अपग्रेड ही एकमात्र पूर्ण सुधार है:
# Docker
docker pull gogs/gogs:0.14.3
# 或源码
git checkout v0.14.3 && go build
अस्थायी शमन (अपग्रेड न कर पाने पर):
app.ini → [service] DISABLE_REGISTRATION = true), पूर्व शर्त को "अनधिकृत" से "मौजूदा खाता आवश्यक" तक कम करें;POST /api/v1/user/orgs, POST /api/v1/org/*/repos अनुरोध निकायों में username / name फ़ील्ड जिनमें .. या / हो, को रोकें (देखें detection/);/data/gogs/data/tmp/ के बाहर लिखने की अनुमति को सीमित करें (selinux/apparmor).Web表单(internal/form/org.go,v0.14.2):
type CreateOrg struct {
OrgName string `binding:"Required;AlphaDashDot;MaxSize(35)"` // 正则 ^[a-zA-Z0-9._-]+$
}
API(internal/route/api/v1/org/org.go,v0.14.2):
// api.CreateOrgOption (go-gogs-client) 的绑定 tag:
type CreateOrgOption struct {
UserName string `json:"username" binding:"Required"` // ← 没有 AlphaDashDot!
}
→ POST /api/v1/user/orgs के username फ़ील्ड में कोई भी वर्ण हो सकता है जो सीधे DB स्तर तक पहुँचता है।
internal/database/users.go:1532 isNameAllowed केवल आरक्षित नाम/प्रत्यय (जैसे admin, -bot) को रोकता है, वर्ण सेट की जांच नहीं करता, इसलिए ../ पास हो सकता है।
internal/repoutil/repoutil.go(v0.14.2):
func UserPath(user string) string {
return filepath.Join(conf.Repository.Root, strings.ToLower(user)) // ← 直接拼接
}
internal/database/org.go:165:
os.MkdirAll(repoutil.UserPath(org.Name), os.ModePerm) // org.Name 含 ../ → 任意路径写入
Gogs Web/API फ़ाइल संपादन के दौरान, रिपॉजिटरी को /data/gogs/data/tmp/local-r/<repo_id>/ पर चेकआउट करता है। <repo_id> रिपॉजिटरी के डेटाबेस id के बराबर होता है। हमलावर:
writer बनाएं, जिससे id == n प्राप्त हो;username = "../../../../data/gogs/data/tmp/local-r/n/nested" → भौतिक निर्देशिका writer के कार्य ट्री के अंदर आ जाती है;rce-x बनाएं → यह local-r/n/nested/rce-x.git पर आ जाती है;writer को क्लोन करें, फिर nested/rce-x.git/hooks/update को सामान्य फ़ाइल के रूप में कमिट करें और push करें (यह writer के कार्य ट्री में आ जाती है);writer की फ़ाइल ऑपरेशन ट्रिगर करता है → Gogs local-r/n/ में git चलाता है → git hooks/update निष्पादित करता है → RCE।मुख्य बिंदु: दुर्भावनापूर्ण हुक सामान्य रिपॉजिटरी सामग्री के रूप में सामान्य push के माध्यम से प्रवेश करता है,
ENABLE_GIT_HOOKSकॉन्फ़िगरेशन की आवश्यकता नहीं है — यह इसे "पारंपरिक git हुक दुरुपयोग" पथ से अलग करता है।
विस्तृत पैच diff विश्लेषण के लिए देखें patch/ANALYSIS.md।
पूरे नियमों के लिए देखें detection/:
../) और सफल शोषण (फाइल सिस्टम लैंडिंग) को कवर करता हैदो सबसे महत्वपूर्ण:
POST /api/v1/user/orgs और POST /api/v1/org/*/repos के JSON body में username/name फ़ील्ड जिनमें .. या / हो।/data/gogs/data/tmp/local-r/*/ के अंतर्गत अप्रत्याशित उपनिर्देशिकाएँ दिखाई देना (nested/, rce-*.git, hooks/update)।GET /api/v1/version के माध्यम से जांचता है कि Gogs इंस्टेंस < 0.14.3 है या नहीं, बैच स्कैनिंग, CSV आउटपुट का समर्थन करता है, संपत्ति सूची के लिए उपयुक्त।यह रिपॉजिटरी हथियारीकृत शोषण उपकरण प्रदान नहीं करता है। पुनरुत्पादन के लिए कृपया आधिकारिक सलाहकार द्वारा उद्धृत सार्वजनिक PoC का उपयोग करें, और केवल स्व-निर्मित पृथक वातावरण में ही करें।
detection/ नियमों को प्रभावित Gogs पर सत्यापित करने की आवश्यकता है, lab/docker-compose.yml ब्लू टीम के लिए पृथक Gogs 0.14.2 वातावरण प्रदान करता है ताकि यह जांचा जा सके कि जांच नियम हिट होते हैं या नहीं। कृपया सार्वजनिक नेटवर्क पर उजागर न करें, केवल स्थानीय उपयोग करें।
| दिनांक | घटना |
|---|---|
| 2026-06-08 | CVE आरक्षित |
| 2026-06-24 | सार्वजनिक प्रकटीकरण, Gogs 0.14.3 जारी |
| 2026-06-24 | आधिकारिक सलाहकार GHSA-c39w-43gm-34h5 जारी |
इंटरनेट पर इस CVE को "Gogs gitrebase पैरामीटर इंजेक्शन रिमोट कोड निष्पादन" के रूप में वर्णित किया गया है — यह गलत है। यह भेद्यता git rebase / gitrebase से संबंधित नहीं है, मूल कारण API पथ ट्रैवर्सल है। यह दस्तावेज़ वास्तविक भेद्यता के अनुसार विश्लेषण करता है।
MIT — देखें LICENSE।