Aislamiento entre flotas: las pruebas negativas de una API de multas

Autenticarse como una empresa no alcanza. IDs, cursores, filtros y exportaciones deben resistir intentos cruzados sin revelar que la flota de al lado tiene un acta más de la que debería.

Foto de Marco FerreiroMarco FerreiroAutor en multas.ar
5 min de lectura
Dos gabinetes transparentes separados que contienen fichas de distintos colores
Dos gabinetes transparentes separados que contienen fichas de distintos colores

Una API de consulta de infracciones puede autenticar correctamente a todas las flotas que la usan y aun así mezclar sus multas. El error aparece cuando una operación confía en un identificador recibido, en una pantalla que ocultó un botón o en un filtro por empresa que alguien olvidó aplicar.

La prueba decisiva es negativa: una transportista intenta leer el reporte de actas de una rentadora y el sistema no sólo lo impide: evita revelar si existe. Saber que la flota de al lado tiene deuda ya es información.

Autenticación y aislamiento responden preguntas distintas

La autenticación responde quién presenta la solicitud. La autorización decide qué puede hacer ese sujeto sobre un objeto concreto. NIST SP 800-162 describe ABAC como la evaluación de atributos del sujeto, el objeto y la operación frente a una política.

En un producto para flotas, el tenant es un atributo central, pero no el único: también importan rol, estado del recurso, alcance de la credencial y operación solicitada. El responsable de flota de la empresa A sigue sin tener derechos sobre las patentes de la empresa B.

Preparar dos universos completamente sintéticos

Creá empresa_alpha y empresa_beta en un entorno de prueba. Cada una recibe:

  • usuarios con roles equivalentes;
  • claves o clientes separados;
  • dominios ficticios, consultas y actas de prueba;
  • un export y un trabajo asíncrono;
  • cursores e identificadores deliberadamente distintos;
  • una misma clave de idempotencia para probar colisiones.

No uses patentes, titulares ni actas reales: para probar una frontera alcanzan dominios inventados. Guardá los fixtures como código para recrearlos sin depender del estado residual de una ejecución anterior.

La prueba básica: cambiar sólo el objeto

Ejecutá una consulta válida como Alpha —el detalle de un acta de una de sus patentes— y conservá método, ruta, parámetros y encabezados. Repetila cambiando únicamente el ID por uno perteneciente a Beta.

El resultado cruzado debe ser una denegación controlada. No debe devolver campos parciales, contar cuántas infracciones tiene esa patente, cargar la foto del acta ni emitir eventos destinados a Beta. La misma técnica se repite para actualizar, borrar, descargar y reintentar.

OWASP destaca la autorización rota a nivel de objeto porque los IDs suelen ser controlados por el cliente. Que sean UUID difíciles de adivinar no reemplaza el control: aparecen en logs, URLs y correos.

IDs anidados y rutas engañosas

Una ruta como /empresas/alpha/reportes/reporte_beta contiene un tenant correcto y un objeto incorrecto. El servidor debe verificar que ese informe de multas pertenece realmente a Alpha; no alcanza con autorizar el primer segmento.

Probá también:

  • padre ajeno con hijo propio;
  • padre propio con hijo ajeno;
  • recurso movido entre estados;
  • ID válido de otro tipo de objeto: un acta donde se espera un vehículo;
  • alias histórico o ID eliminado;
  • referencias incluidas dentro del cuerpo JSON.

Cada repositorio o servicio debe recibir el contexto de autorización. Si el chequeo vive sólo en la ruta HTTP, un job interno puede omitirlo.

Cursores, filtros y búsquedas también son objetos

Un cursor puede codificar posición, filtros o referencias a una consulta anterior. Entregar a Alpha un cursor creado para el listado de infracciones de Beta sería una fuga aunque los IDs directos estén protegidos.

La matriz debe intercambiar cursores, filtros guardados, tokens de descarga y enlaces firmados. También conviene probar combinaciones de include, orden y búsqueda textual: un contador de actas o un autocompletado de patentes puede revelar datos sin devolver la fila.

Los cachés se aíslan con claves que incorporan el tenant y los factores de autorización relevantes. Una respuesta cacheada para Beta nunca debe servirse a Alpha por compartir ruta.

Exportaciones y procesos asíncronos

El informe mensual de infracciones suele separarse en dos pasos: crear el trabajo y descargar el archivo. Ambos requieren autorización. Probá que Alpha no pueda consultar el estado, adivinar la ruta del objeto almacenado ni recibir la notificación de un trabajo de Beta.

En colas, el mensaje debe llevar un tenant autenticado por el servicio productor, no uno aceptado desde el cuerpo original. El consumidor vuelve a aplicar sus invariantes.

También revisá nombres de archivo, metadatos, métricas y trazas: un export llamado multas-beta-agosto.csv filtra por el nombre aunque su contenido esté protegido. La Ley 25.326 exige condiciones técnicas de seguridad para bases con datos personales, y una infracción asociada a un titular lo es.

Idempotencia sin colisiones entre empresas

Si dos tenants usan la clave reintento-1, no deben compartir resultado. El espacio de idempotencia necesita incluir tenant, operación y, según el contrato, actor o recurso.

La prueba crea primero una consulta en Beta y repite la misma clave desde Alpha con otro dominio. Un diseño correcto procesa o rechaza la solicitud según las reglas de Alpha; jamás le devuelve las multas de Beta ni considera ambas acciones idénticas.

Hacé lo mismo con webhooks, locks y deduplicación de colas. Las claves globales son un atajo peligroso cuando el cliente controla su valor.

Evitar un oráculo de existencia

Muchas APIs responden 404 para un recurso inexistente o inaccesible, aunque RFC 9110 permite distintas políticas. Lo importante es la consistencia. Compará:

  • código y cuerpo;
  • encabezados y tamaño;
  • latencia en varias muestras;
  • consumo de cuota;
  • eventos de auditoría visibles al cliente;
  • mensajes en tareas posteriores.

Si el acta ajena tarda mucho más porque el sistema primero la carga y después niega el acceso, la diferencia puede revelar que existe. La prueba fija tolerancias razonables sin exigir tiempos idénticos al microsegundo.

Qué registrar cuando una prueba falla

El reporte no debe copiar la patente ni el acta ajena que logró ver. Registrá el fixture, la operación, el control esperado, la respuesta saneada y dónde se omitió la política. Corregí la causa en la capa compartida antes de parchear ruta por ruta.

Una suite útil corre en cada cambio y genera tenants nuevos para evitar falsos positivos por caché. Su afirmación final es acotada: las fronteras probadas negaron todas las combinaciones cruzadas observadas. No reemplaza revisión de arquitectura, pero convierte el aislamiento en una propiedad comprobable.

Metodología

Alcance
Matriz de autorización negativa inspirada en ABAC, controles NIST y riesgos de autorización por objeto para dos tenants totalmente ficticios.
Unidad de análisis
Una combinación de sujeto autenticado, tenant, operación, objeto, canal de salida y resultado observable.
Cobertura
Lectura, escritura, búsqueda, cursores, exportaciones, trabajos asíncronos e idempotencia; estándares consultados el 14 de agosto de 2026.

Limitaciones

  • La matriz no demuestra ausencia total de fallas y debe ampliarse según los recursos, roles e infraestructura de cada producto.
  • Los códigos HTTP propuestos son decisiones contractuales; la propiedad esencial es no autorizar ni revelar recursos cruzados.

Fuentes

Preguntas frecuentes

¿Alcanza con incluir tenant_id en todas las consultas SQL?

No. Es una defensa importante, pero también deben cubrirse almacenamiento de objetos, cachés, colas, exports, jobs y cualquier autorización previa a la consulta.

¿Un 404 para recursos ajenos resuelve la filtración de existencia?

Ayuda si es consistente, pero también deben compararse cuerpo, encabezados, tiempos, métricas y efectos laterales. Una diferencia observable puede seguir funcionando como oráculo.

¿Estas pruebas pueden ejecutarse con datos de producción?

No hace falta. Dos tenants y recursos totalmente sintéticos permiten probar la frontera con menor riesgo y pueden recrearse en cada ejecución automatizada.

Notas relacionadas