SlopGradeby Maxor Global LLC
Iniciar sesiónEmpieza la prueba gratis de 14 días
Flujo de datos determinista · se abstiene cuando no puede probarEl motor de detección detrás de SlopGrade Firewall

Pruebas,
no suposiciones.
Sigue el dato.

La prueba es la única señal de seguridad que sobrevive a cada reejecución. Las regex adivinan a partir de patrones; los revisores LLM adivinan a partir del contexto, cobran por PR y envían tu código fuera. heisen-slop sigue cada valor de la petición a través de tu código con análisis de flujo determinista, y cuando no puede probar un camino se abstiene y lo dice — en vez de una adivinanza generativa. Un bloqueo es una ruta probada desde la entrada del atacante hasta un sink peligroso — nunca un patrón que casualmente coincidió.

6
lenguajes
29
clases de vulnerabilidad
127
detectores lenguaje × clase
23 ms
por archivo, de media
Qué es

Un motor de flujo, no un escáner de patrones.

El motor lee tu código como lo haría un intérprete: sigue cada valor desde donde entra — un parámetro de petición, un campo de formulario, un argumento CLI — hasta donde llega: un shell, una consulta, una plantilla, un deserializador. Solo levanta un hallazgo si puede probar el camino, y solo da por limpio el código si puede probar que el valor es una constante. Todo lo que no puede probar, se abstiene — ni bloqueo, ni falso verde.

Alcance de detección

29 clases en 6 lenguajes — 127 detectores.

Cada ✓ es un detector de flujo de datos activo que sigue la entrada de la petición hasta un sink peligroso en ese lenguaje. Es la capa deep scan del Firewall; el catálogo Firewall de 125 clases incluye además gates de patrones que la GitHub Action ejecuta en tu runner.

Clase de vulnerabilidad
Python
JS / TS
Go
Java
Ruby
PHP
Inyección y ejecución de código
Inyección SQLCWE-89
Inyección de comandosCWE-78
Inyección de argumentosCWE-88
Inyección de código / evalCWE-94
Inyección NoSQLCWE-943
Inyección de plantillas (SSTI)CWE-1336
Inyección LDAPCWE-90
Inyección XPathCWE-643
Deserialización inseguraCWE-502
Entidades externas XML (XXE)CWE-611
Inyección JNDICWE-74
Contaminación de prototiposCWE-1321
Rutas, redirecciones y salida
Path traversalCWE-22
Zip slipCWE-22
SSRFCWE-918
Redirección abiertaCWE-601
Cross-site scripting (XSS)CWE-79
ReDoSCWE-1333
Cripto, tokens y transporte
Criptografía débilCWE-327
Verificación TLS desactivadaCWE-295
Transporte sin cifrarCWE-319
Secreto JWT en el códigoCWE-321
Verificación JWT desactivadaCWE-347
Sesiones y configuración
Cookie inseguraCWE-614
Protección CSRF desactivadaCWE-352
CORS permisivoCWE-942
Permisos de escritura para todosCWE-732
Modo debug en producciónCWE-489
Violación de límite de confianzaCWE-501
Detectores por lenguaje · 127
27
23
21
24
23
9

✓ = un detector activo para ese lenguaje. — = no cubierto en ese lenguaje hoy. El deep scan alojado deja fuera el límite de confianza: en aplicaciones reales era sobre todo ruido.

Lo que entiende

Conoce tu framework, tu base de datos y tu cliente HTTP.

Un motor de taint vale lo que valen las fuentes y los sinks que conoce. Estos son los modelados hoy — todo lo demás se sigue como código normal, y una llamada desconocida hace que el motor se abstenga en vez de adivinar.

Pythonast · entre archivos: imports, 3 nivelesDjango, Flask, FastAPI / Starlette, Tornado, aiohttp, DRF. SQLAlchemy text(), Django .raw(), pymongo / motor. requests, urllib, httpx. Plantillas Jinja, Mako, Django.
JavaScript / TypeScripttree-sitter · entre archivos: imports relativosExpress, Koa, Hapi, Fastify, parámetros de ruta de Next.js y acciones 'use server', resolvers GraphQL. knex, Sequelize, Prisma, pg, mysql, Mongo / Mongoose. axios, got, undici, node-fetch.
Gotree-sitter · entre archivos: el paquetenet/http, gin, echo, fiber. Llamadas SQL tipo db.Query y el driver de Mongo. goja y gopher-lua (inyección de código), gob (deserialización), rs/cors y gin-contrib/cors.
Javatree-sitter · una sola claseServlets, @RequestParam de Spring y similares, JAX-RS. Consultas JDBC, JPA / Hibernate. RestTemplate, WebClient, OkHttp. Velocity, FreeMarker, Pebble. DocumentBuilderFactory (XXE), CSRF de Spring Security, JNDI.
Rubytree-sitter · entre archivos: require_relativeparams / cookies de Rails, Sinatra y Rack. where, find_by_sql de ActiveRecord. Nokogiri (XPath, XXE), ERB. Ajustes CSRF de Rails.
Aún no cubiertoindicado, nunca insinuadoEl flujo de datos de C# / .NET (los gates de patrones de la Action sí cubren .NET), los alias de ruta de TypeScript como @/lib, y las llamadas Java a otra clase.
Dónde se conecta

Un solo motor, al que llegas con las herramientas que ya usas.

GitHub Actioncada pull requestEn un repo privado solo envía por defecto una huella {file, line, kind}. Con deep-scan: "true" (heisen-slop, repos de pago), y por defecto en un repo público, también envía los archivos que contienen un sink — 80 archivos / 2 M caracteres como máximo, primero los de la PR. --print-payload muestra antes los bytes exactos.
Checks de pull requestinformativo por defectoLos hallazgos llegan como check run y anotaciones en la PR. deep-scan-block: "true" permite que los hallazgos probados hagan fallar el check; la GitHub App puede volver el check obligatorio con la protección de rama.
Code Scanning (SARIF)pestaña Security de GitHubupload-sarif: "true" envía los resultados junto a tus otros escáneres. Un repo privado requiere GitHub Advanced Security para la pestaña Security.
Servidor MCPtu asistente de IAPide el estado de los gates de un repo, el último veredicto de CI y los hallazgos del Firewall (repo_gate_status, ci_verdict, firewall_findings) con una clave API.
Motor alojadoen memoria, luego descartadoEl código se reenvía, se analiza en memoria y se descarta — nunca se registra ni se guarda. Solo se conserva el hallazgo (archivo, línea, clase, motivo en una línea) para tu historial de CI.
Tu infraestructuraEnterprisePara código que nunca debe salir, el motor puede correr dentro de tu red, diseñado para funcionar sin acceso a internet. Se configura contigo, no es una descarga pública.

Solo GitHub por ahora: GitLab y Bitbucket no están soportados por el Firewall.

Cómo funciona

Probar → abstenerse → decidir. Nunca se adivina nada.

01 · PROBAR

Análisis de flujo determinista

El motor interpreta cada archivo de forma abstracta y rastrea el taint de cada fuente a cada sink. Una ruta probada es un BLOQUEO (p = 0,94); un valor probado constante es LIMPIO (p = 0,02). 0 $, auditable e idéntico en cada ejecución.

02 · ABSTENERSE

Se abstiene en la banda ambigua

Cuando un sink peligroso se encuentra con una fuente de petición pero no se puede probar ningún camino, el motor se abstiene: no devuelve veredicto para ese caso. Nunca lo convierte en un bloqueo y nunca lo cuenta como limpio.

03 · DECIDIR

Un veredicto auditable

La evidencia lleva el sink y el flujo — nunca tu código fuente. En SlopGrade Firewall el deep scan es opt-in en repos privados e informativo por defecto; bloquear con sus hallazgos es un ajuste aparte. Hoy solo Python puede devolver un CLEAN probado; los demás lenguajes bloquean o se abstienen.

Por qué gana

El eje que los actores establecidos no pueden seguir.

vs. escáneres regex

patrón → ruido

Un regex se dispara con texto que parece peligroso. El motor se dispara con datos que fluyen de forma probada a un sink — una consulta parametrizada segura con las mismas palabras clave queda limpia.

vs. revisores LLM

no determinista · coste por llamada · egress

Un LLM puede responder distinto al re-ejecutar, cuesta dinero por PR y envía tu código a un tercero. El camino probado es determinista — mismo código, mismo veredicto — y no hace ninguna llamada a modelos. Cuando no se puede probar un camino, el motor se abstiene en vez de adivinar, y el deep scan alojado nunca guarda una línea de tu código.

vs. SaaS en la nube

tu código sale de tu infra

Los escáneres alojados en la nube copian tu repo fuera. En un repo privado, la ejecución Firewall por defecto solo envía una huella estructural. El deep scan se analiza en memoria y se descarta. Ejecutar el motor en tu infraestructura se prepara bajo un acuerdo Enterprise, bajo petición.

Medido, no afirmado

Cada cifra aquí sale de una ejecución — incluidas las débiles.

0 bloqueos falsosen 2 479 casos etiquetados que el motor decidió (OWASP Benchmark Python, tests de reglas de Semgrep)
23 mspor archivo de media, 1,6 s en el peor caso, sobre 60 008 archivos reales — 0 llamadas a modelos
3 de 32veredictos Python erróneos en tests de CodeQL nunca vistos (los tres eran bloqueos; 12 de 12 CLEAN correctos). JS: 106 de 112 bloqueos correctos
~2 %de los archivos de CVE reales (avisos de GitHub) reciben un veredicto — el recall en vulnerabilidades reales es la frontera

Lee la primera cifra junto con la última: el motor es preciso cuando decide, y a menudo se abstiene. En código CVE real (avisos de GitHub, lote nunca visto), los bloqueos aciertan al menos 3 de cada 4 (25 de 32, un mínimo: todo bloqueo en el archivo corregido cuenta como erróneo); sobre 52 089 pull requests open source ordinarios bloqueó 245, 46 de ellos por una falla real — por eso el deep scan es informativo por defecto y bloquear es un opt-in aparte. El paquete de reglas para bibliotecas de la puerta de CI se califica igual: una revisión del repositorio completo sobre 240 de sus líneas MEDIUM halló cerca de 1 de cada 4 verdaderas (25,0 %, 18,0–32,9), no el 32,5 % de las etiquetas sobre fragmentos. Solo los desacuerdos tuvieron una segunda lectura y no se ejecutó nada: el paquete sigue siendo informativo y nunca bloquea.

Roadmap

Lo que construimos a continuación.

Recall en CVE realesUn modo librería para paquetes publicados ya lista candidatos (avisos, nunca bloqueantes). Convertir más de ellos en hallazgos probados es la palanca principal.
Más entre archivosAlias de ruta de TypeScript, llamadas Java entre clases, Go entre paquetes.
Más lenguajesUn motor de flujo de datos para C# sobre el mismo núcleo.
Preguntas

Respuestas directas.

¿Sigue el dato entre archivos?

Sí en Python (imports, 3 niveles), JavaScript/TypeScript (imports relativos), Ruby (require_relative) y Go (el paquete). Todavía no para los alias de ruta de TypeScript ni las llamadas Java a otra clase.

¿Mi código sale de mi infraestructura?

No por defecto: la ejecución del Firewall envía una huella estructural — rutas de archivo, {file, line, kind} y los nombres de tablas y columnas que necesita el control cross-tenant, nunca el contenido de los archivos. El deep scan (heisen-slop) está activo por defecto en repos públicos y es una opción de pago en repos privados — envía al motor como máximo 80 archivos que marcó un detector local o que contienen una llamada peligrosa; el motor los analiza en memoria y los descarta. Cuando no se puede probar un camino, el motor se abstiene.

¿En qué se diferencia de Snyk, Semgrep o CodeQL?

Semgrep y Snyk Code parten de reglas de patrones; CodeQL hace dataflow pero exige escribir consultas y no trae un gate de aislamiento tenant. El motor solo bloquea un camino probado y se abstiene cuando no puede probarlo. La contrapartida es el recall: en los propios tests de reglas de Semgrep, Semgrep encuentra más.

¿Soportan GitLab o Bitbucket?

Todavía no para el Firewall — solo GitHub (Action, checks, OIDC).

Pon pruebas en tu pipeline.

Añade el deep scan (heisen-slop) a tus PR — gratis en repos públicos, opt-in en repos privados, determinista, informativo por defecto.

¿Regulado o air-gap? Hablemos de ejecutar el motor en tu infraestructura →