
Gitea 1.27.1 से पहले Git hook इंस्टॉलेशन के माध्यम से diffpatch API के ज़रिए remote code execution की अनुमति देता है।
[!WARNING] यह रिपॉज़िटरी विशेष रूप से अधिकृत सुरक्षा अनुसंधान और नियंत्रित प्रयोगशाला परीक्षण के लिए है। प्रूफ ऑफ कॉन्सेप्ट को उन सिस्टमों पर न चलाएँ जिनके आप स्वामी नहीं हैं या जिनका मूल्यांकन करने के लिए आपके पास स्पष्ट अनुमति नहीं है।
CVE-2026-60004, Gitea के diffpatch API में एक गंभीर रिमोट कोड एक्ज़ीक्यूशन भेद्यता है। रिपॉज़िटरी बनाने या उसमें लिखने की अनुमति रखने वाला एक प्रमाणित उपयोगकर्ता एक तैयार किया गया पैच सबमिट कर सकता है जिसके कारण एक अस्थायी बेयर रिपॉज़िटरी के अंदर एक निष्पादन योग्य Git हुक भौतिक रूप से बन जाता है। जब हुक ट्रिगर होता है, तो हमलावर-नियंत्रित कमांड Gitea सेवा खाते के विशेषाधिकारों के साथ निष्पादित होते हैं।
यदि सार्वजनिक पंजीकरण सक्षम है, तो एक अप्रमाणित हमलावर खाता बनाकर भेद्य प्रमाणित एंडपॉइंट तक पहुँच सकता है।
| विशेषता | विवरण |
|---|
| पहचानकर्ता | CVE-2026-60004 |
| सलाह | GHSA-rcr6-4jqh-j84m |
| गंभीरता | गंभीर — CVSS 3.1: 9.8 |
| कमज़ोरी | CWE-94: कोड के निर्माण का अनुचित नियंत्रण |
| प्रभावित संस्करण | Gitea 1.17.0 से 1.27.0 तक |
| ठीक किया गया संस्करण | Gitea 1.27.1 |
| आवश्यक पहुँच | रिपॉज़िटरी लेखन पहुँच |
| निष्पादन संदर्भ | Gitea ऑपरेटिंग-सिस्टम खाता |
| CISA KEV दिनांक | 2026-08-25 |
| फ़ाइल | विवरण |
|---|---|
gitea_diffpatch_rce.py | केवल मानक-लाइब्रेरी आधारित प्रूफ ऑफ कॉन्सेप्ट जो प्रमाणित करता है, एक निजी रिपॉज़िटरी बनाता है, तैयार किया गया पैच सबमिट करता है, और कमांड आउटपुट प्राप्त करता है। |
payload.patch | उदाहरण पैच जो एक निष्पादन योग्य hooks/post-index-change हुक बनाता है। |
poc.png | प्रयोगशाला सत्यापन के दौरान लिया गया स्क्रीनशॉट। |
README.md | मूल शोध नोट्स। |
प्रूफ ऑफ कॉन्सेप्ट को निम्नलिखित पृथक वातावरण में सत्यापित किया गया था:
| घटक | कॉन्फ़िगरेशन |
|---|---|
| Gitea | 1.27.0 |
| Git | 2.47.2 |
| परिनियोजन | gitea-lab नाम का Docker कंटेनर |
| सेवा पता | 192.168.184.128:3000 |
| देखी गई पहचान | uid=1000(git) gid=1000(git) |
सफल शोषण ने निम्नलिखित के समान कमांड आउटपुट उत्पन्न किया:
uid=1000(git) gid=1000(git) groups=1000(git)
Linux 6.12.20-amd64 x86_64
/data/gitea/tmp/local-repo/upload.git630501597
[exit-status=0]

स्क्रिप्ट केवल Python की मानक लाइब्रेरी का उपयोग करती है और इसके लिए अतिरिक्त पैकेजों की आवश्यकता नहीं है।
python3 gitea_diffpatch_rce.py <base_url> <username> <password> "<command>"
स्थानीय प्रयोगशाला इंस्टेंस के लिए उदाहरण:
python3 gitea_diffpatch_rce.py \
http://127.0.0.1:3000 \
pocuser \
'P@ssw0rd!' \
'id; uname -a'
स्क्रिप्ट पहले वेब पंजीकरण का प्रयास करती है, फिर दिए गए क्रेडेंशियल्स के साथ प्रमाणित करती है। यह उसी कमांड को खुले पंजीकरण वाले इंस्टेंस पर नए खाते के साथ या किसी मौजूदा खाते के साथ काम करने देती है।
शोषण श्रृंखला में चार चरण होते हैं:
हमलावर-नियंत्रित पैच सबमिशन
POST /api/v1/repos/{owner}/{repo}/diffpatch एक अस्थायी क्लोन के भीतर
git apply --index --recount --cached --binary --ignore-whitespace --whitespace=fix -3 का उपयोग करके दिए गए पैच सामग्री को लागू करता है।
हुक पथ स्थापन
अस्थायी रिपॉज़िटरी एक बेयर, साझा क्लोन के रूप में बनाई जाती है। एक बेयर
रिपॉज़िटरी में, रिपॉज़िटरी रूट ही $GIT_DIR भी होता है; परिणामस्वरूप, पैच
पथ hooks/post-index-change Git की सक्रिय hooks निर्देशिका के भीतर
हल हो जाता है।
निष्पादन योग्य हुक का भौतिकीकरण
वही पैच दो बार सबमिट किया जाता है। दूसरा अनुप्रयोग एक add/add विरोध
उत्पन्न करता है, जिससे तीन-तरफ़ा फ़ॉलबैक --cached के उपयोग के बावजूद पथ को
मोड 100755 के साथ डिस्क पर भौतिक रूप दे देता है। इसके बाद का इंडेक्स
अपडेट post-index-change को आमंत्रित करता है, जो इंजेक्ट किए गए शेल कोड को
Gitea सेवा खाते के रूप में निष्पादित करता है।
Git-मूल आउटपुट पुनर्प्राप्ति
हुक objects/info/alternates के माध्यम से मूल रिपॉज़िटरी की पहचान करता है,
कमांड आउटपुट को Git blob के रूप में संग्रहीत करता है, एक tree और commit
बनाता है, और refs/heads/output-leak को अपडेट करता है। इसके बाद प्रूफ ऑफ
कॉन्सेप्ट Gitea के raw-file API के माध्यम से परिणाम प्राप्त करता है। इस
तकनीक के लिए लक्ष्य से सीधे आउटबाउंड कनेक्शन की आवश्यकता नहीं होती।
सफल शोषण Gitea सेवा खाते के विशेषाधिकारों के साथ कमांड निष्पादन प्रदान करता है। परिनियोजन कॉन्फ़िगरेशन के आधार पर, एक हमलावर निम्नलिखित तक पहुँच सकता है:
app.ini और डेटाबेस क्रेडेंशियल्सSECRET_KEY, INTERNAL_TOKEN, और LFS-संबंधित सीक्रेट्सप्रयोगशाला खाते के पास app.ini तक पढ़ने की पहुँच की पुष्टि की गई थी।
रक्षकों को निम्नलिखित आर्टिफ़ैक्ट्स और अनुरोध पैटर्न की जाँच करनी चाहिए:
/api/v1/repos/*/*/diffpatch पर तेज़ी से क्रम में दो समान या लगभग समान
अनुरोधoutput-leak नाम की एक ब्रांचpoc <[email protected]> द्वारा लेखित कमिटhooks/post-index-change
नाम की अप्रत्याशित निष्पादन योग्य फ़ाइलें/data/gitea/tmp/local-repo/upload.git* जैसे पथों के नीचे संदिग्ध गतिविधिये संकेतक शामिल प्रूफ ऑफ कॉन्सेप्ट का वर्णन करते हैं और संपूर्ण नहीं हैं; एक संशोधित एक्सप्लॉइट भिन्न पथ, refs, पहचान, या आउटपुट चैनलों का उपयोग कर सकता है।
/api/v1/.../diffpatch रूटों तक पहुँच अस्वीकार करके।
परिनियोजन से पहले वैध इंटीग्रेशन के विरुद्ध नियम को सत्यापित करें।DISABLE_REGISTRATION=true सेट करके। यह अप्रमाणित पहुँच को कम करता है
लेकिन रिपॉज़िटरी लेखन पहुँच वाले मौजूदा उपयोगकर्ताओं से सुरक्षा नहीं देता।इस शोध में उपयोग किए गए प्रयोगशाला कंटेनर के लिए, टियरडाउन निम्नलिखित के साथ किया जा सकता है:
docker rm -f gitea-lab
यह सामग्री रक्षकों को भेद्यता को पुनरुत्पादित करने, समझने, पहचानने और उपचार करने में सहायता के लिए प्रदान की गई है। ऑपरेटरों को केवल पृथक वातावरणों में परीक्षण करना चाहिए और अपने संगठन की प्राधिकरण और प्रकटीकरण आवश्यकताओं का पालन करना चाहिए।