[Majeur] Endpoints [Roles] sans [Authorize] : 500 NullReferenceException pour un appel anonyme #95

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

Gravité : Majeur
Rapports QA d'origine : AUTH-13, ADMIN-01, SECURITY_UX-03

PATCH /users/{id}/role/{roleId} et DELETE /roles/{id} plantent dans RolesMiddleware sans session, avec stack trace dans la réponse.

Détails des rapports

[AUTH-13] Endpoints protégés seulement par `[Roles]` sans `[Authorize]` : 500 NullReferenceException au lieu de 401 sans session — Gravité : Mineur
  • Où : PATCH /api/users/{u}/role/{r} et DELETE /api/roles/{id} sans cookie -> 500 (stack trace dans le corps).
  • Cause probable : PatchRoleEndpoint.cs:11, DeleteRoleEndpoint.cs:10, RolesMiddleware.cs:21 (tk.User.Role sur null). Pas de contournement constaté (le NRE bloque la requête), mais protection accidentelle.
[ADMIN-01] DELETE /roles/{id} et PATCH /users/{id}/role/{id} sans authentification -> 500 NullReferenceException + stack trace exposée — Gravité : Majeur
  • Où : DELETE /api/roles/{id}, PATCH /api/users/{userId}/role/{roleId}
  • Étapes : 1. Sans cookie, curl -X DELETE http://localhost:5173/api/roles/xxx 2. idem curl -X PATCH http://localhost:5173/api/users/a/role/b
  • Attendu : 401 (non authentifié), comme les autres endpoints protégés (ex. POST /api/roles -> 401).
  • Obtenu : 500 System.NullReferenceException avec corps ProblemDetails contenant exception.details (stack trace avec chemins
    serveur /workspaces/backend/API/Middlewares/Roles.cs:line 21), headers, path, endpoint, routeValues.
  • Preuve : réponses curl reproduites deux fois (avant et après le crash machine).
  • Cause probable : backend/API/Roles/Delete/DeleteRoleEndpoint.cs:10 et backend/API/Users/Roles/Patch/PatchRoleEndpoint.cs:11
    ont [Roles(...)] mais PAS [Authorize]. RolesMiddleware (backend/API/Middlewares/Roles.cs:21) déréférence tk.User
    (jamais renseigné quand pas de token) -> NRE. À corriger en ajoutant [Authorize] et/ou en gérant tk.User == null dans le middleware.
    (Le fait que la stack trace soit renvoyée est lié au mode Development ; à ne pas laisser en prod.)
[SECURITY_UX-03] 500 + stack trace pour un appel anonyme sur les endpoints `[Roles]` sans `[Authorize]` — Gravité : Majeur
  • Où : PATCH /api/users/{id}/role/{roleId}, DELETE /api/roles/{id} (sans cookie)
  • Étapes : 1. curl -i -X DELETE http://localhost:5173/api/roles/00000000-0000-0000-0000-000000000000
  • Attendu : 401 propre
  • Obtenu : 500 System.NullReferenceException avec le détail complet de l'exception (chemins /workspaces/backend/API/Middlewares/Roles.cs:line 21, pile, en-têtes de la requête, endpoint). Le backend tourne en mode Development (DeveloperExceptionPage) : fuite d'informations si c'est déployé tel quel. (Le contrôle de permission échoue « fermé » : pas de contournement.)
  • Cause probable : backend/API/Middlewares/Roles.cs:21 (tk.User null quand pas de cookie) + absence de [Authorize] sur backend/API/Users/Roles/Patch/PatchRoleEndpoint.cs:11 et backend/API/Roles/Delete/DeleteRoleEndpoint.cs:10

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-13, ADMIN-01, SECURITY_UX-03 `PATCH /users/{id}/role/{roleId}` et `DELETE /roles/{id}` plantent dans `RolesMiddleware` sans session, avec stack trace dans la réponse. ## Détails des rapports <details><summary>[AUTH-13] Endpoints protégés seulement par `[Roles]` sans `[Authorize]` : 500 NullReferenceException au lieu de 401 sans session — Gravité : Mineur</summary> - Où : `PATCH /api/users/{u}/role/{r}` et `DELETE /api/roles/{id}` sans cookie -> 500 (stack trace dans le corps). - Cause probable : `PatchRoleEndpoint.cs:11`, `DeleteRoleEndpoint.cs:10`, `RolesMiddleware.cs:21` (`tk.User.Role` sur null). Pas de contournement constaté (le NRE bloque la requête), mais protection accidentelle. </details> <details><summary>[ADMIN-01] DELETE /roles/{id} et PATCH /users/{id}/role/{id} sans authentification -> 500 NullReferenceException + stack trace exposée — Gravité : Majeur</summary> - Où : `DELETE /api/roles/{id}`, `PATCH /api/users/{userId}/role/{roleId}` - Étapes : 1. Sans cookie, `curl -X DELETE http://localhost:5173/api/roles/xxx` 2. idem `curl -X PATCH http://localhost:5173/api/users/a/role/b` - Attendu : 401 (non authentifié), comme les autres endpoints protégés (ex. `POST /api/roles` -> 401). - Obtenu : 500 `System.NullReferenceException` avec corps ProblemDetails contenant `exception.details` (stack trace avec chemins serveur `/workspaces/backend/API/Middlewares/Roles.cs:line 21`), `headers`, `path`, `endpoint`, `routeValues`. - Preuve : réponses curl reproduites deux fois (avant et après le crash machine). - Cause probable : `backend/API/Roles/Delete/DeleteRoleEndpoint.cs:10` et `backend/API/Users/Roles/Patch/PatchRoleEndpoint.cs:11` ont `[Roles(...)]` mais PAS `[Authorize]`. `RolesMiddleware` (`backend/API/Middlewares/Roles.cs:21`) déréférence `tk.User` (jamais renseigné quand pas de token) -> NRE. À corriger en ajoutant `[Authorize]` et/ou en gérant `tk.User == null` dans le middleware. (Le fait que la stack trace soit renvoyée est lié au mode Development ; à ne pas laisser en prod.) </details> <details><summary>[SECURITY_UX-03] 500 + stack trace pour un appel anonyme sur les endpoints `[Roles]` sans `[Authorize]` — Gravité : Majeur</summary> - Où : `PATCH /api/users/{id}/role/{roleId}`, `DELETE /api/roles/{id}` (sans cookie) - Étapes : 1. `curl -i -X DELETE http://localhost:5173/api/roles/00000000-0000-0000-0000-000000000000` - Attendu : 401 propre - Obtenu : 500 `System.NullReferenceException` avec le détail complet de l'exception (chemins `/workspaces/backend/API/Middlewares/Roles.cs:line 21`, pile, en-têtes de la requête, endpoint). Le backend tourne en mode Development (DeveloperExceptionPage) : fuite d'informations si c'est déployé tel quel. (Le contrôle de permission échoue « fermé » : pas de contournement.) - Cause probable : `backend/API/Middlewares/Roles.cs:21` (`tk.User` null quand pas de cookie) + absence de `[Authorize]` sur `backend/API/Users/Roles/Patch/PatchRoleEndpoint.cs:11` et `backend/API/Roles/Delete/DeleteRoleEndpoint.cs:10` </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:43 +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#95
No description provided.