N'importe quel utilisateur connecté peut lire et modifier les transactions des autres clients
Surface : Contrôle d'accès à la base (Row-Level Security Supabase)
Ce que nous avons trouvé
La RLS était activée sur la table transactions, mais ses politiques SELECT et UPDATE vérifiaient seulement que l'utilisateur était connecté, pas que la ligne lui appartenait. L'interface filtrait correctement, ce qui masquait le problème ; un appel direct à l'API REST renvoyait les lignes de tous les clients.
Preuve — requête faite avec le compte de test B (masquée)
curl "https://[projet].supabase.co/rest/v1/transactions?select=*" \
-H "apikey: [clé anon]" \
-H "Authorization: Bearer [session du compte B]"
# 200 OK — 1 248 lignes, dont celles du compte A
# et de 37 autres organisationsImpact pour l'activité
Les données financières de tous les clients étaient lisibles, et modifiables, par n'importe quel utilisateur disposant d'un compte, y compris un compte d'essai gratuit.
Recommandation
Restreindre les deux politiques aux lignes de l'organisation de l'utilisateur, et ajouter un test qui échoue si un autre compte peut lire une ligne.
create policy "org members read own transactions"
on transactions for select
using (org_id in (
select org_id from memberships where user_id = auth.uid()
));Retest
Corrigé. La même requête avec le compte B ne renvoie plus que les lignes de son organisation.