
Prueba de concepto y laboratorio para una divulgación de información no autenticada en Gitea: la API de stargazers y watchers filtra nombres de usuario que los endpoints de perfil ocultan.
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · gitea-stargazers-hidden
Gitea 1.27.3 - Gitea
Se supone que los usuarios limitados y privados desaparecen para los espectadores anónimos. GetInfo ya les devuelve 404. Las listas de seguidores ya aplican isUserVisibleToViewerCond en SQL. GetStargazers es un join sobre star sin filtro de visibilidad. ListStargazers luego hace convert.ToUser de todos ellos. ListSubscribers tiene la misma forma para los watchers.
Sin iniciar sesión, el JSON de stargazers de un repositorio público nombra usuarios que GET /users/{name} oculta.
| ID | sin CVE todavía |
| CWE | CWE-200 |
| CVSS | Medio: 5.3 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N |
| Producto | Gitea |
| Afectado | hasta v1.27.3 (146cc3e) |
| Auth | sin autenticación |
| Licencia | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Sin iniciar sesión, leer los stargazers y watchers de un repositorio público y descubrir nombres de usuario que GET /users/{name} oculta. Eso es reconocimiento sobre cuentas limitadas y privadas que marcaron con estrella o siguieron algo público: personas que configuraron la visibilidad para no aparecer en las búsquedas y luego hicieron clic en la estrella de todos modos.
Es un nombre de usuario, no un correo electrónico, no una lectura de git privado, no RCE. Combinado con el oráculo Follow 204 vs 404, puedes confirmar que un login oculto existe incluso cuando el perfil devuelve 404.
La visibilidad fue un tema central de la oleada de GHSA de la 1.27.3. Cuando un producto devuelve 404 en un perfil a propósito, la siguiente pregunta es qué endpoints de listas siguen haciendo join con user sin esa condición. Stars y watchers lo hacen.
Planté hidstar como limitado, marqué con estrella y seguí un repositorio público, y golpeé la instancia sin token. GET /api/v1/users/hidstar sin autenticación es 404. El JSON de stargazers sin autenticación incluye hidstar. Los watchers sin autenticación incluyen hidstar. El HTML de followers sin autenticación no. El perfil es tímido. La tabla de stars no.
Caminos equivocados ya registrados: GET /users/hidstar sin autenticación devolviendo 200 (entonces la visibilidad está completamente desactivada - el lab requiere 404); el HTML de followers listando hidstar (esa ruta ya aplica la condición); tratar un 200 en /stargazers con solo nombres públicos como SUCCESS; una reverse shell. Teatro. La fuga es el login limitado en el JSON.
cd lab
./run.sh
Objetivo solo http://127.0.0.1:18133. Compose permite visibilidad public,limited,private y deja las stars activadas.
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
Aplicar isUserVisibleToViewerCond en GetStargazers / GetRepoWatchers. Los stargazers y watchers sin autenticación deben omitir hidstar de la misma manera que ya lo hacen los followers.
star.go · modelo star.go · subscriber.go · GetInfo · GetUserFollowersGNU Affero GPL v3.0. Ver LICENSE. Solo lab en loopback. Sin garantía.