
GitLab - عالي - استيراد Gitea عبر HTTPS SSRF - إسقاط دبوس UrlBlocker
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · gitlab-gitea-import-ssrf
GitLab CE 19.4.1 - GitLab Inc.
استيراد Gitea يستدعي UrlBlocker.validate! مرة واحدة، ثم بالنسبة إلى https يتخلص من URI المثبّت على IP ويسلّم Faraday اسم المضيف الأصلي. يتحقق Octokit UrlValidation مرة أخرى ولا يعيد كتابة env[:url]. أعد ربط الاسم بين هذين الاستعلامين وسيقوم GitLab بعمل GET على loopback كما لو كان Gitea. تعود JSON الخاصة بقائمة المستودعات عبر GET /import/gitea/status.json. تحتفظ عمليات استيراد HTTP بالتثبيت. يتم حظر https://127.0.0.1 المباشر.
مستخدم مسجّل الدخول يمكنه فتح استيراد Gitea في مساحته الشخصية يمكنه جعل GitLab يجلب مضيفًا يعيد ربطه بـ loopback، ويحصل على المحتوى.
| 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 (26212baacadb على شجرة v19.4.1-ee) |
| المصادقة | مستخدم موثّق، استيراد Gitea، مساحة شخصية |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
اضبط Gitea Host URL على https://<name-they-control>/. يسمح UrlBlocker بأول سجل A عام. تحتفظ client_options الخاصة بـ HTTPS باسم المضيف هذا. أعد الربط بـ 127.0.0.1. يقوم Faraday بعمل GET على الـ catcher على loopback الخاص بعامل GitLab. provider_repos في status.json هو ما أعاده الـ catcher.
على omnibus الكل في واحد، هذا يعني Workhorse وPuma والمصدّرات وأي شيء آخر يستمع على العامل. ليس RCE على المضيف. ليس بدون مصادقة. يبقى HTTP Host URL على IP المثبّت.
نفس المنتج، بقايا شقيقة: Gitaly fetch omits 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 read مغلقة على هذا الإصدار. لم يكن استيراد 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 الجاهز. الطلبات المحلية معطّلة. شهادة CA الخاصة بالمختبر في /etc/gitlab/trusted-certs لأن Faraday ssl.verify تساوي true. DNS لـ gitea.lab: الاستعلامات 1-2 تعيد 1.1.1.1، والاستعلامات اللاحقة تعيد 127.0.0.1. يتشارك الـ catcher شبكة GitLab netns على :443. أعاد GET /import/gitea/status.json قيمة provider_repos باسم GITLAB-GITEA-IMPORT-SSRF-WITNESS. سجل الـ 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://gitea.lab/ على التثبيت ولم يُعد الشاهد.
المنعطفات الخاطئة المسجّلة مسبقًا: /users/sign_in مع Accept: application/json يعيد 404 (HTML يعيد 200)؛ كلمة مرور البذرة CveLabRoot9! مرفوضة لأنها تحتوي على root؛ ربط CA بـ bind-mount ro يعطي EROFS بعد أن يربط reconfigure الملف؛ أول استعلامين ثم loopback في الاستعلام الثاني يجعل UrlValidation يحظر قبل أن يتصل Faraday. وضع الأزواج (فردي عام، زوجي loopback) هو ما نجح. reverse shell. مسرحية. الدليل هو الشاهد في status.json بالإضافة إلى peer الخاص بالـ catcher.
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
استخدم verified_url.to_s لـ https بالطريقة نفسها التي يستخدمها HTTP بالفعل. أعد كتابة env[:url] في Octokit UrlValidation إلى IP المثبّت.
gitea_controller.rb · legacy_github_import/client.rb · octokit/url_validation.rbGNU Affero GPL v3.0. راجع LICENSE. مختبر loopback فقط. دون أي ضمان.