Gitea の公式 Docker イメージ(1.26.2 まで)は、デフォルト設定で
REVERSE_PROXY_TRUSTED_PROXIES = * を同梱しています。リバースプロキシログインを有効にすると、このワイルドカードによりすべての送信元 IP が信頼できるプロキシとして扱われるため、ポートに到達できる人は誰でも X-WEBAUTH-USER ヘッダーを送信して、任意のユーザーとしてログインできます。パスワードもトークンも不要です。
この問題は Gitea に報告済みで、1.26.3 / 1.26.4 で修正されています。このリポジトリは、私自身の解説、動作する PoC、およびチェッカーです。対象はパッチ適用済みの公開バグです。
Gitea はリバースプロキシ認証をサポートしています。X-WEBAUTH-USER を設定するプロキシの背後に配置すると、Gitea はそのヘッダーをユーザー名として信頼します。これを設定できるのが自分のプロキシだけである限り問題ありません。それを強制するための設定が IP 許可リストである REVERSE_PROXY_TRUSTED_PROXIES です。Gitea はリクエストの送信元 IP がその範囲内にある場合のみヘッダーを尊重します。
ドキュメント上安全なデフォルト(app.example.ini 内のもの)は 127.0.0.0/8,::1/128 です。ループバックのみなので、初期状態ではローカルプロキシだけが信頼されます。公式 Docker イメージはこれを使用していません。その app.ini テンプレートは * をハードコードしています(docker/root/etc/templates/app.ini:55、ルートレスイメージでは docker/rootless/etc/templates/app.ini:52)。* はすべての送信元 IP に一致するため、許可リストのチェックは何もしません。リバースプロキシログインを有効にすると、自分のプロキシだけでなく、ポートに到達できる誰もがヘッダーを送信できるようになります。自動登録が有効な場合、アカウントはその場で作成されます。管理者のユーザー名を送信すれば、あなたは管理者になります。
つまりコードが間違っているのではなく、同梱されているデフォルト設定が問題で、しかも Docker イメージに固有の問題です。app.example.ini に従ったバイナリインストールや自前ビルドのインストールはループバックデフォルトのままで影響を受けません。
Docker と Python 3 が必要です(標準ライブラリのみで、追加インストールは不要です)。
docker compose up -d # boots vulnerable gitea/gitea:1.26.2
# give it ~30-60s to finish first-run setup, then:
python3 poc.py # random new victim, shows auto-registration
python3 poc.py http://localhost:3000 admin # impersonate a chosen username
docker compose down -v # clean up
同梱イメージに対して実行した結果は次のようになります。
1) /user/settings with no header -> HTTP 303 (redirect to login = not authed)
2) /user/settings with X-WEBAUTH-USER -> HTTP 200
logged in as 'pocadmin' - no password, no token, any source IP
3) /pocadmin profile page -> HTTP 200 (account created on the fly)
このバイパスは Web セッションで機能し、ヘッダーを無視する /api/v1/... のトークン API では機能しません。
detect.py は無害なプローブを 1 回送信し、通常のリクエストと比較します。何も変更しません。
python3 detect.py https://gitea.example.com
VULNERABLE、looks-safe、または inconclusive を出力します。所有しているかテストを許可されている対象に対してのみ実行してください。
1.26.3 / 1.26.4 以降にアップグレードしてください。リバースプロキシ認証は現在オプトインとなり、イメージにはワイルドカードが同梱されなくなりました。まだアップグレードできない場合は、REVERSE_PROXY_TRUSTED_PROXIES をプロキシの実際の IP または CIDR に設定し(* は絶対に使わない)、使用していない場合は ENABLE_REVERSE_PROXY_AUTHENTICATION をオフにしてください。
このバグを発見し、2026-05-26 に Gitea へ報告しました。私は Gitea のアドバイザリ GHSA-f75j-4cw6-rmx4 に記載されている報告者です。
一部の報道では、この件を私ではなく Exploitarium リポジトリの功績としています。それは誤りであり、そのリポジトリが公開したものとは別件です。その後、それらのブログ記事のうちいくつかは修正してもらいましたが、まだ誤ったままのものもいくつかあります。
MIT ライセンスです。LICENSE を参照してください。