A01:2025 Pérdida de Control de Acceso (Broken Access Control) 
Antecedentes
Manteniendo su posición en el #1 del Top Ten, se encontró que el 100% de las aplicaciones probadas tenían alguna forma de pérdida de control de acceso. Los CWE notables incluidos son CWE-200: Exposición de Información Sensible a un Actor no Autorizado, CWE-201: Exposición de Información Sensible a Través de Datos Enviados, CWE-918: Falsificación de Solicitud del Lado del Servidor (SSRF), y CWE-352: Falsificación de Solicitud en Sitios Cruzados (CSRF). Esta categoría tiene el mayor número de ocurrencias en los datos aportados y el segundo número más alto de CVE relacionados.
Tabla de puntuación
| CWE Mapeados | Tasa de Incidencia Máx. | Tasa de Incidencia Prom. | Cobertura Máx. | Cobertura Prom. | Explotación Ponderada Prom. | Impacto Ponderado Prom. | Ocurrencias Totales | CVE Totales |
| 40 | 20.15% | 3.74% | 100.00% | 42.93% | 7.04 | 3.84 | 1,839,701 | 32,654 |
Descripción
El control de acceso aplica políticas de tal manera que los usuarios no puedan actuar fuera de sus permisos previstos. Las fallas suelen conducir a la divulgación no autorizada de información, la modificación o destrucción de todos los datos, o la ejecución de una función de negocio fuera de los límites del usuario. Las vulnerabilidades comunes de control de acceso incluyen:
- Violación del principio de mínimo privilegio, comúnmente conocido como denegar por defecto, donde el acceso solo debe otorgarse para capacidades, roles o usuarios específicos, pero está disponible para cualquier persona.
- Elusión de los controles de acceso mediante la modificación de la URL (manipulación de parámetros o navegación forzada), el estado interno de la aplicación o la página HTML, o mediante el uso de una herramienta de ataque que modifique las solicitudes a la API.
- Permitir ver o editar la cuenta de otra persona proporcionando su identificador único (referencias directas inseguras a objetos o Insecure Direct Object References, IDOR).
- Una API accesible con falta de controles de acceso para POST, PUT y DELETE.
- Elevación de privilegio. Actuar como un usuario sin haber iniciado sesión o ganar privilegios más allá de los esperados para el usuario autenticado (por ejemplo, acceso de administrador).
- Manipulación de metadatos, como la repetición o manipulación de un token de control de acceso JSON Web Token (JWT), una cookie o un campo oculto manipulado para elevar privilegios, o el abuso de la invalidación de JWT.
- La desconfiguración de CORS permite el acceso a la API desde orígenes no autorizados o no confiables.
- Navegación forzada (adivinar URLs) hacia páginas autenticadas como un usuario no autenticado o hacia páginas privilegiadas como un usuario estándar.
Cómo prevenir
El control de acceso solo es efectivo cuando se implementa en código del lado del servidor de confianza o en APIs sin servidor (serverless), donde el atacante no puede modificar la comprobación del control de acceso o los metadatos.
- Excepto para recursos públicos, denegar por defecto.
- Implementar mecanismos de control de acceso una sola vez y reutilizarlos en toda la aplicación, incluyendo la minimización del uso del Intercambio de Recursos de Origen Cruzado (Cross-Origin Resource Sharing, CORS).
- Los controles de acceso del modelo deben imponer la propiedad de los registros en lugar de permitir que los usuarios creen, lean, actualicen o eliminen cualquier registro.
- Los requisitos únicos de límites de negocio de la aplicación deben ser aplicados por los modelos de dominio.
- Desactivar el listado de directorios del servidor web y asegurarse de que los metadatos de los archivos (por ejemplo, .git) y los archivos de respaldo no estén presentes dentro de las raíces web.
- Registrar las fallas de control de acceso, alertar a los administradores cuando sea apropiado (por ejemplo: fallas repetidas).
- Implementar límites de tasa (límites de velocidad - rate limits) en el acceso a la API y a los controladores para minimizar el daño de las herramientas de ataque automatizadas.
- Los identificadores de sesión con estado deben invalidarse en el servidor tras el cierre de sesión. Los tokens JWT sin estado deben ser de corta duración para minimizar la ventana de oportunidad de un atacante. Para JWT de mayor duración, considere el uso de tokens de actualización (refresh tokens) y siga los estándares de OAuth para revocar el acceso.
- Utilizar kits de herramientas o patrones bien establecidos que proporcionen controles de acceso sencillos y declarativos.
Los desarrolladores y el personal de control de calidad (QA) deben incluir el control de acceso funcional en sus pruebas unitarias y de integración.
Escenarios de ejemplo de ataque
Escenario #1: La aplicación utiliza datos no verificados en una llamada SQL que accede a la información de la cuenta:
pstmt.setString(1, request.getParameter("acct"));
ResultSet results = pstmt.executeQuery( );
Un atacante puede simplemente modificar el parámetro 'acct' del navegador para enviar cualquier número de cuenta deseado. Si no se verifica correctamente, el atacante puede acceder a la cuenta de cualquier usuario.
https://example.com/app/accountInfo?acct=notmyacct
Escenario #2: Un atacante simplemente fuerza a los navegadores a dirigirse a URLs específicas. Se requieren derechos de administrador para acceder a la página de administración.
https://example.com/app/getappInfo
https://example.com/app/admin_getappInfo
Si un usuario no autenticado puede acceder a cualquiera de las páginas, es una falla. Si un usuario que no es administrador puede acceder a la página de administración, esto es una falla.
Escenario #3: Una aplicación pone todo su control de acceso en su front-end. Aunque el atacante no puede llegar a https://example.com/app/admin_getappInfo debido al código JavaScript que se ejecuta en el navegador, simplemente puede ejecutar:
$ curl https://example.com/app/admin_getappInfo
desde la línea de comandos.
Referencias
- Controles Proactivos de OWASP: C1: Implementar Control de Acceso
- Estándar de Verificación de Seguridad en Aplicaciones de OWASP: V8 Autorización
- Guía de Pruebas de OWASP: Pruebas de Autorización
- Guía de referencia rápida de OWASP: Autorización
- PortSwigger: Explotación de la desconfiguración de CORS
- OAuth: Revocación de Acceso
Lista de CWE Mapeados
-
CWE-23 Salto de Directorio Relativo (Relative Path Traversal)
-
CWE-36 Salto de Directorio Absoluto (Absolute Path Traversal)
-
CWE-61 Seguimiento de Enlaces Simbólicos (Symlink) en UNIX (UNIX Symbolic Link (Symlink) Following)
-
CWE-276 Permisos por Defecto Incorrectos (Incorrect Default Permissions)
-
CWE-281 Preservación Inadecuada de Permisos (Improper Preservation of Permissions)
-
CWE-282 Gestión Inadecuada de la Propiedad (Improper Ownership Management)
-
CWE-284 Control de Acceso Inadecuado (Improper Access Control)
-
CWE-352 Falsificación de Solicitud en Sitios Cruzados (Cross-Site Request Forgery (CSRF))
-
CWE-424 Protección Inadecuada de Ruta Alternativa (Improper Protection of Alternate Path)
-
CWE-668 Exposición de un Recurso a la Esfera Equivocada (Exposure of Resource to Wrong Sphere)
-
CWE-749 Método o Función Peligrosa Expuesta (Exposed Dangerous Method or Function)
-
CWE-918 Falsificación de Solicitud del Lado del Servidor (Server-Side Request Forgery (SSRF))
-
CWE-922 Almacenamiento Inseguro de Información Sensible (Insecure Storage of Sensitive Information)