
Демонстрирует оракул перечисления учётных записей Gitea: аутентифицированный PUT /api/v1/user/following/{username} возвращает 204 для скрытых учётных записей и 404 для неизвестных имён, с лабораторией на loopback.
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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. В сочетании с unauth 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-лаборатория. Без гарантий.