
Демонстрирует оракул перечисления учётных записей Gitea: аутентифицированный PUT /api/v1/user/following/{username} возвращает 204 для скрытых учётных записей и 404 для неизвестных имён, с лабораторией на loopback.
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 | Средний: 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. Скрытое 204 против неизвестного 404, при том что GET возвращает 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
Вызывайте IsUserVisibleToViewer в Follow (а также в Check/Unfollow) перед FollowUser. Скрытые имена должны возвращать 404 так же, как это уже делает GetInfo.
follower.go · api.go группа following · GetInfoGNU Affero GPL v3.0. См. LICENSE. Только для лабораторной среды с loopback. Без гарантий.