Tengo una aplicación. Tras un inicio de sesión exitoso, los usuarios obtienen un token de autenticación jwt que contiene varios datos y caduca en 30 minutos. Se necesita un token válido para que la aplicación pueda llamar a varias funciones de back-end y acceder a los recursos de la base de datos. Sin embargo, una vez que se verifica el token, las funciones de backend no imponen más restricciones de seguridad. Me temo que esto podría resultar en el siguiente ataque:
1) Los piratas informáticos crean una cuenta de usuario válida (con información de bs) e inician sesión. Ahora tienen un token válido.
2) Usando ese token, luego manipulan varias solicitudes al backend: Por ejemplo, proporcionan el ID de usuario de otras partes en el cuerpo de la solicitud y, por lo tanto, pueden acceder a los recursos del servidor como si fueran ese usuario.
Ejemplo concreto
Hay una función de backend llamada deleteUser
. Borra el usuario asociado con el ID de usuario que se pasa en el cuerpo de la solicitud https. Antes de ser llamada, la función valida el token, pero no comprueba si el token corresponde al userId en el cuerpo de la solicitud. Al pasar un token asociado con un user_A y una identificación que corresponde a user_B, podré usar el token de user_A para eliminar user_B.
La solución simple
Compruebe que los metadatos del token coincidan con los parámetros que se pasan en el cuerpo de la solicitud. Sin embargo, esto no siempre es simple. A veces, la información que se pasa en el cuerpo de la solicitud es varios pasos eliminados de los datos contenidos en el token del usuario. P.ej. una función deleteProperty
toma un property_id
en el cuerpo de la solicitud, pero para verificar que el property_id
en cuestión se relacione con los metadatos del token de autenticación, se necesitarían algunas operaciones de base de datos costosas; esto ralentiza la aplicación y aumenta la carga computacional en los servidores.
¿Hay un nombre para este tipo de ataque? ¿Cuál es la forma recomendada para detenerlo? ¿Hay mejores soluciones que las que he descrito anteriormente?