
Forgejo 16.0.5 - عالي - عن بُعد - SSRF - اكتشاف OpenID يجلب عناوين URL يتحكم بها المهاجم
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · forgejo-openid-discovery-ssrf
الفئة: SSRF الوصول: عن بُعد
Forgejo 16.0.5 (8d24b7d) - Forgejo
عندما يكون [openid] ENABLE_OPENID_SIGNIN مُفعَّلاً، فإن POST /user/login/openid غير المُصادَق يمرِّر عنوان URL الخاص بالمهاجم إلى yohcop openid-go v1.0.1. تستخدم الدوال المساعدة على مستوى الحزمة في تلك المكتبة http.DefaultClient. لا يوجد hostmatcher على هذا المسار. تُرشِّح الـ webhooks والـ migrations طلبات HTTP الصادرة. أما OpenID فلا يفعل ذلك.
من يستطيع الوصول إلى نموذج تسجيل الدخول يمكنه توجيه طلب Yadis GET نحو loopback و RFC1918 و CGNAT و IMDS من مضيف Forgejo.
| المعرّف | لا يوجد CVE بعد |
| الفئة | SSRF |
| الوصول | عن بُعد (غير مُصادَق، عند تفعيل تسجيل الدخول عبر OpenID) |
| CWE | CWE-918 |
| CVSS | مرتفع: 8.6 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N |
| المنتج | Forgejo |
| المتأثر | حتى v16.0.5 (8d24b7d) مع ENABLE_OPENID_SIGNIN؛ من بقايا Gitea CVE-2026-58314 |
| المصادقة | غير مُصادَق |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
بدون حساب. أرسِل POST لعنوان URL الخاص بـ OpenID. يقوم مضيف Forgejo بجلبه.
| الصلاحية | الطريقة / نقطة الوصول | الاستطلاع / السلامة / التوافر | مُثبَت مختبرياً أو مُستنتَج |
|---|---|---|---|
| توجيه طلب Yadis GET نحو loopback | POST /user/login/openid غير مُصادَق مع openid=http://127.0.0.1:18080/ | استطلاع (HTTP صادر من مضيف Forgejo) | مُثبَت مختبرياً. رأى الـ Oracle طلب GET / مع Accept: application/xrds+xml من 127.0.0.1 |
| استكشاف RFC1918 و CGNAT و link-local و IMDS | نفس http.DefaultClient Discover، بدون مرشِّح IP | استطلاع | مُستنتَج من العميل. استخدم المختبر loopback فقط |
| التكرار من إضافة OpenID لمستخدم مُسجَّل | POST /user/settings/security/openid يستدعي أيضاً RedirectURL ويتخطى allowedOpenIDURI | استطلاع | مُستنتَج من الـ handler. استخدم المختبر POST تسجيل الدخول غير المُصادَق |
| قراءة أجسام الاستجابة في خطأ تسجيل الدخول | بعد CVE-2021-45325، لم تعد الأخطاء تُفرِّغ نتيجة الجلب | استطلاع | مُثبَت مختبرياً كمُغلَق. هذه البقية هي الطلب، وليست تسريب HTML |
مُغلَق على هذا الإصدار: OpenID association CSRF (nonce الجلسة openIDState)، و hostmatcher الخاص بالـ webhook/migrate (لا يزال مُستخدَماً هناك)، و git followRedirects=false، و migrate LookupIP CVE-2026-82556. لا يُكمل المختبر تسجيل دخول OpenID ولا يُعيد shell.
خانة الاختيار في مُثبِّت الويب مُفعَّلة افتراضياً (EnableOpenIDSignIn = MustBool(!InstallLock) أثناء عدم القفل، ثم تُكتَب في app.ini). بعد القفل، يكون المفتاح المحذوف false. لا يحتوي قالب app.ini في Docker على قسم [openid]، لذا فإن صورة مقفولة مسبقاً بدون المعالج تكون مُعطَّلة ما لم يُعيّن المشغِّل المفتاح. WHITELISTED_URIS الفارغ يسمح بكل URI.
أغلق v16.0.5 ثغرة OpenID association CSRF. جلست على هذا السطح على أي حال. وضع Gitea PR 38406 / CVE-2026-58314 عميلاً مُرشَّحاً بـ hostmatcher في نسخة openid-go مخصَّصة. لا يزال هذا الإصدار يستدعي الدوال المساعدة على مستوى الحزمة.
مسارات خاطئة مُسجَّلة مسبقاً: إعادة الإبلاغ عن association CSRF (هذا الـ nonce موجود في الشجرة)؛ اعتبار صورة Docker المقفولة مسبقاً هي الافتراضي (المعالج يُفعِّل خانة الاختيار)؛ توقُّع تسريب سلسلة أخطاء OpenID القديم؛ reverse shell. مسرحية.
python3 forgejo-openid-discovery-ssrf-Abraxas-Labs.py
أو:
cd lab
./run.sh
استهدف فقط http://127.0.0.1:19330. الصورة codeberg.org/forgejo/forgejo:16.0.5. يتشارك الـ Oracle شبكة Forgejo netns ويربط 127.0.0.1:18080.
IOC post-openid status=200
IOC xrds-hits count=1
SUCCESS forgejo-openid-discovery-ssrf how=live post=/user/login/openid openid=http://127.0.0.1:18080/ path=/ accept=application/xrds+xml peer=127.0.0.1 post-status=200 FORGEJO-OPENID-DISCOVERY-WITNESS
نفس ما في Gitea PR 38406: http.Client مُرشَّح بـ hostmatcher في نسخة openid-go مخصَّصة. أبقِ WHITELISTED_URIS كبوابة ثانية. احجب loopback و RFC1918 و CGNAT و link-local و metadata.
modules/auth/openid/openid.goGNU Affero GPL v3.0. انظر LICENSE. مختبر loopback فقط. بدون ضمان.