Tema 9

9. Autorización, control de acceso y prevención de IDOR

Autenticarse no debería significar poder hacer cualquier cosa. La autorización define qué acciones, datos y recursos corresponden a cada identidad. Cuando este control falla, un usuario válido puede terminar accediendo a información ajena o ejecutando funciones para las que nunca tuvo permiso.

Objetivo Diseñar permisos correctos por recurso y por acción
Enfoque Identidad, contexto y propiedad del dato
Resultado Evitar accesos indebidos e IDOR

9.1 Introducción

En muchas brechas reales el atacante no necesita romper una contraseña ni explotar una inyección. Le alcanza con autenticarse como un usuario legítimo y luego probar qué recursos o funciones puede alcanzar cambiando parámetros, URLs, identificadores o flujos.

Eso sucede cuando la aplicación asume que un usuario autenticado ya es confiable para todo, o cuando verifica permisos de manera incompleta. Desde la seguridad web, este problema es crítico porque suele afectar directamente datos sensibles, paneles administrativos, operaciones de negocio y privacidad de usuarios.

Por eso la autorización no puede ser un detalle añadido al final. Debe formar parte del diseño del sistema desde el principio.

9.2 Autenticación no es autorización

La autenticación responde quién es el usuario. La autorización responde qué puede hacer ese usuario. Confundir ambos conceptos es una fuente muy común de vulnerabilidades.

Ejemplos típicos del error:

  • “Si inició sesión, puede consultar cualquier registro”.
  • “Si conoce la URL del panel, ya puede entrar”.
  • “Si el frontend no muestra el botón, entonces no podrá ejecutar la acción”.
La seguridad no termina cuando el usuario se autentica. Ahí recién empieza la decisión más fina: qué operaciones concretas le corresponden en este contexto.

9.3 Qué es el control de acceso

El control de acceso es el conjunto de reglas y mecanismos que determinan qué sujetos pueden acceder a qué recursos y bajo qué condiciones. En una aplicación web, esto se traduce en preguntas concretas:

  • ¿Puede este usuario ver este recurso?
  • ¿Puede modificarlo?
  • ¿Puede borrar o aprobar esta operación?
  • ¿Puede ejecutar esta función administrativa?
  • ¿Puede hacerlo en este momento y en este estado del flujo?

Responder correctamente estas preguntas requiere mirar identidad, rol, propiedad del recurso, contexto del negocio y estado de la operación.

9.4 Tipos de fallas de control de acceso

Las fallas de autorización suelen agruparse en varias categorías prácticas:

  • Escalada vertical: un usuario común alcanza funciones de administrador.
  • Escalada horizontal: un usuario accede a datos o recursos de otro usuario con el mismo nivel.
  • Bypass contextual: la acción se ejecuta fuera del flujo o estado permitido.
  • Exposición de funciones ocultas: el backend acepta acciones que el frontend solo escondía visualmente.

En todos estos casos, el problema no es la identidad principal del usuario, sino la decisión incorrecta sobre lo que se le permite hacer.

9.5 Qué es IDOR

IDOR significa Insecure Direct Object Reference. Ocurre cuando la aplicación expone una referencia directa a un objeto interno, como un identificador de factura, pedido, documento o usuario, y no verifica correctamente si el solicitante tiene permiso para acceder a ese objeto específico.

El caso típico es simple: el usuario cambia un ID en la URL o en un parámetro y obtiene acceso a datos de otra persona. Pero el concepto se extiende a cualquier referencia directa manipulable sin un control de autorización apropiado.

9.6 Por qué IDOR es tan frecuente

IDOR aparece con frecuencia porque muchas aplicaciones construyen sus flujos alrededor de identificadores internos y luego se concentran en validar que el ID exista o tenga formato correcto, olvidando la pregunta realmente importante: ¿este usuario puede acceder precisamente a este recurso?

Además, es una vulnerabilidad fácil de pasar por alto porque el sistema puede “funcionar bien” en pruebas normales, pero fallar cuando alguien manipula parámetros fuera del flujo esperado.

9.7 Ejemplos típicos de IDOR

Escenario Referencia manipulable Consecuencia
Portal de clientes ID de factura en la URL Lectura de facturas ajenas
Aplicación educativa ID de alumno o examen Consulta o edición de datos de terceros
Panel interno ID de ticket o expediente Acceso a información sensible fuera del área permitida
API móvil Identificador de recurso en JSON o path Exposición masiva si se automatiza

9.8 Validar formato no alcanza

Un error muy común es pensar que si el identificador tiene formato correcto, el acceso es válido. Por ejemplo, comprobar que `pedido_id` sea un número positivo o un UUID bien formado no resuelve nada respecto de la autorización real.

La verificación correcta debe responder algo más profundo:

  • ¿El recurso existe?
  • ¿Pertenece al usuario?
  • ¿El rol del usuario permite operar sobre él?
  • ¿El estado del recurso admite esta acción?

9.9 Modelos comunes de control de acceso

Existen varios enfoques para organizar permisos. Los más habituales son:

  • RBAC: control basado en roles. Asigna permisos a perfiles como usuario, operador, administrador.
  • ABAC: control basado en atributos. Evalúa características del usuario, del recurso y del contexto.
  • Propiedad del recurso: el usuario puede actuar solo sobre objetos que le pertenecen.

En la práctica, muchas aplicaciones usan una combinación de estos enfoques.

9.10 Mínimo privilegio y denegar por defecto

Dos principios ayudan mucho a diseñar autorización segura:

  • Mínimo privilegio: cada identidad recibe solo lo que necesita.
  • Denegar por defecto: si una acción no está permitida explícitamente, debe rechazarse.

Estos principios reducen el riesgo de permisos heredados, funciones olvidadas o accesos ampliados por error con el crecimiento del sistema.

9.11 El backend siempre decide

Ocultar botones, rutas o menús en el frontend puede mejorar experiencia y evitar confusiones, pero no constituye seguridad real. El atacante puede llamar directamente al endpoint, modificar la solicitud o usar herramientas automáticas sin pasar por la interfaz prevista.

Por eso las decisiones de autorización deben tomarse en el backend, para cada recurso y cada acción sensible.

9.12 Autorización por recurso, no solo por pantalla

Una aplicación segura no debería verificar permiso solo al entrar a una sección general del sistema. Debe comprobar también cada operación concreta sobre cada recurso concreto. Un usuario podría tener acceso al módulo de facturación, pero no por eso a todas las facturas existentes.

La regla práctica es simple: cada endpoint que devuelve o modifica datos debe validar autorización sobre ese dato exacto.

9.13 APIs y control de acceso

En APIs modernas el problema de autorización puede volverse aún más visible porque los endpoints suelen exponer recursos de forma directa y consumible por automatización. Si una API responde a IDs manipulables sin control fino, un atacante puede recorrer identificadores y extraer grandes volúmenes de información.

Esto obliga a revisar no solo el usuario autenticado, sino también el alcance del token, el rol, la propiedad del recurso y la respuesta devuelta.

9.14 Exposición de funciones administrativas

Otra falla frecuente ocurre cuando funcionalidades administrativas están técnicamente presentes y accesibles, aunque la interfaz no las muestre a usuarios comunes. Si el endpoint existe y el backend no valida rol o permiso, la función queda expuesta.

Esto puede afectar aprobaciones, borrados, exportaciones, configuración del sistema o acceso a paneles internos.

9.15 Contexto del negocio y estado del recurso

La autorización no siempre depende solo del rol. También depende del momento y del estado del proceso. Por ejemplo:

  • Un usuario puede editar su pedido mientras esté pendiente, pero no luego de ser facturado.
  • Un operador puede revisar un caso asignado a su área, pero no cerrarlo si falta otra validación.
  • Un docente puede cargar notas solo durante una ventana específica.

Este tipo de lógica muestra que la seguridad también requiere entender bien el negocio.

9.16 Identificadores impredecibles: ayudan, pero no reemplazan autorización

Usar UUIDs u otros identificadores menos predecibles puede reducir exploración trivial, pero no resuelve por sí solo el problema de fondo. Si un usuario consigue una referencia válida de un recurso ajeno y el backend no verifica permiso, la vulnerabilidad sigue existiendo.

Los identificadores poco predecibles son una ayuda defensiva secundaria, no el control principal.

9.17 Errores frecuentes en control de acceso

  • Confiar en el frontend para ocultar acciones.
  • Verificar solo autenticación y no autorización específica.
  • Controlar acceso al módulo, pero no al recurso individual.
  • Validar formato del ID y asumir que eso basta.
  • No revisar acciones críticas en APIs o endpoints secundarios.
  • Permitir permisos heredados sin revisión periódica.
Muchas fallas de autorización no surgen por ausencia total de reglas, sino por reglas incompletas aplicadas solo en algunas rutas y olvidadas en otras.

9.18 Ejemplo conceptual

Imaginemos un portal médico donde cada paciente puede ver sus estudios mediante `/estudios?id=1234`. Si la aplicación solo verifica que el usuario tenga sesión y que el estudio exista, cambiar el número podría exponer resultados de otra persona.

La corrección real exige comprobar que ese estudio pertenece al paciente autenticado o que el profesional tiene permisos válidos sobre ese caso en particular.

9.19 Defensa en profundidad para autorización

Una estrategia madura suele combinar varias capas:

  • Definir reglas claras de permiso desde el diseño.
  • Aplicar autorización en backend para cada recurso y acción.
  • Usar mínimo privilegio y denegar por defecto.
  • Separar roles administrativos y funciones críticas.
  • Registrar acciones sensibles y accesos relevantes.
  • Probar explícitamente escenarios de acceso horizontal y vertical.

9.20 Qué debes recordar de este tema

  • Autenticación y autorización son controles distintos y ambos son esenciales.
  • IDOR aparece cuando una referencia directa a un recurso no se acompaña de verificación de permiso adecuada.
  • Validar el formato del identificador no resuelve el problema de autorización.
  • El backend debe decidir permisos sobre cada recurso y cada acción concreta.
  • El mínimo privilegio y la negación por defecto reducen fuertemente este tipo de fallas.

9.21 Conclusión

La autorización es el control que traduce identidad en límites concretos. Si esos límites están mal definidos o mal aplicados, incluso un usuario legítimo puede transformarse en la vía de una brecha grave. Por eso el control de acceso debe diseñarse con el mismo rigor que la autenticación.

En el próximo tema veremos manejo seguro de sesiones, cookies, tokens y cierre de sesión, porque una identidad bien autenticada y autorizada también necesita una sesión correctamente protegida.