
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · gitea-follow-existence
解説記事: https://abraxaslabs.tech/research/gitea-follow-existence
Gitea 1.27.3 - Gitea
GetInfo はすでに非表示ユーザーに対して 404 を返し、その理由について嘘をついている: fake ErrUserNotExist error message to not leak information about existence。PUT /user/following/{username} は UserAssignmentAPI() で対象を読み込み、Follow を呼び出す。IsUserVisibleToViewer はない。存在しない名前: 404 user redirect does not exist。存在する非表示の名前: 204。
204 はアカウントが存在することを意味する。404 は存在しない名前を推測したことを意味する。プロフィール JSON は閉じられたままである。
| ID | CVE 未割当 |
| CWE | CWE-203 |
| CVSS | Medium: 4.3 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N |
| 製品 | Gitea |
| 影響範囲 | v1.27.3 (146cc3e) まで |
| 認証 | サインイン済みアカウント |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
サインインする(デフォルトのオープン登録は低コストで利用できる)。プロフィール API が 404 を返す場合でも、非表示または制限されたアカウントが存在することを証明できる。プロフィールのダンプはできない。プライベート git にもアクセスできない。未認証の stargazers と組み合わせれば、公開リポジトリ上で非表示のログインを見つけ、その後プロフィールを隠してもなお存在し続けていることを確認できる。
Check と Unfollow は同じグループに属している。同じチェックが欠けている。
stargazers と同じ可視性の調査。ハンドラがそこまでして嘘をつくなら、{username} を受け取る他のすべてのルートを調べるべきだ。Follow はそうしていない。
制限付きの攻撃者を登録し、非表示の名前をフォローし、存在しない名前をフォローし、ステータスコードを比較した。公開ユーザーは 204 を返すはずだ。それは SUCCESS ではない。GET が 404 である一方で、非表示が 204、不明が 404 であることは SUCCESS である。
すでに記録済みの誤った道: 非表示の Follow が 404 を返す(ならば可視性はこのルートで機能している); 非表示ユーザーのプロフィール JSON(GetInfo はすでに 404 を返す - このバグはステータスクラスの問題であり、ダンプではない); 公開ユーザーに対する Follow の 204 を SUCCESS とみなすこと; リバースシェル。茶番である。
cd lab
./run.sh
必ず http://127.0.0.1:18134 のみを対象とすること。Compose では public,limited,private の可視性を指定できる。
get-hidden status=404
follow-hidden status=204
follow-unknown status=404 user redirect does not exist
oracle hidden=204 unknown=404
SUCCESS GITEA-FOLLOW-ORACLE
Follow(および Check/Unfollow)で FollowUser を呼び出す前に IsUserVisibleToViewer を呼び出します。非表示のユーザー名は、GetInfo がすでに行っているのと同じ方法で 404 を返す必要があります。
follower.go · api.go の following グループ · GetInfoGNU Affero GPL v3.0。LICENSE を参照してください。ループバックラボ専用です。保証はありません。