[Critique] Fuite de données personnelles : email, langue et accusés de lecture de l'expéditeur renvoyés dans chaque message #90

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

Gravité : Critique
Rapports QA d'origine : PROFILE-17, FRIENDS-02, SECURITY_UX-09

Message.cs sérialise l'expéditeur avec GetMeResponse : tout lecteur d'un channel (REST et SignalR) obtient l'email des autres users.

Détails des rapports

[PROFILE-17] Fuite de données personnelles : l'email, la langue et les accusés de lecture de l'expéditeur sont renvoyés à tous les lecteurs d'un channel — Gravité : Critique (fuite de données / sécurité)
  • Où : GET /api/channels/{id}/messages (et GET /channels/{id}/messages/{msgId}, champ messageRef.sender, et probablement les événements SignalR de messages)
  • Étapes : 1. User B poste un message dans un channel. 2. User C (simple rôle Member, aucun droit) : GET /api/channels/<id>/messages.
  • Attendu : sender = profil public (id, userName, avatar, role), comme GET /api/users.
  • Obtenu : sender contient {"id","userName","email":"qa_profile_pb_oa29s@qa.test","avatar","role","language":1,"channelsAckMsg":{…}} : l'adresse email de chaque auteur, sa langue et ses derniers accusés de lecture par channel sont exposés à n'importe quel membre. (GET /api/users, /users/{id} et l'UI ProfileUser n'exposent PAS l'email : OK.)
  • Preuve : réponse API avec C = Member (sender keys: ['id','userName','email','avatar','role','language','channelsAckMsg']).
  • Cause probable : backend/API/Channels/Messages/Message.cs:35-38 (MessageReference.Sender) et :47,60 (MessageResponse.Sender) utilisent GetMeResponse (réponse privée de /me, Users/Me/Get/GetMeEndpoint.cs:9) au lieu de UserSummary/ListUsersResponse.
[FRIENDS-02] Les adresses e-mail de tous les expéditeurs sont exposées dans chaque message — Gravité : Majeur (fuite de données personnelles)
  • Où : toute réponse messages (liste, création, SignalR NewMessage) : sender.email
  • Obtenu : "sender":{"id":...,"userName":"qa_friends_a_bffhy","email":"qa_friends_a_bffhy@qa.test",...} visible par tout lecteur du canal (donc, combiné à FRIENDS-01, par tout le monde).
  • Cause probable : MessageResponse.Sender est un GetMeResponse (backend/API/Channels/Messages/Message.cs) au lieu d'un UserSummary. (Zone chat, signalé ici car vu dans les DM.)
[SECURITY_UX-09] L'email (et la langue) de l'expéditeur est exposé dans chaque message — Gravité : Majeur
  • Où : GET /api/channels/{id}/messages, GET .../messages/{msgId}, évènements SignalR NewMessage/UpdateMessage
  • Étapes : 1. C lit les messages d'un canal ouvert où A a écrit. 2. Le champ sender contient email, language, channelsAckMsg.
  • Attendu : seulement id, userName, avatar, rôle (comme GET /users).
  • Obtenu : "sender":{"id":...,"userName":"qa_security_ux_a_...","email":"qa_security_ux_a_...@qa.test","avatar":null,"role":{...},"language":1,"channelsAckMsg":{}} -> les adresses email de tous les users qui ont écrit sont lisibles par tout Member.
  • Cause probable : backend/API/Channels/Messages/Message.cs:47 : MessageResponse.Sender est un GetMeResponse (DTO de GET /me, avec Email/Language/ChannelsAckMsg) au lieu d'un résumé public.

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é :** Critique **Rapports QA d'origine :** PROFILE-17, FRIENDS-02, SECURITY_UX-09 `Message.cs` sérialise l'expéditeur avec `GetMeResponse` : tout lecteur d'un channel (REST et SignalR) obtient l'email des autres users. ## Détails des rapports <details><summary>[PROFILE-17] Fuite de données personnelles : l'email, la langue et les accusés de lecture de l'expéditeur sont renvoyés à tous les lecteurs d'un channel — Gravité : Critique (fuite de données / sécurité)</summary> - Où : `GET /api/channels/{id}/messages` (et `GET /channels/{id}/messages/{msgId}`, champ `messageRef.sender`, et probablement les événements SignalR de messages) - Étapes : 1. User B poste un message dans un channel. 2. User C (simple rôle Member, aucun droit) : `GET /api/channels/<id>/messages`. - Attendu : `sender` = profil public (id, userName, avatar, role), comme `GET /api/users`. - Obtenu : `sender` contient `{"id","userName","email":"qa_profile_pb_oa29s@qa.test","avatar","role","language":1,"channelsAckMsg":{…}}` : l'adresse email de chaque auteur, sa langue et ses derniers accusés de lecture par channel sont exposés à n'importe quel membre. (`GET /api/users`, `/users/{id}` et l'UI ProfileUser n'exposent PAS l'email : OK.) - Preuve : réponse API avec C = Member (`sender keys: ['id','userName','email','avatar','role','language','channelsAckMsg']`). - Cause probable : `backend/API/Channels/Messages/Message.cs:35-38` (`MessageReference.Sender`) et `:47,60` (`MessageResponse.Sender`) utilisent `GetMeResponse` (réponse privée de `/me`, `Users/Me/Get/GetMeEndpoint.cs:9`) au lieu de `UserSummary`/`ListUsersResponse`. </details> <details><summary>[FRIENDS-02] Les adresses e-mail de tous les expéditeurs sont exposées dans chaque message — Gravité : Majeur (fuite de données personnelles)</summary> - Où : toute réponse `messages` (liste, création, SignalR `NewMessage`) : `sender.email` - Obtenu : `"sender":{"id":...,"userName":"qa_friends_a_bffhy","email":"qa_friends_a_bffhy@qa.test",...}` visible par tout lecteur du canal (donc, combiné à FRIENDS-01, par tout le monde). - Cause probable : `MessageResponse.Sender` est un `GetMeResponse` (`backend/API/Channels/Messages/Message.cs`) au lieu d'un `UserSummary`. (Zone chat, signalé ici car vu dans les DM.) </details> <details><summary>[SECURITY_UX-09] L'email (et la langue) de l'expéditeur est exposé dans chaque message — Gravité : Majeur</summary> - Où : `GET /api/channels/{id}/messages`, `GET .../messages/{msgId}`, évènements SignalR `NewMessage`/`UpdateMessage` - Étapes : 1. C lit les messages d'un canal ouvert où A a écrit. 2. Le champ `sender` contient `email`, `language`, `channelsAckMsg`. - Attendu : seulement id, userName, avatar, rôle (comme `GET /users`). - Obtenu : `"sender":{"id":...,"userName":"qa_security_ux_a_...","email":"qa_security_ux_a_...@qa.test","avatar":null,"role":{...},"language":1,"channelsAckMsg":{}}` -> les adresses email de tous les users qui ont écrit sont lisibles par tout Member. - Cause probable : `backend/API/Channels/Messages/Message.cs:47` : `MessageResponse.Sender` est un `GetMeResponse` (DTO de `GET /me`, avec Email/Language/ChannelsAckMsg) au lieu d'un résumé public. </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._
Equoo self-assigned this 2026-10-28 11:00:32 +00:00
Equoo referenced this issue from a commit 2026-10-28 20:58:48 +00:00
Equoo closed this issue 2026-10-28 21:01:56 +00:00
Equoo referenced this issue from a commit 2026-10-29 13:05:36 +00:00
Equoo referenced this issue from a commit 2026-10-31 19:16:18 +00:00
asventi referenced this issue from a commit 2026-11-02 13:08:20 +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#90
No description provided.