Glosario

Qué es TOCTOU: cuando el estado cambia entre la comprobación y el uso

TOCTOU (time-of-check to time-of-use) es una condición de carrera en la que el estado cambia después de una comprobación. Cómo funciona y cómo defenderse: combinar la comprobación y el uso en un solo paso.

Publicado 2026-11-15 Actualizado 2026-11-15 6 min de lectura
En esta página

TOCTOU (time-of-check to time-of-use) es un problema en el que el estado de algo cambia entre el momento en que se comprueba y el momento en que se usa. Esta página explica cómo funciona y cómo prevenirlo (sin pasos de ataque).

Qué es TOCTOU

Los programas suelen funcionar como «comprobar y, si parece correcto, usar»: por ejemplo, «comprobar que este archivo puede escribirse y luego abrirlo y escribir en él». Pero existe un pequeño intervalo de tiempo entre la comprobación y el uso. Si otro programa o solicitud cambia el objetivo en ese intervalo, el resultado de la comprobación deja de ser válido.

El CWE-367 de MITRE describe esto como un producto que comprueba el estado de un recurso antes de usarlo, donde el estado puede cambiar entre la comprobación y el uso de forma que invalide la comprobación. CWE (Common Weakness Enumeration) es un catálogo compartido de las debilidades que están detrás de las vulnerabilidades. TOCTOU es un tipo de condición de carrera, en la que el resultado depende del orden temporal de procesos que se ejecutan al mismo tiempo.

Por qué ocurre

1. Comprobación: ¿se puede escribir este archivo? → OK
2. Intervalo: otro proceso reemplaza aquello a lo que apunta ese nombre
↓ el resultado de la comprobación ya no coincide con la realidad
3. Uso: el programa escribe en un objetivo que nunca comprobó
Cuando la comprobación y el uso son pasos separados, el objetivo puede cambiarse en medio y el resultado de la comprobación queda desactualizado.

Según el CWE-367, las consecuencias pueden incluir el acceso a recursos que deberían estar fuera de alcance, recursos modificados de forma no deseada y registros que faltan. El intervalo puede ser breve, pero en sistemas que ejecutan muchas tareas a la vez se produce de forma repetida, no solo por casualidad.

Dónde aparece

LugarComprobaciónUsoQué sale mal
Manejo de archivosComprobación de existencia o permisosAbrir o escribirEl archivo se reemplaza después de la comprobación
Stock o saldo en una aplicación webSELECT del número restanteUPDATE para reducirloDos solicitudes concurrentes pasan ambas y superan el límite
Pagos y registros¿Sigue sin procesarse?Ejecutar la acciónUn doble envío la ejecuta dos veces
Subida de archivosInspeccionar el contenidoAlmacenar o publicarEl contenido cambia después de la inspección

Para la inspección de subidas, consulta también vulnerabilidades de subida de archivos.

Defensa: no separes la comprobación del uso

1

Deja de comprobar antes de usar

El consejo más básico del CWE-367 es no realizar una comprobación antes del uso. Usa el recurso directamente y gestiona el error si falla. Así se elimina el propio intervalo.

2

Usa descriptores de archivo, no rutas

Abre primero el archivo y luego comprueba el estado y escribe a través del descriptor de archivo abierto. Buscar repetidamente el mismo nombre de ruta puede apuntar a un objetivo distinto cada vez. Las banderas como O_NOFOLLOW (no seguir enlaces simbólicos) y las llamadas como openat (abrir relativo a un directorio) también ayudan; lo que está disponible depende del sistema operativo.

3

Usa actualizaciones condicionales y transacciones en bases de datos

En lugar de «SELECT para comprobar y luego UPDATE», usa un solo UPDATE que incluya la condición (por ejemplo, decrementar solo cuando el número sea 1 o mayor). Cuando intervienen varias sentencias, usa una transacción con un nivel de aislamiento adecuado y bloqueos de fila.

4

Bloquea antes de comprobar

Si usas bloqueos, tómalos antes de la comprobación, como indica el CWE-367. Bloquear después no garantiza que el objetivo comprobado sea el que usas.

5

Evita la doble ejecución con claves de idempotencia

En pagos y registros, asigna a cada solicitud una clave única (una clave de idempotencia) y ejecuta la acción solo una vez por clave.

Cómo revisar tu propio código

Hazlo en código que construyas o gestiones tú.

  1. Busca lugares donde el código que comprueba y el código que usa son llamadas separadas (comprobación de existencia y luego apertura; SELECT y luego UPDATE)
  2. En cada caso, pregúntate si puedes eliminar la comprobación y convertir el paso en una sola operación
  3. Escribe una prueba que envíe la misma solicitud varias veces a la vez, y confirma que solo se aplica una
  4. No pruebes esto nunca contra el servicio de otra persona; usa tu propio entorno

Opinión de este sitio: pon la comprobación dentro de la misma operación que el uso

TOCTOU no es que «alguien olvidó la comprobación». La comprobación existe; simplemente está separada del uso. Añadir más código de comprobación no lo soluciona. La solución es poner la comprobación dentro de la misma operación atómica que el uso, en lugar de añadirla como un paso extra. Estudiarlo junto a IDOR ayuda en las revisiones: ambos son errores en los que «existe una comprobación, pero no cumple su función».

Fuentes (primarias)

  • MITRE CWE-367: Time-of-check Time-of-use (TOCTOU) Race Condition — cwe.mitre.org (definición, consecuencias, mitigaciones)
  • Las técnicas concretas (O_NOFOLLOW, openat, claves de idempotencia, transacciones) se describen como práctica general de implementación; su disponibilidad varía según el sistema operativo y la base de datos, así que consulta la documentación oficial de cada producto

Lectura siguiente

Clasificación

CWE clasifica los tipos de debilidad que causan las vulnerabilidades; MITRE ATT&CK clasifica las técnicas de los atacantes. Ambos los mantiene MITRE y se usan ampliamente para etiquetar vulnerabilidades y reglas de detección.

CWE™: Copyright © 2006–2026, The MITRE Corporation. CWE is a trademark of The MITRE Corporation. The MITRE Corporation hereby grants you a non-exclusive, royalty-free license to use CWE for research, development, and commercial purposes. Any copy you make for such purposes is authorized on the condition that you reproduce MITRE’s copyright designation and this license in any such copy. CWE Terms of Use

FAQ

Q¿Qué significa TOCTOU?
A

Son las siglas de time-of-check to time-of-use (tiempo de comprobación a tiempo de uso). El estado de un recurso cambia entre el momento en que se comprueba y el momento en que se usa. El CWE-367 de MITRE lo describe como un producto que comprueba el estado de un recurso antes de usarlo, donde el estado puede cambiar de forma que invalide la comprobación. Es un tipo de condición de carrera.

Q¿Dónde ocurre TOCTOU?
A

El caso clásico es el manejo de archivos: un programa comprueba si un archivo existe o si puede escribirse, y luego lo abre en una llamada separada, y el archivo puede ser reemplazado en medio. También ocurre en aplicaciones web y bases de datos, como «comprobar el stock y luego confirmar el pedido» o «comprobar el saldo y luego descontar», cuando la comprobación y la actualización son pasos separados.

Q¿Cuál es la defensa principal?
A

Combinar la comprobación y el uso en una sola operación atómica. El CWE-367 indica que el consejo más básico es no realizar una comprobación antes del uso. En archivos, abre primero y luego inspecciona o actúa sobre el descriptor de archivo abierto. En bases de datos, usa una actualización condicional o una transacción con bloqueo.

Q¿Añadir un bloqueo siempre lo hace seguro?
A

El bloqueo debe tomarse antes de la comprobación, no después. El CWE-367 indica que hay que asegurar que el bloqueo ocurra antes de la comprobación, y no después. Bloquear después de la comprobación no garantiza que lo que se comprobó sea lo que se usa. Además, un bloqueo no sirve de nada si su alcance es demasiado estrecho o si otros programas lo ignoran.

Q¿TOCTOU afecta a las aplicaciones web?
A

Sí. Algunos ejemplos son guardar un archivo subido después de haberlo inspeccionado, decrementar un cupón o el número de unidades de stock después de leerlo, y manejadores de pagos que no deben ejecutarse dos veces. Si la misma solicitud llega dos veces a la vez, ambas pueden superar la comprobación. Haz que la actualización sea una sola operación condicional y usa claves de idempotencia para evitar la ejecución duplicada.

Q¿Cómo busco TOCTOU en mi propio código?
A

Busca lugares donde el código que comprueba y el código que usa están en líneas o llamadas separadas. En código de archivos, eso es una comprobación de existencia o permisos seguida de una apertura por ruta. En código de bases de datos, es un SELECT para comprobar seguido de un UPDATE. Después, valora si puedes eliminar la comprobación y hacerlo todo en una sola operación, y añade pruebas con solicitudes concurrentes.