
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
Gitea 1.27.3 - Gitea
IsMigrateURLAllowed आपके द्वारा टाइप किए गए URL पर एक वन-शॉट net.LookupIP है। इसके बाद बाइट्स git clone --mirror से गुज़रते हैं। HandleGitCmdHTTPRedirection को git को उस हॉप का पालन करने से रोकना चाहिए। यह कुछ नहीं करता। कमेंट ही निष्कर्ष है: उन्होंने http.followRedirects=false छोड़ दिया क्योंकि GitLab बिना .git के 301 देता है। Pull-mirror fetch भी उसी नो-ऑप को कॉल करता है।
एक साइन-इन किया हुआ उपयोगकर्ता allow-list किए गए bait होस्ट से migrate कर सकता है और git 302 का पालन करते हुए loopback 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 |
| Product | Gitea |
| Affected | v1.27.3 (146cc3e) तक |
| Auth | प्रमाणित (डिफ़ॉल्ट खुला पंजीकरण) |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1 |
पंजीकरण करें, किसी बाहरी दिखने वाले URL से migrate करें जो http://127.0.0.1:.../internal.git पर 302 करता है। सीधे loopback पर migrate करना अस्वीकृत है। रीडायरेक्ट-फॉलो किया गया clone नहीं है। Witness फ़ाइल उनके रेपो में पहुँच जाती है।
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 hook RCE, CISA KEV), CVE-2026-59774 (unauth Org-mode #+INCLUDE), fork-PR Actions गेट्स, reverse-proxy X-WEBAUTH-USER डिफ़ॉल्ट। उनके लिए 1.27.3+ पर बने रहें। मैं फिर भी उस टैग पर बैठा रहा।
CVE-2026-59765 ने Go uri.Open को ठीक किया। CVE-2026-22874 ने Go reservedIPNets को ठीक किया। Git का redirector अभी भी एक FIXME है। Changelog "disable HTTP redirects on pull mirror sync" यह फ़ंक्शन नहीं है।
Lab Gitea को 8.8.4.2 पर रखता है ताकि 8.8.4.10 पर एक bait होस्ट hostmatcher को बाहरी दिखे। आंतरिक git HTTP Gitea netns पर केवल loopback पर बाइंड होता है (network_mode: service:gitea, पोर्ट 9418)। 127.0.0.1 पर सीधे migrate को विफल होना चाहिए। रीडायरेक्ट-फॉलो किए गए clone को सफल होना चाहिए। redir.py /bait.git को http://127.0.0.1:9418/internal.git पर 302 करता है। Witness फ़ाइल WITNESS में GHSA-GITEA-GIT-REDIR-SSRF है।
पहले से दर्ज गलत रास्ते: ALLOW_LOCALNETWORKS true (तब allow-list चली जाती है); file://; X-Gitea-Internal-Auth; एक reverse shell। नाटक। सीधे loopback migrate अस्वीकृत होना ही नियंत्रण है।
क्लाइंट बग उत्पाद बग जैसे दिखते हैं। एक हेल्पर जो 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
submit-time DNS को सीमा न मानें। http.followRedirects=false को बाध्य करें (और clone URLs को .git पर सामान्यीकृत करें ताकि GitLab अभी भी काम करे), या git HTTP को ऐसे dialer के माध्यम से प्रॉक्सी करें जो हर हॉप पर hostmatcher को फिर से चलाए।
HandleGitCmdHTTPRedirection · IsMigrateURLAllowedGNU Affero GPL v3.0। देखें LICENSE। केवल loopback lab। कोई वारंटी नहीं।