
Forgejo 16.0.5 - Alta - Remota - SSRF - OpenID discovery recupera URL controllati dall'attaccante
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · forgejo-openid-discovery-ssrf
Classe: SSRF Portata: Remota
Forgejo 16.0.5 (8d24b7d) - Forgejo
Quando [openid] ENABLE_OPENID_SIGNIN è attivo, la richiesta non autenticata POST /user/login/openid passa l'URL dell'attaccante a yohcop openid-go v1.0.1. Gli helper a livello di pacchetto di quella libreria usano http.DefaultClient. Non c'è alcun hostmatcher su questo percorso. I webhook e le migrazioni filtrano l'HTTP in uscita. OpenID no.
Chiunque possa raggiungere il form di login può indirizzare una GET Yadis verso loopback, RFC1918, CGNAT e IMDS dall'host Forgejo.
| ID | nessuna CVE al momento |
| Classe | SSRF |
| Portata | Remota (non autenticata, quando il sign-in OpenID è abilitato) |
| CWE | CWE-918 |
| CVSS | Alto: 8.6 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N |
| Prodotto | Forgejo |
| Affetto | fino alla v16.0.5 (8d24b7d) con ENABLE_OPENID_SIGNIN; residuo di Gitea CVE-2026-58314 |
| Auth | non autenticata |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Nessun account. Invia un URL OpenID via POST. L'host Forgejo lo recupera.
| Privilegio | Metodo / sink | Recon / integrità / disponibilità | Provato in lab o dedotto |
|---|---|---|---|
| Indirizzare una GET Yadis verso loopback | POST /user/login/openid non autenticata con openid=http://127.0.0.1:18080/ | Recon (HTTP in uscita dall'host Forgejo) | Provato in lab. L'oracle ha visto GET / con Accept: application/xrds+xml da 127.0.0.1 |
| Sondare RFC1918, CGNAT, link-local, IMDS | Stesso Discover con http.DefaultClient, nessun filtro IP | Recon | Dedotto dal client. Il lab ha usato solo loopback |
| Ripetere da un add-OpenID autenticato | POST /user/settings/security/openid chiama anch'esso RedirectURL e salta allowedOpenIDURI | Recon | Dedotto dall'handler. Il lab ha usato il POST di login non autenticato |
| Leggere i corpi delle risposte nell'errore di login | Dopo CVE-2021-45325, gli errori non riversano più il fetch | Recon | Provato in lab come chiuso. Questo residuo è la richiesta, non una fuga HTML |
Chiusi su questo pin: CSRF dell'associazione OpenID (nonce di sessione openIDState), hostmatcher di webhook/migrate (ancora usato lì), git followRedirects=false, migrate LookupIP CVE-2026-82556. Il lab non completa un login OpenID e non restituisce una shell.
La casella del web installer è attiva di default (EnableOpenIDSignIn = MustBool(!InstallLock) finché non bloccato, poi scritta in app.ini). Dopo il lock, una chiave omessa è false. Il template app.ini di Docker non ha sezione [openid], quindi un'immagine pre-bloccata senza il wizard è disattivata a meno che l'operatore imposti la chiave. WHITELISTED_URIS vuoto consente ogni URI.
La v16.0.5 ha chiuso la CSRF dell'associazione OpenID. Mi sono comunque soffermato su quella superficie. Gitea PR 38406 / CVE-2026-58314 ha inserito un client filtrato da hostmatcher in un'istanza dedicata di openid-go. Questo pin chiama ancora gli helper a livello di pacchetto.
Vicoli ciechi già registrati: ri-segnalare la CSRF dell'associazione (quel nonce è nel tree); trattare un'immagine Docker pre-bloccata come default (il wizard attiva la casella); aspettarsi il vecchio leak della stringa di errore OpenID; una reverse shell. Teatro.
python3 forgejo-openid-discovery-ssrf-Abraxas-Labs.py
oppure:
cd lab
./run.sh
Target solo http://127.0.0.1:19330. Immagine codeberg.org/forgejo/forgejo:16.0.5. L'oracle condivide il netns di Forgejo e si lega a 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
Come in Gitea PR 38406: un http.Client filtrato da hostmatcher in un'istanza dedicata di openid-go. Mantieni WHITELISTED_URIS come secondo gate. Blocca loopback, RFC1918, CGNAT, link-local e metadata.
modules/auth/openid/openid.goGNU Affero GPL v3.0. Vedi LICENSE. Solo lab su loopback. Nessuna garanzia.