
Proof-of-concept и лабораторная работа для неаутентифицированного раскрытия информации в Gitea: API stargazers и watchers раскрывает имена пользователей, которые скрываются в эндпоинтах профиля.
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · gitea-stargazers-hidden
Gitea 1.27.3 - Gitea
Ограниченные и приватные пользователи должны исчезать из вида анонимных наблюдателей. GetInfo уже возвращает для них 404. Списки подписчиков уже применяют isUserVisibleToViewerCond в SQL. GetStargazers — это join по star без фильтра видимости. ListStargazers затем convert.ToUser для всех. ListSubscribers имеет ту же форму для наблюдателей.
Без входа в систему JSON звёзд публичного репозитория называет пользователей, которых GET /users/{name} скрывает.
| ID | CVE пока нет |
| CWE | CWE-200 |
| CVSS | Средний: 5.3 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N |
| Продукт | Gitea |
| Затронуто | до v1.27.3 (146cc3e) |
| Аутентификация | без аутентификации |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1 |
Без входа в систему прочитать звёзды и наблюдателей публичного репозитория и узнать имена пользователей, которые GET /users/{name} скрывает. Это разведка по ограниченным и приватным аккаунтам, которые поставили звезду или наблюдают за чем-то публичным: люди, установившие видимость так, чтобы не отображаться в поиске, но всё равно нажавшие звезду.
Это имя пользователя, не email, не чтение приватного git, не RCE. В сочетании с оракулом Follow 204 vs 404 можно подтвердить существование скрытого логина, даже когда профиль возвращает 404.
Видимость была темой волны GHSA в 1.27.3. Когда продукт намеренно возвращает 404 для профиля, следующий вопрос — какие эндпоинты списков всё ещё делают join по user без этого условия. Звёзды и наблюдатели делают.
Я создал hidstar как ограниченного, поставил звезду и наблюдение за публичным репозиторием и обратился к инстансу без токена. Unauth GET /api/v1/users/hidstar — 404. Unauth JSON звёзд включает hidstar. Unauth наблюдатели включают hidstar. Unauth HTML подписчиков — нет. Профиль стеснительный. Таблица звёзд — нет.
Уже зафиксированные ошибочные пути: unauth GET /users/hidstar, возвращающий 200 (тогда видимость полностью отключена — лаборатория требует 404); HTML подписчиков, перечисляющий hidstar (этот путь уже применяет условие); трактовка 200 на /stargazers только с публичными именами как SUCCESS; reverse shell. Театр. Утечка — это ограниченный логин в JSON.
cd lab
./run.sh
Цель только http://127.0.0.1:18133. Compose допускает видимость public,limited,private и оставляет звёзды включёнными.
unauth-user-get status=404
unauth-stargazers status=200 stargazer-names=['hidstar']
unauth-watchers leak=True
unauth-followers-web limited-in-html=False
SUCCESS GITEA-STARGAZERS-HIDDEN
Применить isUserVisibleToViewerCond в GetStargazers / GetRepoWatchers. Unauth звёзды и наблюдатели должны исключать hidstar так же, как это уже делают подписчики.
star.go · модель star.go · subscriber.go · GetInfo · GetUserFollowersGNU Affero GPL v3.0. См. LICENSE. Только loopback-лаборатория. Без гарантий.