Épisode 1/4 de la mini-série La semaine où Supabase m'a menti 4 fois. Les trois épisodes suivants traitent d'une mutation silencieusement avalée par le SDK [CANONICAL URL EPISODE 2: à compléter après push], d'une récursion RLS contournée par un JWT hook [CANONICAL URL EPISODE 3: à compléter après push], et d'une requête qui s'arrête pile à 1000 lignes sans le dire [CANONICAL URL EPISODE 4: à compléter après push].
Le mardi où la sonde sécurité a parlé
C'est 9h12, un mardi de mai. La sonde drift quotidienne tourne automatiquement depuis trois semaines — une requête aclexplode sur l'ensemble des objets publics, filtrée sur anon. Je ne l'ouvre pas tous les matins. Ce matin-là, elle m'attend avec une ligne qui n'a pas à exister.
Niran pose un café sur le coin du bureau sans rien dire. Il lit la sortie par-dessus mon épaule. Une table de backup PII — données personnelles en clair, créée deux jours plus tôt pour un reclassement bulk — apparaît dans la liste avec SELECT, INSERT, UPDATE, DELETE accordés à anon. Accessible à n'importe quelle requête curl sans clé. Il laisse passer trois secondes et dit : « C'est pas RLS. » Puis il retourne à son hoodie.
Il a raison. Ce n'est pas un bug RLS. C'est la table elle-même qui est ouverte, au niveau GRANT, avant que RLS s'applique.






