
Giteaのhostmatcher許可リストにおける認証済みSSRFを実証するPoCラボ。ここでは、http://0.0.0.1 へのWebhookが、127.0.0.1 では到達できないループバックサービスに到達します。
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · gitea-hostmatcher-0000-ssrf
Gitea 1.27.3 - Gitea
CVE-2026-22874 は reservedIPNets を追加した。CGNAT、TEST-NET、NAT64、Teredo、Azure WireServer。実際のレンジだ。RFC 6890 の 0.0.0.0/8、古い「this network」ブロックではない。IANA は今も公開している。Go の IsGlobalUnicast は 0.0.0.1 に対して true を返す。IsLoopback (127.0.0.0/8) ではない。IsPrivate でもない。デフォルトの外部許可リストはこれをパブリックインターネットとして扱う。Linux は 0.0.0.1 が lo 上にあれば、ローカルソケットに配信する。同じリスナー、二つの名前。
サインイン済みユーザーは http://0.0.0.1 に webhook を送り、フック履歴から HTTP ボディを読める。同じポートの 127.0.0.1 は拒否される。
| ID | CVE 未採番 |
| CWE | CWE-918 |
| CVSS | High: 7.7 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N |
| 製品 | Gitea |
| 影響 | v1.27.3 (146cc3e) まで; CVE-2026-22874 の残存 |
| 認証 | リポジトリ webhook を作成できるサインイン済みユーザー |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
登録し(デフォルトで登録は開放)、リポジトリを作成し、webhook を http://0.0.0.1:<local-port>/ に向け、テストし、フック履歴からレスポンスボディを読む。これは、同じポートの 127.0.0.1 では到達できないループバック HTTP だ。Gitea の netns 内でリッスンしているもののうち、ループバックより広くバインドしているもの、つまり 127.0.0.0/8 をブロックしているから「localhost 専用」だと運用者が思っていたサービスも含まれる。
これは X-Gitea-Internal-Auth を設定しない。それ自体は RCE ではない。許可リストが今も外部と呼ぶアドレスから取得した、完全な HTTP ボディだ。
v1.27.3 は 2026 年の GHSA の波を閉じたビルドだ。それでも私はそのタグに留まった。許可リストや拒否リストを追加するパッチは贈り物だ。リストを読み、それから IANA がまだ持っていてリストが忘れたものを問う。このツリーにはすでに二つの残存に対するラボがあった(keys IDOR と git-redirect SSRF)。その投稿の残存テーブルには、http://0.0.0.1/ への webhook が地図として載っていた。これが SUCCESS だ。
webhook 配信は HTTP ボディをフック履歴に保存する。これは git clone よりも優れたオラクルだ。git clone はほとんど「フェッチが成功したか」でしかない。私は Gitea の netns 内のポート 8080 にオラクルを置き、NET_ADMIN で lo に 0.0.0.1/8 を追加し、二つの webhook を作成した。まずネガティブコントロール。
すでに記録済みの回り道:webhook 作成の HTTP 201 をオラクルとみなすこと(履歴がオラクルだ);127.0.0.1 の配信が成功すること(それは別のバグだ - ラボでは拒否されることが必要);X-Gitea-Internal-Auth で /api/internal を叩くこと;リバースシェル。茶番だ。証人はフック履歴の GITEA-0000-SSRF だ。
cd lab
./run.sh
ターゲットは http://127.0.0.1:18131 のみ。オラクルは Gitea の netns を共有し、ポート 8080 で動く。run.sh は lo に 0.0.0.1/8 を追加する。
create-hook name=neg-loopback status=201
negative-control 127.0.0.1 blocked
create-hook name=hit-0000 status=201
poll id=2 witness=True
SUCCESS GITEA-HOSTMATCHER-0000
reservedIPNets に 0.0.0.0/8 を追加するか、IsGlobalUnicast を「ダイヤルしても安全」とみなすのをやめる。0.0.0.1 は 127.0.0.1 と同じように拒否されなければならない。
GNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。