
GitLab - उच्च - Gitea HTTPS आयात SSRF - UrlBlocker पिन ड्रॉप
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · gitlab-gitea-import-ssrf
राइट-अप: https://abraxaslabs.tech/research/gitlab-gitea-import-ssrf
GitLab CE 19.4.1 - GitLab Inc.
Gitea आयात UrlBlocker.validate! को एक बार कॉल करता है, फिर https के लिए IP-पिन किए गए URI को फेंक देता है और Faraday को मूल होस्टनाम सौंप देता है। Octokit UrlValidation फिर से सत्यापन करता है और env[:url] को फिर से नहीं लिखता। उन लुकअप्स के बीच नाम को रीबाइंड करें और GitLab लूपबैक को GET करता है जैसे वह Gitea हो। रेपो-लिस्ट JSON GET /import/gitea/status.json पर वापस आता है। HTTP आयात पिन बनाए रखते हैं। सीधा https://127.0.0.1 अवरुद्ध है।
एक साइन-इन किया हुआ उपयोगकर्ता जो अपने व्यक्तिगत नेमस्पेस पर Gitea आयात खोल सकता है, GitLab से ऐसा होस्ट फ़ेच करवा सकता है जिसे वह लूपबैक पर रीबाइंड करता है, और उसे बॉडी मिल जाती है।
| ID | अभी तक कोई CVE नहीं |
| CWE | CWE-918, CWE-367 |
| CVSS | High: 7.7 CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:L/A:N |
| उत्पाद | GitLab CE |
| प्रभावित | 19.4.1-ce.0 (v19.4.1-ee ट्री पर 26212baacadb) |
| प्रमाणीकरण | प्रमाणीकृत उपयोगकर्ता, Gitea आयात, व्यक्तिगत नेमस्पेस |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1 |
Gitea Host URL को https://<name-they-control>/ पर सेट करें। UrlBlocker पहले सार्वजनिक A-रिकॉर्ड की अनुमति देता है। HTTPS client_options उस होस्टनाम को बनाए रखता है। 127.0.0.1 पर रीबाइंड करें। Faraday GitLab वर्कर लूपबैक पर कैचर को GET करता है। status.json का provider_repos वही होता है जो कैचर ने लौटाया।
ऑल-इन-वन ऑम्निबस पर वह Workhorse, Puma, एक्सपोर्टर, और वर्कर पर सुनने वाला कुछ भी हो सकता है। होस्ट RCE नहीं। अनप्रमाणीकृत नहीं। HTTP Host URL पिन किए गए IP पर ही रहता है।
वही उत्पाद, सहोदर अवशेष: Gitaly fetch resolved_address छोड़ देता है, webhook 0.0.0.0/8।
मैंने पहले 23 सितंबर 2026 के 19.4.1 / 19.3.3 / 19.2.7 पैच नोट्स पढ़े, फिर v19.4.1-ee ट्री। CI regex RCE, MR diff XSS, Workhorse file.path रीड इस पिन पर बंद हैं। Import SSRF अधूरा था।
Import::GiteaController#client_options ही अवशेष है:
host: verified_url.scheme == 'https' ? provider_url : verified_url.to_s,
HTTP verified_url (IP) का उपयोग करता है। HTTPS provider_url (वह नाम जो उपयोगकर्ता ने टाइप किया) का उपयोग करता है। LegacyGithubImport::Client उस होस्ट से Octokit api_endpoint बनाता है। Gitlab::Octokit::UrlValidation validate! को कॉल करता है और फिर बिना किसी रीराइट के @app.call(env) करता है।
मैंने स्टॉक gitlab/gitlab-ce:19.4.1-ce.0 को खड़ा किया। Local-requests बंद। /etc/gitlab/trusted-certs में Lab CA क्योंकि Faraday ssl.verify true है। gitea.lab के लिए DNS: lookups 1-2 1.1.1.1 लौटाते हैं, बाद के lookups 127.0.0.1 लौटाते हैं। Catcher :443 पर GitLab netns साझा करता है। GET /import/gitea/status.json ने GITLAB-GITEA-IMPORT-SSRF-WITNESS नाम के provider_repos लौटाए। Catcher लॉग: GET /api/v1/user/repos peer=127.0.0.1 host=gitea.lab।
सीधा https://127.0.0.1/ : "Specified URL cannot be used"। HTTP http://gitea.lab/ पिन पर ही रहा और witness नहीं लौटाया।
पहले से दर्ज गलत मोड़: Accept: application/json के साथ /users/sign_in 404 है (HTML 200 है); seed पासवर्ड CveLabRoot9! अस्वीकृत क्योंकि इसमें root है; CA bind-mount ro reconfigure के बाद फ़ाइल को लिंक करने पर EROFS है; lookup 2 पर पहले-दो-फिर-loopback करने से UrlValidation Faraday के कनेक्ट होने से पहले ब्लॉक कर देता है। Pairs मोड (विषम public, सम loopback) ही काम आया। एक reverse shell। नाटक। Oracle status.json में witness और catcher peer है।
cd lab
./run.sh
केवल http://127.0.0.1:18400 को लक्षित करें। GitLab CE को कई GB RAM चाहिए। पहला बूट धीमा होता है। केवल अधिकृत लैब के लिए।
status.json status=200 ... provider_repos ... GITLAB-GITEA-IMPORT-SSRF-WITNESS
catcher GET /api/v1/user/repos peer=127.0.0.1 host=gitea.lab status=200 witness=True
negative-a https://127.0.0.1 blocked
negative-b http://gitea.lab no-witness
SUCCESS GITLAB-GITEA-IMPORT-SSRF status.json mode=pairs http=200 GITLAB-GITEA-IMPORT-SSRF-WITNESS
def client_options
verified_url, provider_hostname = verify_blocked_uri
{
host: verified_url.scheme == 'https' ? provider_url : verified_url.to_s,
api_version: 'v1',
hostname: provider_hostname
}
end
https के लिए verified_url.to_s का उपयोग उसी तरह करें जैसे HTTP पहले से करता है। Octokit UrlValidation में env[:url] को pinned IP पर फिर से लिखें।
gitea_controller.rb · legacy_github_import/client.rb · octokit/url_validation.rbGNU Affero GPL v3.0. देखें LICENSE। केवल लूपबैक लैब। कोई वारंटी नहीं।