
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 が存在しない。Webhook とマイグレーションは外向き HTTP をフィルタリングする。OpenID はそうではない。
ログインフォームに到達できる者は、Forgejo ホストからループバック、RFC1918、CGNAT、IMDS に対して Yadis GET を駆動できる。
| ID | CVE 未割当 |
| クラス | SSRF |
| 到達範囲 | リモート (OpenID サインインが有効な場合、未認証) |
| 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 |
| 製品 | Forgejo |
| 影響 | ENABLE_OPENID_SIGNIN を有効にした v16.0.5 (8d24b7d) まで; Gitea CVE-2026-58314 の残存 |
| 認証 | 未認証 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
アカウント不要。OpenID URL を POST する。Forgejo ホストがそれを取得する。
| 権限 | メソッド / シンク | 偵察 / 完全性 / 可用性 | ラボ実証または推測 |
|---|---|---|---|
| ループバックに対して Yadis GET を駆動 | 未認証 POST /user/login/openid に openid=http://127.0.0.1:18080/ | 偵察 (Forgejo ホストからの外向き HTTP) | ラボ実証済み。Oracle は 127.0.0.1 から Accept: application/xrds+xml 付きの GET / を観測 |
| RFC1918、CGNAT、リンクローカル、IMDS を探索 | 同じ http.DefaultClient Discover、IP フィルタなし | 偵察 | クライアントから推測。ラボはループバックのみ使用 |
| サインイン済みの add-OpenID から繰り返し | POST /user/settings/security/openid も RedirectURL を呼び出し、allowedOpenIDURI をスキップ | 偵察 | ハンドラから推測。ラボは未認証ログイン POST を使用 |
| ログインエラーでレスポンスボディを読む | CVE-2021-45325 以降、エラーは fetch をダンプしなくなった | 偵察 | ラボ実証済みでクローズ。この残存はリクエストであり、HTML リークではない |
このピンでクローズ済み: OpenID アソシエーション CSRF (openIDState セッションノンス)、webhook/migrate hostmatcher (そちらでは依然使用)、git followRedirects=false、migrate LookupIP CVE-2026-82556。ラボは OpenID ログインを完了せず、シェルを返さない。
Web インストーラのチェックボックスはデフォルトでオン (EnableOpenIDSignIn = MustBool(!InstallLock) がアンロック中、その後 app.ini に書き込まれる)。ロック後、省略されたキーは false。Docker の app.ini テンプレートには [openid] セクションがないため、ウィザードなしの事前ロック済みイメージは、オペレータがキーを設定しない限りオフ。空の WHITELISTED_URIS はすべての URI を許可する。
v16.0.5 は OpenID アソシエーション CSRF をクローズした。それでも私はそのサーフェスに留まった。Gitea PR 38406 / CVE-2026-58314 は hostmatcher でフィルタリングされたクライアントを専用の openid-go インスタンスに導入した。このピンは依然としてパッケージレベルヘルパーを呼び出している。
すでに記録済みの誤った道: アソシエーション CSRF の再報告 (そのノンスはツリー内にある); Docker の事前ロック済みイメージをデフォルトとみなす (ウィザードがチェックボックスをオンに書き込む); 古い OpenID エラー文字列リークを期待する; リバースシェル。茶番。
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 と同じ: hostmatcher でフィルタリングされた http.Client を専用の openid-go インスタンスに導入する。WHITELISTED_URIS を第二のゲートとして維持する。ループバック、RFC1918、CGNAT、リンクローカル、メタデータをブロックする。
modules/auth/openid/openid.goGNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。