
Prova de conceito e laboratório para uma divulgação de informações não autenticada no Gitea: a API de stargazers e watchers vaza nomes de usuário que os endpoints de perfil ocultam.
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · gitea-stargazers-hidden
Gitea 1.27.3 - Gitea
Usuários limitados e privados deveriam desaparecer para visualizadores anônimos. GetInfo já retorna 404 para eles. As listas de seguidores já aplicam isUserVisibleToViewerCond no SQL. GetStargazers é um join em star sem filtro de visibilidade. ListStargazers então faz convert.ToUser em todos. ListSubscribers tem o mesmo formato para watchers.
Sem fazer login, o JSON de stargazers de um repositório público nomeia usuários que GET /users/{name} oculta.
| ID | sem CVE ainda |
| CWE | CWE-200 |
| CVSS | Médio: 5.3 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N |
| Produto | Gitea |
| Afetado | até v1.27.3 (146cc3e) |
| Autenticação | não autenticado |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1 |
Sem fazer login, ler os stargazers e watchers de um repositório público e descobrir nomes de usuário que GET /users/{name} oculta. Isso é reconhecimento sobre contas limitadas e privadas que deram star ou watch em algo público: pessoas que configuraram a visibilidade para não aparecerem na busca, mas clicaram em star mesmo assim.
É um nome de usuário, não um e-mail, não uma leitura de git privado, não RCE. Combinado com o oráculo Follow 204 vs 404, você pode confirmar que um login oculto existe mesmo quando o perfil retorna 404.
Visibilidade foi um tema da onda de GHSAs do 1.27.3. Quando um produto retorna 404 para um perfil de propósito, a próxima pergunta é quais endpoints de lista ainda fazem join em user sem essa condição. Stars e watchers fazem.
Eu plantei hidstar como limitado, dei star e watch em um repositório público, e acessei a instância sem token. GET /api/v1/users/hidstar sem autenticação é 404. O JSON de stargazers sem autenticação inclui hidstar. Os watchers sem autenticação incluem hidstar. O HTML de seguidores sem autenticação não. O perfil é tímido. A tabela de stars não é.
Caminhos errados já registrados: GET /users/hidstar sem autenticação retornando 200 (então a visibilidade está totalmente desligada - o lab exige 404); HTML de seguidores listando hidstar (esse caminho já aplica a condição); tratar um 200 em /stargazers com apenas nomes públicos como SUCCESS; um reverse shell. Teatro. O vazamento é o login limitado no JSON.
cd lab
./run.sh
Alvo apenas http://127.0.0.1:18133. O Compose permite visibilidade public,limited,private e deixa as stars ativadas.
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
Aplique isUserVisibleToViewerCond em GetStargazers / GetRepoWatchers. Stargazers e watchers sem autenticação devem omitir hidstar da mesma forma que os seguidores já fazem.
star.go · modelo star.go · subscriber.go · GetInfo · GetUserFollowersGNU Affero GPL v3.0. Veja LICENSE. Apenas lab em loopback. Sem garantia.