Tema 3
El control de acceso define quién puede ver, modificar, ejecutar o administrar cada recurso y cada acción dentro de una aplicación. Cuando esa verificación falla, el resultado puede ser uno de los problemas más graves de seguridad web: usuarios haciendo cosas que nunca debieron estar permitidas.
En la mayoría de las aplicaciones hay recursos y acciones que no deben estar disponibles para todos por igual. Un usuario puede ver su propio perfil, pero no el de otra persona. Un cliente puede consultar sus pedidos, pero no los pedidos ajenos. Un operador puede aprobar ciertas acciones, mientras que un administrador puede gestionar cuentas, configuraciones y reportes globales.
El mecanismo que define y aplica esas restricciones es el control de acceso. Cuando la aplicación lo implementa de forma incompleta, inconsistente o directamente incorrecta, aparecen fallas de autorización que permiten a un atacante leer datos indebidos, modificar información ajena, ejecutar acciones privilegiadas o tomar control de partes críticas del sistema.
OWASP ubica Broken Access Control como A01 porque es una categoría extremadamente frecuente y con impactos severos. Además, suele ser silenciosa: la aplicación puede seguir funcionando aparentemente bien mientras permite accesos que nunca debieron ocurrir.
El control de acceso es el conjunto de reglas y mecanismos que determinan qué acciones puede realizar cada identidad sobre cada recurso del sistema.
Responder correctamente estas preguntas es parte del control de acceso:
En otras palabras, autenticación responde quién eres, mientras que control de acceso responde qué te está permitido hacer.
Una confusión muy común es asumir que, si un usuario inició sesión correctamente, entonces ya puede acceder a todo lo que vea o intente. Eso es falso. La autenticación solo prueba identidad. La autorización decide los permisos concretos.
Ejemplo: dos usuarios pueden estar autenticados con éxito en la misma aplicación, pero uno debe poder ver únicamente su factura y el otro no debe verla. Si la aplicación no diferencia ese permiso por recurso, hay una falla de control de acceso.
Broken Access Control describe cualquier situación en la que la aplicación no aplica correctamente restricciones de acceso. El problema puede aparecer porque faltan verificaciones, porque se aplican solo en la interfaz visual, porque dependen de datos manipulables o porque no contemplan todos los escenarios.
Algunas manifestaciones típicas son:
No todo control de acceso es igual. En una aplicación real suelen convivir varios niveles de restricción.
| Tipo | Qué controla | Ejemplo |
|---|---|---|
| Acceso por función | Qué funcionalidades puede usar un rol | Solo administradores pueden crear usuarios |
| Acceso por objeto | Qué recursos concretos puede usar un usuario | Un cliente solo ve sus propios pedidos |
| Acceso por contexto | Qué acciones están permitidas según estado o condición | Solo se puede cancelar una orden no enviada |
| Acceso por método o ruta | Qué endpoints o verbos HTTP están habilitados | GET permitido, DELETE restringido |
Las fallas pueden aparecer en cualquiera de estos niveles. Una aplicación puede proteger menús administrativos y aun así dejar expuesto el acceso por objeto.
Dos conceptos ayudan a clasificar muchas fallas de autorización.
Ambas son graves. La horizontal suele exponer privacidad y datos. La vertical puede conducir al control total de la aplicación.
Uno de los casos más conocidos de Broken Access Control es IDOR, Insecure Direct Object Reference. En APIs también se usa el término BOLA, Broken Object Level Authorization. La idea central es la misma: la aplicación permite acceder a un objeto solo cambiando su identificador, sin verificar si ese objeto pertenece realmente al usuario actual.
Ejemplo simple:
/pedido/123 y ve su pedido./pedido/124.Este problema es especialmente peligroso porque suele parecer trivial desde lo técnico, pero permite exfiltrar datos de múltiples usuarios con un esfuerzo mínimo.
Broken Access Control aparece con mucha frecuencia porque el permiso correcto depende de la lógica del negocio y de cada recurso concreto. No basta con "tener login" o con ocultar botones en la interfaz.
Entre las causas más habituales se encuentran:
Un error muy común consiste en esconder botones, menús o enlaces y asumir que eso ya impide el acceso. Desde seguridad, eso no alcanza. Cualquier persona puede intentar llegar directamente a una URL, invocar un endpoint o modificar una solicitud manualmente.
Por eso los controles de acceso deben aplicarse siempre del lado servidor. La interfaz puede ayudar a no mostrar acciones no disponibles, pero la autoridad final debe estar en la lógica de backend.
user_id./admin porque la ruta existe y no valida rol.DELETE donde la interfaz solo permitía GET o POST.Todos estos casos comparten la misma raíz: la aplicación no decide permisos de forma confiable sobre cada recurso y acción.
Muchas aplicaciones trabajan con identificadores numéricos, UUID, códigos o claves internas para referenciar objetos. Estos identificadores son necesarios, pero no constituyen autorización.
Un error común es pensar:
Todo eso es insuficiente. El backend debe verificar explícitamente que el objeto solicitado pertenece al usuario actual o que su rol le permite operar sobre él. La autorización nunca debe derivarse solo del identificador recibido.
Algunas fallas no implican acceso a objetos ajenos, sino a funcionalidades completas que deberían estar restringidas. Esto ocurre cuando un usuario común alcanza endpoints o pantallas reservadas para roles de mayor privilegio.
Ejemplos:
Este problema suele surgir cuando las rutas administrativas existen pero solo se ocultan visualmente, o cuando el sistema reutiliza componentes sin revalidar el rol requerido.
El acceso a nivel de objeto es el que define si una identidad puede operar sobre una instancia específica. Por ejemplo, no alcanza con permitir "ver facturas"; hay que decidir qué facturas puede ver cada usuario.
Este tipo de validación suele ser más delicado porque depende de relaciones concretas de pertenencia, propiedad, jerarquía o delegación.
Buenas preguntas de diseño:
No todas las fallas de autorización aparecen en una única solicitud. A veces el problema está en permitir que el usuario salte pasos de un proceso que debería estar encadenado y controlado.
Ejemplos:
Este tipo de fallo muestra que el control de acceso también depende del contexto, no solo del rol o del ID del recurso.
El impacto puede ser muy alto porque esta categoría afecta directamente quién puede hacer qué dentro de la aplicación. Si la respuesta es incorrecta, la seguridad del sistema se rompe en su esencia.
| Tipo de impacto | Ejemplo |
|---|---|
| Exposición de datos | Acceso a información personal, financiera o médica de otros usuarios |
| Manipulación de información | Modificar perfiles, pedidos, saldos o documentos ajenos |
| Escalación de privilegios | Obtener funciones de supervisor o administrador |
| Fraude y abuso | Aplicar cambios económicos o funcionales no autorizados |
| Compromiso total | Tomar control de configuración, usuarios o contenido global |
Durante un análisis de seguridad, algunos indicios sugieren revisar con más detalle el control de acceso:
Supongamos que una aplicación bancaria permite ver extractos con una URL como /extracto?id=8452. El usuario autenticado accede a su propio documento. Luego cambia el valor a 8453.
Si el sistema solo hace algo como "buscar extracto por id y mostrarlo", sin validar que ese extracto pertenece al usuario actual, se produce una exposición de información. Técnicamente el fallo parece simple, pero el impacto es muy serio porque rompe el aislamiento entre cuentas.
Este mismo patrón se repite en APIs, paneles internos, reportes PDF, tickets, documentos, historiales, conversaciones y muchos otros objetos.
Broken Access Control puede originarse tanto en el diseño como en la implementación.
Por eso esta categoría no se corrige solo con un parche puntual. Muchas veces exige revisar cómo piensa la aplicación sus permisos de forma integral.
Prevenir Broken Access Control exige disciplina de arquitectura y de desarrollo.
El principio de mínimo privilegio indica que cada usuario, servicio o rol debe tener solo los permisos estrictamente necesarios para cumplir su función. Esto reduce impacto en caso de error o abuso.
Aplicado a aplicaciones web, implica:
Una forma útil de reducir errores es documentar una matriz de permisos. Esto obliga a explicitar quién puede hacer qué sobre cada recurso.
Una matriz puede responder:
Cuando esto no está documentado, es fácil que distintas partes del sistema implementen criterios diferentes y aparezcan inconsistencias.
La detección de Broken Access Control requiere probar la aplicación desde distintos perfiles y manipular solicitudes de forma deliberada.
Estas pruebas suelen ser más efectivas cuando se combinan con buen entendimiento del negocio y no solo con escaneo automático.
Broken Access Control suele combinarse con otras categorías del curso.
Esto explica por qué A01 es tan crítica: no solo es grave por sí misma, sino que potencia otras debilidades.
Broken Access Control es una de las fallas más peligrosas en seguridad web porque ataca directamente el mecanismo que separa lo permitido de lo prohibido dentro de la aplicación. Cuando esa barrera falla, el atacante ya no necesita técnicas especialmente complejas: la propia lógica del sistema le abre el camino.
En el próximo tema estudiaremos A02: Cryptographic Failures, centrado en cómo se protegen o se exponen los datos sensibles cuando el cifrado, el transporte o el almacenamiento se implementan de forma incorrecta.