abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · gitea-user-keys-idor
Gitea 1.27.3 - Gitea
GET /api/v1/user/keys/{id} は current-user グループ(reqToken、rejectPublicOnly)に属している。しかしハンドラは依然として数値 ID で行をロードし、所有者チェックを行わない。同じテーブルにはユーザーキー、デプロイキー、およびプリンシパルが格納されている。GPG の対応する処理は正しく実装されている:GetGPGKeyForUserByID(ctx, ctx.Doer.ID, id)。プライベートフィールドは保護されている。しかし公開鍵素材、タイトル、フィンガープリントは保護されていない。ID は連番である。
read:user トークンで 1、2、3 と辿るだけで、他人の SSH キーやデプロイキーを収集できる。オープン登録がこれを新規アカウントのバグにしている。
| ID | CVE 未割当 |
| CWE | CWE-639 |
| CVSS | High: 7.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| 製品 | Gitea |
| 影響範囲 | v1.27.3(146cc3e)まで |
| 認証 | 認証済み(read:user トークン) |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
登録し(デフォルトでオープン登録)、read:user トークンを発行し、/api/v1/user/keys/{id} を辿る。すると、自分が所有していないキー(デプロイキーを含む)のタイトル、フィンガープリント、公開鍵素材を取得できる。秘密鍵は取得できない。シェルも取得できない。アクセス権を持つ人物を把握できるだけである。
1.27.3 のキーに関する GHSA はユーザー名スコープのリストと individualPermsChecker だった。このルックアップではなかった。
同じタグの残存問題:git HTTP redirect SSRF。
v1.27.3 で 2026 年の GHSA の波は収束した。それでも私はそのタグに留まり、current-user キーハンドラを GPG と並べて読んだ。GPG は他人の ID に対して 404 を返す。SSH は返さない。
seed.sh は被害者のキータイトル GHSA-GITEA-KEY-IDOR-WITNESS と攻撃者のキーを仕込む。攻撃者自身のリストには witness は含まれない。攻撃者としての GET /user/keys/1 には含まれる。他人の ID に対する GPG は 404 を返す。これが議論のすべてである。
すでに記録済みの誤り:攻撃者自身のリストをリークとみなすこと(そうではない - リストはスコープされているが、GET-by-id はスコープされていない);リバースシェル。茶番である。
クライアントのバグは製品のバグに見える。http.client をシャドウするヘルパーはパケットを一切送信しない。HTTPResponse に対する .recv() は .read() ではない。これは一度だけ言及する。時間を浪費し、一瞬だけ 1.27.3 が仕事を終えたように見えたからである。
cd lab
./run.sh
対象は必ず http://127.0.0.1:18101 のみ。
add-key user=victim status=201 title=GHSA-GITEA-KEY-IDOR-WITNESS id=1
add-key user=attacker status=201 id=2
attacker-list status=200 ids=[2] (no witness)
get id=1 status=200 snippet contains GHSA-GITEA-KEY-IDOR-WITNESS
SUCCESS Gitea #1 user/keys IDOR
key.OwnerID == ctx.Doer.ID(またはサイト管理者)でない限り 404 を返す。デプロイ/プリンシパルタイプを拒否する。GPG と同様にする。
GetPublicKeyGNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。