Vulnerabilidad Race conditions
www.onlinetis.com
Una condición de carrera (race condition) es un fallo de seguridad que ocurre cuando la salida de una aplicación depende de la secuencia o el momento en que se ejecutan múltiples procesos o hilos de ejecución. Si esta secuencia no está controlada, un atacante puede manipular el timing para obtener un resultado inesperado y malicioso. ⏳
¿Cómo funciona?
Este tipo de vulnerabilidad se produce cuando una aplicación realiza varias operaciones que deberían ser atómicas (indivisibles), pero no lo son. Un atacante puede insertar su propia acción entre dos operaciones críticas de la aplicación, alterando el estado del sistema.
Un ejemplo clásico es la gestión de transacciones bancarias. Supongamos que una aplicación tiene una función para transferir dinero que sigue estos pasos:
Comprobar el saldo: Lee el saldo actual del usuario (ej: 100€).
Verificar si hay fondos suficientes: Si el saldo es mayor o igual a la cantidad a transferir (ej: 50€), se procede.
Realizar la transferencia: Se resta la cantidad del saldo del usuario.
Si un atacante hace dos solicitudes de transferencia de 50€ casi al mismo tiempo, el sistema podría comportarse de la siguiente manera:
Solicitud 1: Lee el saldo (100€) y lo verifica.
Solicitud 2: Lee el saldo (100€) y lo verifica antes de que la primera solicitud complete la operación.
Ambas solicitudes ven que hay fondos suficientes y proceden con la transferencia. El resultado final sería un saldo de -50€, ya que el sistema restó 50€ dos veces de un saldo que no había sido actualizado.
Impacto de la vulnerabilidad
El impacto de las condiciones de carrera puede ser muy grave y se extiende a múltiples dominios:
Fraude financiero: Como en el ejemplo anterior, un atacante puede retirar más fondos de los que tiene.
Escalada de privilegios: Un atacante podría, por ejemplo, iniciar una solicitud para degradar a un usuario y otra para actualizar sus propios privilegios. Si ambas se procesan simultáneamente, el sistema podría fallar en la lógica de seguridad y concederle permisos elevados.
Denegación de servicio (DoS): Un atacante podría provocar un bloqueo del sistema al explotar una condición de carrera que genere un error irrecuperable.
Cómo prevenirla
La clave para prevenir las condiciones de carrera es asegurar la atomicidad de las operaciones críticas.
Utilizar bloqueos (locks): Implementar mecanismos de bloqueo para que solo un proceso a la vez pueda acceder a un recurso o variable crítica. Esto asegura que la secuencia de verificación y ejecución sea atómica.
Usar transacciones: En bases de datos, las transacciones garantizan que una serie de operaciones se ejecuten como una sola unidad. Si una operación falla, todas las demás se revierten.
Implementar un sistema de colas (queues): Procesar las solicitudes críticas de manera secuencial, en lugar de simultánea.
Validación del estado: Antes de realizar cualquier operación crítica, verifica que el estado actual del sistema sea el esperado. Si el saldo ha cambiado desde el inicio de la operación, la transacción debe ser cancelada.