Bloquez les fuites de données inter-locataires
avant qu'elles n'atteignent main.
Une requête à portée d'organisation sans filtre d'org est du broken object-level authorization — n°1 de l'OWASP API Top 10 — et l'IA l'écrit sans cesse, parce que le test du chemin heureux passe quand même. SlopGrade attrape le .eq(org_id) manquant en CI, sur chaque pull request, avant le merge — déterministe, et sur un repo privé, par défaut, seule une empreinte {fichier · ligne · classe} quitte votre runner.
Un filtre manquant, et le locataire A lit les données du locataire B.
La requête renvoie des lignes filtrées par id mais jamais par org_id. Tous les tests passent — les données de seed n'ont qu'une seule org. En production, n'importe quel utilisateur authentifié peut lire les factures de n'importe quel locataire en changeant un id. L'IA écrit ça sans cesse ; un relecteur humain glisse dessus. Pas le gate.
Ce que l'IA a livré
Ce qui quitte votre runner
Chemin, ligne, classe. Par défaut, le contenu d'un fichier privé reste sur le runner. Auditez-le avec --print-payload.
Détecte → adapte → vérifie. Sur un repo privé, rien d'autre ne sort par défaut.
Dans votre runner, sur le diff
Le client open source parcourt la pull request, résout chaque accès à une table à portée d'org, et signale toute requête qui lit par id sans prédicat d'org — dataflow intra-fonction. Par défaut, aucun code privé ne quitte la machine.
Verdict serveur + gate
L'empreinte est classée côté serveur. Une fuite dure bloque le check sur un repo privé payant ; les repos publics sont gatés gratuitement. Le paywall échoue en mode ouvert — jamais un build bloqué par erreur.
Correctif calculé dans le runner
Le constat est posté inline sur la ligne 44. Vous ajoutez le filtre d'org ; le push suivant relance le gate et le check repasse au vert.
La plupart des scanners ingèrent votre code privé. Par défaut, celui-ci non.
Bloquez les fuites cross-tenant sur les repos privés. Solo pour une personne, Team pour une équipe.
L'advisory est gratuit partout. Le blocage est gratuit sur chaque repo public et un repo privé. Solo couvre 10 repos privés pour une personne ; Team en couvre 50, utilisateurs illimités. 14 jours gratuits, sans carte.
Prêt à bloquer la prochaine fuite d'isolation locataire avant le merge ?
Ajoutez-le à un seul fichier de workflow. La première pull request de code IA que vous scannez vous dira ce qu'elle allait laisser passer.
Fuites inter-locataires — les questions qu'une équipe sécurité pose.
Qu'est-ce qu'une fuite de données inter-locataires ?
Dans un SaaS multi-locataires, chaque ligne appartient à une organisation. Une fuite inter-locataires est une requête qui filtre par id d'enregistrement mais pas par l'org de l'appelant — un utilisateur authentifié du locataire A peut donc lire les données du locataire B en changeant un id. On l'appelle aussi BOLA / IDOR (CWE-639), et c'est le n°1 de l'OWASP API Security Top 10.
Pourquoi les tests la ratent ?
Parce que le test du chemin heureux ne seed qu'une seule org, donc le filtre d'org manquant renvoie quand même la « bonne » ligne. Le bug n'apparaît qu'avec de vraies données multi-locataires en production. Un gate CI déterministe qui lit la forme de la requête l'attrape avant qu'elle ne soit livrée.
Mon code source quitte-t-il le runner ?
Pas par défaut. Le client lit les fichiers en local et ne publie qu'une empreinte structurelle — chemins de fichiers, {file, line, kind} et les noms de tables et de colonnes dont le contrôle cross-tenant a besoin. Lancez --print-payload pour auditer les octets exacts envoyés. Les exceptions sont le deep scan (heisen-slop) sur un repo public, actif par défaut, et le deep scan opt-in sur un repo privé payant : 80 fichiers porteurs d'un sink au plus, analysés en mémoire puis jetés. Un repo privé gratuit n'envoie jamais de source.
Va-t-il casser mon build avec des faux positifs ?
Démarrez en mode advisory — voyez chaque constat, ne bloquez rien — puis passez en gate quand vous avez confiance. Le gate détecte d'abord votre modèle de tenancy (filtre de ligne, RLS ou schéma par locataire) avant de juger une requête, et il est fail-open par défaut : une panne ne casse jamais un build.
Quels langages et frameworks ?
JavaScript/TypeScript et Python aujourd'hui (Go et .NET couvrent le sous-ensemble principal), sur les query builders et ORM courants. Le gate cross-tenant est dans le client open-source gratuit.