abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · gitea-public-only-pat-org
Gitea 1.27.3 - Gitea
PAT における public-only は、そのトークンがプライベートリソースに触れられないという約束であるはずです。POST /user/repos には rejectPublicOnly があります。POST /orgs には tokenRequiresScopes と reqToken があります。しかし rejectPublicOnly はありません。DEFAULT_ALLOW_CREATE_ORGANIZATION はデフォルトで true です。
write:organization を持つ public-only PAT は、プライベート組織を作成します。同じトークンでは、プライベートなユーザーリポジトリを作成できません。
| ID | CVE 未割当 |
| CWE | CWE-863 |
| CVSS | Medium: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N |
| Product | Gitea |
| Affected | v1.27.3 (146cc3e) まで |
| Auth | org write 権限を持つ public-only PAT |
| License | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 のみ |
盗まれた、あるいは過剰に発行された public-only PAT で、かつ write:organization も持つものを使用します。プライベート組織を作成します。その組織は、トークンが本来作成できないはずの隠れ場所です。同じトークンでは依然としてプライベートなユーザーリポジトリを作成できず、このバグが他人の既存のプライベート git を開くこともありません。
完全性の問題であり、プライベート git のダンプではありません。被害者が意図的に「public-only」を発行した場合に有用です。つまり CI、ボット、プライベート組織を増やせないと考えていた請負業者トークンなどです。
org リポジトリの作成は org の可視性のみをチェックします。非推奨の POST /org/{org}/repos は public-only を完全にスキップします。私は org 作成をラボ検証しました。それで十分です。
hostmatcher 0.0.0.0/8 ラボと同じ残存パスの調査です。GHSA の波の後の v1.27.3、そして兄弟ハンドラが既に持っているゲートを依然としてスキップしているハンドラを調べました。可視性とトークンスコープのバグはその波のテーマでした。私は api.go 内で rejectPublicOnly を grep しました。ユーザーリポジトリ作成にはあります。org 作成にはありません。
私はスコープ public-only,write:organization,write:repository,write:user を持つ PAT を発行しました。プライベート org 作成は 201 を返しました。同じトークンで、プライベートなユーザーリポジトリ作成は 403 this endpoint is not available for public-only tokens でした。この 403 が対照です。両方が 201 なら、ミドルウェアは完全に消えていることになります。両方が 403 なら、報告するものは何もありません。
既に記録済みの誤った道:org の HTTP 201 を十分とみなすこと(GET で visibility=private を確認すること)。プライベートなユーザーリポジトリ作成が成功すること(その場合 rejectPublicOnly は消えており、ラボは 403 を要求します)。既存のプライベート git の内容を読むこと。リバースシェル。茶番です。
cd lab
./run.sh
対象は http://127.0.0.1:18132 のみ。Compose は DEFAULT_ALLOW_CREATE_ORGANIZATION=true を設定します。
token-scopes=public-only,write:organization,write:repository,write:user
org-create status=201
org-visibility='private'
user-repo-create status=403 this endpoint is not available for public-only tokens
SUCCESS GITEA-PUBLIC-ONLY-PAT
POST /orgs に rejectPublicOnly() を追加し、org リポジトリ作成も public-only に敏感なものとして扱うべきです。public-only の org 作成は、プライベートなユーザーリポジトリ作成が既にそうであるのと同じように 403 を返さなければなりません。
api.go (rejectPublicOnly、POST /orgs、POST /user/repos)GNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。