SlopGradeby Maxor Global LLC
Iniciar sesiónEmpieza la prueba gratis de 14 días
Gate de control de acceso · CWE-639 / BOLAPara equipos que envían código escrito por IA a SaaS multi-inquilino

Bloquea fugas de datos entre inquilinos
antes de que lleguen a main.

Una consulta con alcance de organización sin filtro de org es broken object-level authorization — n.º 1 del OWASP API Top 10 — y la IA la escribe constantemente, porque la prueba del camino feliz igual pasa. SlopGrade detecta el .eq(org_id) faltante en CI, en cada pull request, antes del merge — determinista, y en un repo privado, por defecto solo una huella {archivo · línea · clase} sale de tu runner.

n.º 1
riesgo OWASP API (BOLA)
0
líneas de código almacenadas
0
llamadas a modelos · determinista
3
clases bloquean hoy un repo de pago
Confianza, probada — no prometida
Cliente open sourceMIT · audita cada línea antes de fijarla
Audita la huella--print-payload imprime los bytes exactos enviados
Fija el SHAcongela el código exacto; un tag puede re-apuntarse
El contenido se quedaen un repo privado, por defecto solo se publica la huella estructural
Fail-openuna caída nunca rompe tu build
El bug

Un filtro que falta, y el inquilino A lee los datos del inquilino B.

La consulta devuelve filas filtradas por id pero nunca por org_id. Todas las pruebas pasan — los datos de seed tienen una sola org. En producción, cualquier usuario autenticado puede leer las facturas de cualquier inquilino cambiando un id. La IA escribe esto constantemente; un revisor humano lo pasa por alto. El gate no.

Lo que la IA envió

api/invoices.ts:44 — fuga entre inquilinos
// sin filtro de org — devuelve las filas de CUALQUIER inquilino const { data } = await db .from("invoices") .select("*") .eq("id", req.params.id) // ✗ falta .eq("org_id", ctx.orgId)

Lo que sale de tu runner

la huella estructural — no el código
{ "file": "api/invoices.ts", "line": 44, "kind": "cross-tenant-leak" }

Ruta, línea, clase. Por defecto, el contenido de un archivo privado se queda en el runner. Audítalo con --print-payload.

Cómo lo detecta el gate

Detecta → adapta → verifica. En un repo privado, nada más sale por defecto.

01 · DETECTA

En tu runner, sobre el diff

El cliente open source recorre la pull request, resuelve cada acceso a tabla con alcance de org, y marca cualquier consulta que lea por id sin un predicado de org — dataflow intra-función. Por defecto, ningún código privado sale de la máquina.

→
02 · ADAPTA

Veredicto del servidor + gate

La huella se clasifica en el servidor. Una fuga dura bloquea el check en un repo privado de pago; los repos públicos se gatean gratis. El paywall falla en modo abierto — nunca un build bloqueado por error.

→
03 · VERIFICA

Corrección calculada en el runner

El hallazgo se publica inline en la línea 44. Añades el filtro de org; el siguiente push vuelve a ejecutar el gate y el check pasa a verde.

→
vs un SAST genérico

La mayoría de los escáneres ingieren tu código privado. Por defecto, este no.

SAST genérico
SlopGrade
Tu código privado
a menudo analizado en la nube del proveedor
se queda en tu runner por defecto
Detección de fugas entre inquilinos
rara vez — reglas de taint genéricas
una clase de gate dedicada
Veredicto
un score + una cola de triaje
pasa / bloquea determinista
Falsos positivos
a calibrar por equipo
consciente del modelo: detecta primero fila, RLS o esquema por inquilino
Precios

Bloquea fugas cross-tenant en repos privados. Solo para una persona, Team para un equipo.

El advisory es gratis en todo. El bloqueo es gratis en cada repo público y un repo privado. Solo cubre 10 repos privados para una persona; Team cubre 50, usuarios ilimitados. 14 días gratis, sin tarjeta.

Free
0 $
Las fugas cross-tenant y los XSS por echo/print de PHP bloquean en cada repo público y 1 repo privado.
Solo
49 $ / mes
Una persona: bloquea fugas cross-tenant + 2 clases más en 10 repos privados (hasta 50).
Empezar Solo — 14 días, sin tarjeta
Team
299 $ / mes
Un equipo: las mismas 3 clases en 50 repos privados, usuarios ilimitados, Deep Scan en cada PR.
Empezar Team — 14 días, sin tarjeta

¿Listo para bloquear la próxima fuga de aislamiento de inquilino antes del merge?

Añádelo a un solo archivo de workflow. La primera pull request de código IA que escanees te dirá lo que estaba a punto de dejar pasar.

instalación en 2 min · sin tarjeta · el cliente es open source (MIT) · fail-open
FAQ

Fugas entre inquilinos — las preguntas que hace un equipo de seguridad.

¿Qué es una fuga de datos entre inquilinos?

En un SaaS multi-inquilino, cada fila pertenece a una organización. Una fuga entre inquilinos es una consulta que filtra por id de registro pero no por la org de quien llama — así, un usuario autenticado del inquilino A puede leer los datos del inquilino B cambiando un id. También se llama BOLA / IDOR (CWE-639) y es el n.º 1 del OWASP API Security Top 10.

¿Por qué las pruebas la pasan por alto?

Porque la prueba del camino feliz solo hace seed de una org, así que el filtro de org que falta igual devuelve la fila «correcta». El bug solo aparece con datos multi-inquilino reales en producción. Un gate de CI determinista que lee la forma de la consulta lo detecta antes de que se envíe.

¿Mi código fuente sale del runner?

No por defecto. El cliente lee los archivos localmente y solo publica una huella estructural — rutas de archivo, {file, line, kind} y los nombres de tablas y columnas que necesita el control cross-tenant. Ejecuta --print-payload para auditar los bytes exactos enviados. Las excepciones son el deep scan (heisen-slop) en un repo público, activo por defecto, y el deep scan opt-in en un repo privado de pago: como máximo 80 archivos que contienen un sink, analizados en memoria y descartados. Un repo privado gratis nunca envía el código.

¿Romperá mi build con falsos positivos?

Empieza en modo advisory — ve cada hallazgo, no bloquees nada — luego cambia a gate cuando confíes. El gate detecta primero tu modelo de tenancy (filtro de fila, RLS o esquema por inquilino) antes de juzgar una consulta, y es fail-open por defecto: una caída nunca rompe un build.

¿Qué lenguajes y frameworks?

JavaScript/TypeScript y Python hoy (Go y .NET cubren el subconjunto principal), en los query builders y ORM habituales. El gate cross-tenant está en el cliente open-source gratuito.

Añádelo a un archivo de workflow. Detecta la fuga antes del 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