Mastodon Mastodon Mastodon Mastodon

Condición de carrera

Actualizado: · CyberSecureFox Editorial Team

Una condición de carrera (race condition) es un fallo en el que el resultado de un programa depende del orden de operaciones simultáneas, lo que permite a un atacante colarse entre una comprobación y la acción que depende de ella.

Cómo surge una condición de carrera

El software moderno hace muchas cosas en paralelo: hilos, procesos y peticiones comparten archivos, memoria y registros de bases de datos. Si el código primero comprueba algo y después actúa en dos pasos separados, el estado puede cambiar entre ambos. Este patrón clásico se llama TOCTOU (time-of-check to time-of-use, CWE-367); la debilidad general es CWE-362.

Ejemplos:

  • Un programa con privilegios comprueba que un archivo es seguro y luego lo abre, pero entretanto el atacante lo sustituye por un enlace simbólico a un archivo del sistema.
  • Una tienda online comprueba que una tarjeta regalo no se ha usado y luego la canjea; enviar muchas peticiones a la vez permite canjearla varias veces («limit overrun»).
  • En el kernel, dos hilos liberan o modifican el mismo objeto y corrompen la memoria, por ejemplo con un use-after-free.

Por qué es importante

Las condiciones de carrera son difíciles de encontrar en las pruebas porque solo aparecen con una sincronización concreta, pero los atacantes pueden provocarlas de forma fiable repitiendo intentos. El fallo Dirty COW del kernel de Linux (CVE-2016-5195) permitía a cualquier usuario local obtener privilegios de root mediante una condición de carrera en la gestión de memoria y se explotó en ataques reales, también en Android. Muchas vulnerabilidades locales de escalada de privilegios en Windows y Linux son condiciones de carrera, y en aplicaciones web permiten fraudes económicos. Junto con los desbordamientos de búfer, figuran entre las clases de vulnerabilidades más técnicas.

Cómo prevenirlas

  • Usar operaciones atómicas, bloqueos y transacciones de base de datos con restricciones adecuadas.
  • Evitar pasos separados de «comprobar y usar» con archivos; trabajar con descriptores en lugar de rutas.
  • Hacer idempotentes las operaciones web sensibles y limitar la frecuencia de peticiones.
  • Probar con herramientas de concurrencia, fuzzers y thread sanitizers.
Sinónimos:
race condition