[Majeur] GET /users et GET /events/{id} accessibles sans authentification #93

Closed
opened 2026-10-28 10:31:54 +00:00 by asventi · 0 comments
Owner

Gravité : Majeur
Rapports QA d'origine : AUTH-11, EVENTS-01, ADMIN-02, PROFILE-01, SECURITY_UX-02

Pas de [Authorize] : un anonyme obtient la liste des users (rôles, permissions) et le détail d'un event (organisateur, inscrits, channel).

Détails des rapports

[AUTH-11] `GET /api/users` et `GET /api/events/{id}` sont accessibles sans authentification — Gravité : Critique
  • Où : GET /api/users, GET /api/events/{id} (sans aucun cookie)
  • Obtenu : GET /users -> 200 avec les 89 users (id, userName, avatar, rôle + bitmask de permissions) ; GET /events/{id} -> 200 avec description, organisateur (et son rôle/permissions), inscriptions, fichiers, canal. GET /events (liste) est bien en 401 : incohérent.
  • Attendu : 401 sans session.
  • Cause probable : backend/API/Users/List/ListUsersEndpoint.cs:16 et backend/API/Events/Get/GetEventEndpoint.cs:41 sans [Authorize] (le second lit en plus tk.User qui est null).
[EVENTS-01] GET /api/events/{id} accessible sans authentification — Gravité : Critique (fuite de données, lecture seule)
  • Où : GET /api/events/{id} (endpoint public)
  • Étapes : 1. curl http://localhost:5173/api/events/<id> sans cookie.
  • Attendu : 401 (comme GET /events, GET /events/{id}/registration qui renvoient 401).
  • Obtenu : 200 avec l'event complet : organisateur (id, userName, rôle), liste des inscrits (users + rôles + dates), channel (id), fichiers joints, description.
  • Cause probable : backend/API/Events/Get/GetEventEndpoint.cs:41 — pas d'attribut [Authorize] (alors que ListEventsEndpoint.cs:10 l'a). Le code gère user is not null (GetEventQuery.cs:24), donc l'anonymat est prévu par erreur.
  • Statut : re-vérifié (200 sans cookie ; GET /events sans cookie = 401).
[ADMIN-02] GET /users accessible sans authentification (fuite de la liste des utilisateurs, rôles et permissions) — Gravité : Majeur (fuite d'information)
  • Où : GET /api/users
  • Étapes : 1. Sans cookie : curl http://localhost:5173/api/users
  • Attendu : 401 (tous les endpoints métier nécessitent [Authorize], ex. GET /api/roles, GET /api/me -> 401).
  • Obtenu : 200 + JSON de tous les utilisateurs (id, userName, avatar, role {id, name, permission}) — hors compte admin par défaut.
  • Preuve : curl reproduit 2 fois.
  • Cause probable : backend/API/Users/List/ListUsersEndpoint.cs:16 : users.MapGet("/", async (ListUsersQuery query) => ...) sans [Authorize].
    Permet à un anonyme d'énumérer les ids/logins (utile pour du brute-force de login ou pour cibler un compte privilégié).
[PROFILE-01] GET /api/users accessible sans authentification — Gravité : Majeur (fuite d'infos / sécurité)
  • Où : GET /api/users (backend /users)
  • Étapes : 1. curl -s http://localhost:5173/api/users sans aucun cookie.
  • Attendu : 401 (comme GET /api/users/{id} et GET /api/me).
  • Obtenu : 200 + JSON de tous les users (id, userName, avatar, role {id, name, permission en bitmask}) : 19 users listés (david, devan, pierre, tom, tous les comptes qa_*…). Permet l'énumération des comptes, des ids et des rôles/permissions par n'importe quel visiteur non connecté (plateforme "sur invitation").
  • Preuve : curl -i http://localhost:5173/api/users -> HTTP/1.1 200 OK ; curl -i http://localhost:5173/api/users/<id> -> 401 Unauthorized.
  • Cause probable : backend/API/Users/List/ListUsersEndpoint.cs:16 : users.MapGet("/", async (ListUsersQuery query) => …) n'a pas [Authorize] (contrairement à GetUserEndpoint.cs:17).
[SECURITY_UX-02] `GET /api/users` et `GET /api/events/{id}` accessibles sans authentification — Gravité : Mineur
  • Où : GET /api/users, GET /api/events/{id}
  • Étapes : 1. curl http://localhost:5173/api/users (sans cookie) 2. idem /api/events/<id>
  • Attendu : 401 comme tous les autres GET (/users/{id}, /events, /roles… renvoient 401 sans cookie)
  • Obtenu : 200. /users expose id, userName, avatar, rôle (id, nom, bitmask de permissions) de tous les users ; /events/{id} expose organisateur, inscrits (userName, rôle), fichiers.
  • Cause probable : backend/API/Users/List/ListUsersEndpoint.cs:16 et backend/API/Events/Get/GetEventEndpoint.cs:41 (pas de [Authorize])

Trouvé par une campagne de tests QA automatisés (agents Claude, Playwright) sur l'environnement de dev. Les captures citées sont locales et non jointes.

**Gravité :** Majeur **Rapports QA d'origine :** AUTH-11, EVENTS-01, ADMIN-02, PROFILE-01, SECURITY_UX-02 Pas de `[Authorize]` : un anonyme obtient la liste des users (rôles, permissions) et le détail d'un event (organisateur, inscrits, channel). ## Détails des rapports <details><summary>[AUTH-11] `GET /api/users` et `GET /api/events/{id}` sont accessibles sans authentification — Gravité : Critique</summary> - Où : `GET /api/users`, `GET /api/events/{id}` (sans aucun cookie) - Obtenu : `GET /users` -> 200 avec les 89 users (id, userName, avatar, rôle + bitmask de permissions) ; `GET /events/{id}` -> 200 avec description, organisateur (et son rôle/permissions), inscriptions, fichiers, canal. `GET /events` (liste) est bien en 401 : incohérent. - Attendu : 401 sans session. - Cause probable : `backend/API/Users/List/ListUsersEndpoint.cs:16` et `backend/API/Events/Get/GetEventEndpoint.cs:41` sans `[Authorize]` (le second lit en plus `tk.User` qui est null). </details> <details><summary>[EVENTS-01] GET /api/events/{id} accessible sans authentification — Gravité : Critique (fuite de données, lecture seule)</summary> - Où : `GET /api/events/{id}` (endpoint public) - Étapes : 1. `curl http://localhost:5173/api/events/<id>` sans cookie. - Attendu : 401 (comme `GET /events`, `GET /events/{id}/registration` qui renvoient 401). - Obtenu : 200 avec l'event complet : organisateur (id, userName, rôle), liste des inscrits (users + rôles + dates), channel (id), fichiers joints, description. - Cause probable : `backend/API/Events/Get/GetEventEndpoint.cs:41` — pas d'attribut `[Authorize]` (alors que `ListEventsEndpoint.cs:10` l'a). Le code gère `user is not null` (GetEventQuery.cs:24), donc l'anonymat est prévu par erreur. - Statut : re-vérifié (200 sans cookie ; `GET /events` sans cookie = 401). </details> <details><summary>[ADMIN-02] GET /users accessible sans authentification (fuite de la liste des utilisateurs, rôles et permissions) — Gravité : Majeur (fuite d'information)</summary> - Où : `GET /api/users` - Étapes : 1. Sans cookie : `curl http://localhost:5173/api/users` - Attendu : 401 (tous les endpoints métier nécessitent `[Authorize]`, ex. `GET /api/roles`, `GET /api/me` -> 401). - Obtenu : 200 + JSON de tous les utilisateurs (id, userName, avatar, role {id, name, permission}) — hors compte admin par défaut. - Preuve : `curl` reproduit 2 fois. - Cause probable : `backend/API/Users/List/ListUsersEndpoint.cs:16` : `users.MapGet("/", async (ListUsersQuery query) => ...)` sans `[Authorize]`. Permet à un anonyme d'énumérer les ids/logins (utile pour du brute-force de login ou pour cibler un compte privilégié). </details> <details><summary>[PROFILE-01] GET /api/users accessible sans authentification — Gravité : Majeur (fuite d'infos / sécurité)</summary> - Où : `GET /api/users` (backend `/users`) - Étapes : 1. `curl -s http://localhost:5173/api/users` sans aucun cookie. - Attendu : 401 (comme `GET /api/users/{id}` et `GET /api/me`). - Obtenu : 200 + JSON de tous les users (id, userName, avatar, role {id, name, permission en bitmask}) : 19 users listés (david, devan, pierre, tom, tous les comptes qa_*…). Permet l'énumération des comptes, des ids et des rôles/permissions par n'importe quel visiteur non connecté (plateforme "sur invitation"). - Preuve : `curl -i http://localhost:5173/api/users` -> `HTTP/1.1 200 OK` ; `curl -i http://localhost:5173/api/users/<id>` -> `401 Unauthorized`. - Cause probable : `backend/API/Users/List/ListUsersEndpoint.cs:16` : `users.MapGet("/", async (ListUsersQuery query) => …)` n'a pas `[Authorize]` (contrairement à `GetUserEndpoint.cs:17`). </details> <details><summary>[SECURITY_UX-02] `GET /api/users` et `GET /api/events/{id}` accessibles sans authentification — Gravité : Mineur</summary> - Où : `GET /api/users`, `GET /api/events/{id}` - Étapes : 1. `curl http://localhost:5173/api/users` (sans cookie) 2. idem `/api/events/<id>` - Attendu : 401 comme tous les autres GET (`/users/{id}`, `/events`, `/roles`… renvoient 401 sans cookie) - Obtenu : 200. `/users` expose id, userName, avatar, rôle (id, nom, bitmask de permissions) de tous les users ; `/events/{id}` expose organisateur, inscrits (userName, rôle), fichiers. - Cause probable : `backend/API/Users/List/ListUsersEndpoint.cs:16` et `backend/API/Events/Get/GetEventEndpoint.cs:41` (pas de `[Authorize]`) </details> --- _Trouvé par une campagne de tests QA automatisés (agents Claude, Playwright) sur l'environnement de dev. Les captures citées sont locales et non jointes._
dernst self-assigned this 2026-10-28 10:49:44 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Transcendence/backend#93
No description provided.