
Forgejo 16.0.5 - उच्च - रिमोट - SSRF - OpenID डिस्कवरी हमलावर-नियंत्रित URL प्राप्त करती है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · forgejo-openid-discovery-ssrf
Class: SSRF Reach: Remote
Forgejo 16.0.5 (8d24b7d) - Forgejo
जब [openid] ENABLE_OPENID_SIGNIN चालू होता है, तो unauthenticated POST /user/login/openid हमलावर के URL को yohcop openid-go v1.0.1 को सौंप देता है। उस लाइब्रेरी के package-level helpers http.DefaultClient का उपयोग करते हैं। इस पथ पर कोई hostmatcher नहीं है। Webhooks और migrations outbound HTTP को फ़िल्टर करते हैं। OpenID नहीं करता।
जो कोई भी login form तक पहुँच सकता है, वह Forgejo host से loopback, RFC1918, CGNAT, और IMDS पर Yadis GET चला सकता है।
| ID | अभी तक कोई CVE नहीं |
| Class | SSRF |
| Reach | Remote (unauthenticated, जब OpenID sign-in सक्षम हो) |
| CWE | CWE-918 |
| CVSS | High: 8.6 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N |
| Product | Forgejo |
| Affected | v16.0.5 (8d24b7d) तक ENABLE_OPENID_SIGNIN के साथ; Gitea CVE-2026-58314 का अवशेष |
| Auth | unauthenticated |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1 |
कोई account नहीं। एक OpenID URL POST करें। Forgejo host उसे fetch करता है।
| Privilege | Method / sink | Recon / integrity / availability | Lab-proven या inferred |
|---|---|---|---|
| loopback पर Yadis GET चलाना | Unauth POST /user/login/openid with openid=http://127.0.0.1:18080/ | Recon (Forgejo host से outbound HTTP) | Lab-proven। Oracle ने 127.0.0.1 से Accept: application/xrds+xml के साथ GET / देखा |
| RFC1918, CGNAT, link-local, IMDS की जाँच | वही http.DefaultClient Discover, कोई IP filter नहीं | Recon | client से inferred। Lab ने केवल loopback का उपयोग किया |
| signed-in add-OpenID से दोहराना | POST /user/settings/security/openid भी RedirectURL को कॉल करता है और allowedOpenIDURI को छोड़ देता है | Recon | handler से inferred। Lab ने unauth login POST का उपयोग किया |
| login error में response bodies पढ़ना | CVE-2021-45325 के बाद, errors अब fetch को dump नहीं करते | Recon | Lab-proven closed। यह अवशेष request है, HTML leak नहीं |
इस pin पर बंद: OpenID association CSRF (openIDState session nonce), webhook/migrate hostmatcher (वहाँ अभी भी उपयोग होता है), git followRedirects=false, migrate LookupIP CVE-2026-82556। Lab OpenID login पूरा नहीं करता और shell वापस नहीं देता।
web installer checkbox डिफ़ॉल्ट रूप से चालू रहता है (EnableOpenIDSignIn = MustBool(!InstallLock) जब unlocked, फिर app.ini में लिखा जाता है)। Lock के बाद, छोड़ी गई key false होती है। Docker app.ini template में कोई [openid] section नहीं है, इसलिए wizard के बिना pre-locked image बंद रहती है जब तक operator key सेट न करे। खाली WHITELISTED_URIS हर URI की अनुमति देता है।
v16.0.5 ने OpenID association CSRF को बंद कर दिया। मैं फिर भी उस surface पर बैठा रहा। Gitea PR 38406 / CVE-2026-58314 ने hostmatcher-filtered client को एक dedicated openid-go instance में डाला। यह pin अभी भी package-level helpers को कॉल करता है।
पहले से दर्ज गलत रास्ते: association CSRF को दोबारा file करना (वह nonce tree में है); Docker pre-locked image को default मानना (wizard checkbox को चालू लिखता है); पुराने OpenID error-string leak की अपेक्षा; एक reverse shell। नाटक।
python3 forgejo-openid-discovery-ssrf-Abraxas-Labs.py
या:
cd lab
./run.sh
लक्ष्य केवल http://127.0.0.1:19330। Image codeberg.org/forgejo/forgejo:16.0.5। Oracle Forgejo netns साझा करता है और 127.0.0.1:18080 bind करता है।
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 के समान: एक hostmatcher-filtered http.Client को dedicated openid-go instance में डालें। WHITELISTED_URIS को दूसरे gate के रूप में रखें। loopback, RFC1918, CGNAT, link-local, और metadata को ब्लॉक करें।
modules/auth/openid/openid.goGNU Affero GPL v3.0। देखें LICENSE। केवल loopback lab। कोई वारंटी नहीं।