
Gitea के repo migrate endpoint में authenticated SSRF के लिए proof-of-concept और lab, जहाँ git HTTP redirects का पालन करते हुए loopback git HTTP में जाता है और internal objects लीक करता है।
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · gitea-git-redir-ssrf
राइट-अप: https://abraxaslabs.tech/research/gitea-git-redir-ssrf
Gitea 1.27.3 - Gitea
IsMigrateURLAllowed आपके द्वारा टाइप किए गए URL पर एक वन-शॉट net.LookupIP है। इसके बाद बाइट्स git clone --mirror से होकर गुज़रते हैं। HandleGitCmdHTTPRedirection को git को उस हॉप का अनुसरण करने से रोकना चाहिए। यह कुछ नहीं करता। टिप्पणी ही निष्कर्ष है: उन्होंने http.followRedirects=false को छोड़ दिया क्योंकि GitLab .git के बिना 301 देता है। पुल-मिरर फ़ेच भी उसी नो-ऑप को कॉल करता है।
एक साइन-इन किया हुआ उपयोगकर्ता किसी allow-list वाले बेट होस्ट से माइग्रेट कर सकता है और git उस 302 का अनुसरण करते हुए लूपबैक git HTTP में चला जाता है। आंतरिक ऑब्जेक्ट्स उनके स्वयं के स्वामित्व वाले रेपो में पहुँच जाते हैं।
| ID | अभी तक कोई CVE नहीं |
| CWE | CWE-918 |
| CVSS | High: 7.7 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N |
| उत्पाद | Gitea |
| प्रभावित | v1.27.3 (146cc3e) तक |
| प्रमाणीकरण | प्रमाणीकृत (डिफ़ॉल्ट खुला पंजीकरण) |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1 |
पंजीकरण करें, किसी बाहरी दिखने वाले URL से माइग्रेट करें जो http://127.0.0.1:.../internal.git पर 302 करता है। लूपबैक पर सीधा माइग्रेट अस्वीकृत है। रीडायरेक्ट-फ़ॉलो किया गया क्लोन नहीं है। विटनेस फ़ाइल उनके रेपो में पहुँच जाती है।
file:// डिस्क रीड नहीं। /api/internal पर X-Gitea-Internal-Auth नहीं (git वह हेडर सेट नहीं करेगा)। अनप्रमाणीकृत RCE नहीं। मेटाडेटा RCE नहीं, जब तक आप अलग से यह न दिखाएँ कि git ने बॉडी को संग्रहीत किया।
उसी टैग के अवशेष: keys IDOR, hostmatcher 0.0.0.0/8।
v1.27.3 ने 2026 GHSA लहर को बंद किया: CVE-2026-60004 (diffpatch हुक RCE, CISA KEV), CVE-2026-59774 (अनप्रमाणीकृत Org-mode #+INCLUDE), fork-PR Actions गेट्स, रिवर्स-प्रॉक्सी X-WEBAUTH-USER डिफ़ॉल्ट। उनके लिए 1.27.3+ पर बने रहें। मैं फिर भी उस टैग पर टिका रहा।
CVE-2026-59765 ने Go uri.Open को ठीक किया। CVE-2026-22874 ने Go reservedIPNets को ठीक किया। Git का रीडायरेक्टर अभी भी एक FIXME है। चेंजलॉग में "disable HTTP redirects on pull mirror sync" इस फ़ंक्शन को नहीं दर्शाता।
लैब Gitea को 8.8.4.2 पर रखता है ताकि 8.8.4.10 पर स्थित एक बेट होस्ट hostmatcher के लिए बाहरी दिखे। आंतरिक git HTTP Gitea नेटनेम्स पर केवल लूपबैक पर बाइंड होता है (network_mode: service:gitea, पोर्ट 9418)। 127.0.0.1 पर सीधा माइग्रेट विफल होना चाहिए। रीडायरेक्ट-फ़ॉलो किया गया क्लोन सफल होना चाहिए। redir.py /bait.git को http://127.0.0.1:9418/internal.git पर 302 करता है। विटनेस फ़ाइल WITNESS में GHSA-GITEA-GIT-REDIR-SSRF है।
पहले से दर्ज गलत रास्ते: ALLOW_LOCALNETWORKS true (तब allow-list ही चली जाती है); file://; X-Gitea-Internal-Auth; एक रिवर्स शेल। नाटक। सीधा लूपबैक माइग्रेट अस्वीकृत होना ही नियंत्रण है।
क्लाइंट बग उत्पाद बग जैसे दिखते हैं। एक हेल्पर जो http.client को शैडो करता है, कभी पैकेट नहीं भेजता। HTTPResponse पर .recv() .read() नहीं है। मैं यह एक बार बता रहा हूँ क्योंकि इसने समय लिया और एक मिनट के लिए ऐसा लगा कि 1.27.3 ने काम पूरा कर दिया है।
cd lab
./run.sh
केवल http://127.0.0.1:18103 को लक्षित करें। ALLOW_LOCALNETWORKS=false।
negative-loopback status=422 You can not import from disallowed hosts
migrate-bait status=201 clone_addr=http://8.8.4.10/bait.git
fetch raw/WITNESS status=200 GHSA-GITEA-GIT-REDIR-SSRF
SUCCESS Gitea #2 git HTTP redirect SSRF
सबमिट-समय DNS को सीमा न मानें। http.followRedirects=false को बाध्य करें (और क्लोन URL को .git में सामान्यीकृत करें ताकि GitLab अभी भी काम करे), या git HTTP को ऐसे डायलर के माध्यम से प्रॉक्सी करें जो प्रत्येक हॉप पर hostmatcher को फिर से चलाए।
HandleGitCmdHTTPRedirection · IsMigrateURLAllowedGNU Affero GPL v3.0. देखें LICENSE। केवल लूपबैक लैब। कोई वारंटी नहीं।