SlopGradeby Maxor Global LLC
Se connecterDémarrer l'essai gratuit de 14 jours
Gate de contrôle d'accès · CWE-639 / BOLAPour les équipes qui livrent du code IA en SaaS multi-locataires

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.

n°1
risque OWASP API (BOLA)
0
lignes de code stockées
0
appel de modèle · déterministe
3
classes bloquent un repo payant aujourd'hui
La confiance, prouvée — pas promise
Client open sourceMIT · auditez chaque ligne avant de l'épingler
Auditez l'empreinte--print-payload imprime les octets exacts envoyés
Épinglez le SHAfigez le code exact ; un tag peut être re-pointé
Le contenu restesur un repo privé, par défaut seule l'empreinte structurelle est postée
Fail-openune panne ne casse jamais votre build
Le bug

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é

api/invoices.ts:44 — fuite entre locataires
// pas de filtre d'org — renvoie les lignes de N'IMPORTE quel locataire const { data } = await db .from("invoices") .select("*") .eq("id", req.params.id) // ✗ .eq("org_id", ctx.orgId) manquant

Ce qui quitte votre runner

l'empreinte structurelle — pas le code
{ "file": "api/invoices.ts", "line": 44, "kind": "cross-tenant-leak" }

Chemin, ligne, classe. Par défaut, le contenu d'un fichier privé reste sur le runner. Auditez-le avec --print-payload.

Comment le gate l'attrape

Détecte → adapte → vérifie. Sur un repo privé, rien d'autre ne sort par défaut.

01 · DÉTECTE

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.

→
02 · ADAPTE

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.

→
03 · VÉRIFIE

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.

→
vs un SAST générique

La plupart des scanners ingèrent votre code privé. Par défaut, celui-ci non.

SAST générique
SlopGrade
Votre code privé
souvent analysé dans le cloud du fournisseur
reste dans votre runner par défaut
Détection des fuites inter-locataires
rarement — règles de taint génériques
une classe de gate dédiée
Verdict
un score + une file de triage
passe / bloque déterministe
Faux positifs
à calibrer par équipe
conscient du modèle : détecte d'abord ligne, RLS ou schéma par locataire
Tarifs

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.

Free
0 $
Les fuites cross-tenant et les XSS par echo/print PHP bloquent sur chaque repo public et 1 repo privé.
Solo
49 $ / mois
Une personne : bloque les fuites cross-tenant + 2 autres classes sur 10 repos privés (jusqu'à 50).
Démarrer Solo — 14 jours, sans carte
Team
299 $ / mois
Une équipe : les mêmes 3 classes sur 50 repos privés, utilisateurs illimités, Deep Scan sur chaque PR.
Démarrer Team — 14 jours, 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.

installation en 2 min · sans carte · le client est open source (MIT) · fail-open
FAQ

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.

Ajoutez-le à un fichier de workflow. Attrapez la fuite avant le merge.

# .github/workflows/slop-gate.yml name: slop-gate on: { pull_request: {} } jobs: slop: # keep the job name: it is the check you require runs-on: ubuntu-latest permissions: contents: read id-token: write # required — OIDC proves the repo, no secret pull-requests: write # optional — judges the PR on its own changes + inline findings security-events: write # optional — Security tab (Code Scanning) steps: - uses: actions/checkout@v7 with: { fetch-depth: 0 } - uses: maxor-tech/slopgrade-firewall@f18a953e15e84ff0f9e457da4a056ddea3548d46 # v0.13.6