En el desarrollo de software , el problema de tiempo de verificación a tiempo de uso ( TOCTOU , TOCTTOU o TOC/TOU ) es una clase de errores de software causados por una condición de carrera que implica la verificación del estado de una parte de un sistema (como una credencial de seguridad) y el uso de los resultados de esa verificación.
Las condiciones de carrera TOCTOU son comunes en Unix entre operaciones en el sistema de archivos , [ 1 ] pero pueden ocurrir en otros contextos, incluidos los sockets locales y el uso indebido de transacciones de base de datos . A principios de la década de 1990, la utilidad de correo de BSD 4.3 UNIX tenía una condición de carrera explotable para archivos temporales porque usaba la función mktemp()[ 2 ] . [ 3 ] Las primeras versiones de OpenSSH tenían una condición de carrera explotable para sockets de dominio Unix . [ 4 ] Siguen siendo un problema en los sistemas modernos; a partir de 2019, una condición de carrera TOCTOU en Docker permite el acceso de root al sistema de archivos de la plataforma host. [ 5 ] En la competencia Pwn2Own 2023 en Vancouver, un equipo de hackers pudo comprometer la puerta de enlace en un Tesla Model 3 actualizado usando este error. [ 6 ] En 2025, una condición de carrera TOCTOU en el sistema de administración DNS de Amazon Web Services para DynamoDB causó una interrupción importante en toda la región US-EAST-1. El incidente se originó por la aplicación de planes DNS obsoletos después de que se hubieran eliminado los más recientes, lo que provocó la eliminación de direcciones IP de los puntos finales y una falla generalizada del servicio. [ 7 ]
Descripción
Un programa es vulnerable a una condición de carrera TOCTOU si hace lo siguiente:
- Comprueba alguna propiedad o valida algunos datos.
- Toma medidas basándose en esta información.
y los siguientes son los casos
- No atómico: Es posible que otros programas que se ejecutan simultáneamente con este programa se ejecuten entre los pasos 1 y 2.
- Control externo: Otros programas pueden cambiar la propiedad o los datos.
Si, por otro motivo, otro proceso modifica la propiedad entre el paso 1 y el paso 2, el paso 2 se realizará con información desactualizada, lo que puede tener consecuencias no deseadas.
Si el programa en ejecución tiene privilegios y un proceso sin privilegios puede afectar a la propiedad, puede ejecutar de hecho ciertas tareas privilegiadas.
En particular, si la propiedad comprueba si se permite alguna acción y, por lo tanto, implementa un límite de seguridad, como una comprobación de permisos, esta comprobación de permisos puede eludirse por completo y se pueden ejecutar de esta manera diversas acciones privilegiadas ( escalada de privilegios ).
Ejemplos
En Unix , el siguiente código C , cuando se utiliza en un setuidprograma, tiene un error TOCTOU:
if ( access ( "file" , W_OK ) != 0 ) {salir ( 1 );}fd = abrir ( "archivo" , O_WRONLY );escribir ( fd , buffer , sizeof ( buffer ));Aquí, el acceso tiene como objetivo comprobar si el usuario real que ejecutó el setuidprograma normalmente tendría permiso para escribir en el archivo (es decir, accesscomprueba el ID de usuario real en lugar del ID de usuario efectivo ).
Esta condición de carrera es vulnerable a un ataque:
En este ejemplo, un atacante puede explotar la condición de carrera entre accessy openpara engañar a la setuidvíctima y lograr que sobrescriba una entrada en la base de datos de contraseñas del sistema. Las condiciones de carrera TOCTOU pueden utilizarse para la escalada de privilegios y así obtener acceso administrativo a una máquina.
Si bien esta secuencia de eventos requiere una sincronización precisa, un atacante puede crear tales condiciones sin demasiada dificultad.
Esto implica que las aplicaciones no pueden asumir que el estado gestionado por el sistema operativo (en este caso, el espacio de nombres del sistema de archivos) no cambiará entre las llamadas al sistema.
Sincronización fiable de TOCTOU
Para explotar una condición de carrera TOCTOU se requiere una sincronización precisa para asegurar que las operaciones del atacante se intercalen correctamente con las de la víctima. En el ejemplo anterior, el atacante debe ejecutar la symlinkllamada al sistema precisamente entre accessy open. Para el ataque más general, el atacante debe programarse para ejecutarse después de cada operación de la víctima, también conocido como "ejecución paso a paso" de la víctima.
En el caso de la utilidad de correo de BSD 4.3 y mktemp(), [ 2 ] el atacante puede simplemente seguir ejecutando la utilidad de correo en un proceso, seguir adivinando los nombres de los archivos temporales y seguir creando enlaces simbólicos en otro proceso. El ataque suele tener éxito en menos de un minuto.
Las técnicas para ejecutar paso a paso un programa víctima incluyen laberintos del sistema de archivos [ 8 ] y ataques de complejidad algorítmica [ 9 ] . En ambos casos, el atacante manipula el estado del sistema operativo para controlar la planificación de la víctima.
Los laberintos del sistema de archivos obligan a la víctima a leer una entrada de directorio que no está en la caché del sistema operativo, y este la pone en estado de suspensión mientras lee el directorio del disco. Los ataques de complejidad algorítmica obligan a la víctima a dedicar todo su tiempo de ejecución a una única llamada al sistema que recorre la tabla hash del kernel con los nombres de archivo almacenados en caché. El atacante crea un gran número de archivos cuyos nombres tienen el mismo valor hash que el archivo que la víctima intentará buscar.
Previniendo TOCTOU
A pesar de su simplicidad conceptual, las condiciones de carrera TOCTOU son difíciles de evitar y eliminar. Una técnica general consiste en utilizar el manejo de errores en lugar de la verificación previa, siguiendo la filosofía de EAFP («Es más fácil pedir perdón que permiso») en vez de LBYL («Piensa antes de actuar»). En este caso, no hay verificación y el incumplimiento de las suposiciones se señala mediante la devolución de un error. [ 10 ]
En el contexto de las condiciones de carrera TOCTOU del sistema de archivos, el desafío fundamental es asegurar que el sistema de archivos no pueda modificarse entre dos llamadas al sistema. En 2004, se publicó un resultado de imposibilidad que demostraba que no existía una técnica portable y determinista para evitar las condiciones de carrera TOCTOU al utilizar las llamadas de Unix accessy opendel sistema de archivos. [ 11 ]
Desde este resultado de imposibilidad, los investigadores han propuesto bibliotecas para rastrear descriptores de archivos y garantizar su corrección. [ 12 ]
Una solución alternativa propuesta en la comunidad de investigación es que los sistemas Unix adopten transacciones en el sistema de archivos o en el núcleo del sistema operativo. Las transacciones proporcionan una abstracción de control de concurrencia para el sistema operativo y pueden utilizarse para prevenir condiciones de carrera TOCTOU. Si bien ningún núcleo Unix de producción ha adoptado aún transacciones, se han desarrollado prototipos de investigación de prueba de concepto para Linux, incluido el sistema de archivos Valor [ 13 ] y el núcleo TxOS. [ 14 ] Microsoft Windows ha añadido transacciones a su sistema de archivos NTFS , [ 15 ] pero Microsoft desaconseja su uso y ha indicado que podrían eliminarse en una futura versión de Windows. [ 16 ]
El bloqueo de archivos es una técnica común para prevenir condiciones de carrera en un solo archivo, pero no se extiende al espacio de nombres del sistema de archivos ni a otros metadatos, ni funciona bien con sistemas de archivos en red, y no puede prevenir condiciones de carrera TOCTOU.
Para setuidlos binarios, una posible solución es usar la seteuid()llamada al sistema para cambiar el usuario efectivo y luego realizar la open()llamada. Las diferencias setuid()entre sistemas operativos pueden ser problemáticas. [ 17 ]
Consecuencias en el mundo real
Las vulnerabilidades de TOCTOU han provocado interrupciones significativas en sistemas a gran escala. En octubre de 2025, AWS sufrió una interrupción importante debido a una condición de carrera en su sistema de gestión DNS para DynamoDB. El incidente consistió en la aplicación de planes DNS obsoletos después de que se hubieran eliminado los más recientes, lo que provocó la eliminación de direcciones IP de los puntos finales y un fallo generalizado del servicio. [ 18 ]
Véase también
Referencias
- ^ Wei, Jinpeng; Pu, Calton (diciembre de 2005). "Vulnerabilidades TOCTTOU en sistemas de archivos de estilo UNIX: un estudio anatómico" . USENIX . Recuperado el 14 de enero de 2019 .
- ^ a b "mktemp(3)" . Página del manual de Linux . 15-09-2017.
- ^ Shangde Zhou (周尚德) (1 de octubre de 1991). "Una laguna de seguridad en Unix" .
{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace ) - ^ Acheson, Steve (1999-11-04). "Preguntas frecuentes sobre Secure Shell (SSH)" . Archivado del original el 13 de febrero de 2017.
- ^ "Un fallo de Docker permite el acceso de root al sistema de archivos del host" . Decipher . Duo Security. 28 de mayo de 2019. Consultado el 29 de mayo de 2019 .
- ^ "Windows 11, Tesla, Ubuntu y macOS hackeados en Pwn2Own 2023" . BleepingComputer . Consultado el 24 de marzo de 2023 .
- ^ "Evento de servicio de AWS en la región US-EAST-1" . Amazon Web Services . 27 de octubre de 2025. Consultado el 30 de octubre de 2025 .
- ^ Borisov, Nikita; Johnson, Rob; Sastry, Naveen; Wagner, David (agosto de 2005). "Manipulación de carreras por diversión y lucro: cómo abusar de un tiempo". Actas de la 14.ª Conferencia sobre el Simposio de Seguridad de USENIX . 14. Baltimore, MD: USENIX Association: 303–314 . CiteSeerX 10.1.1.117.7757 .
- ^ Xiang Cai; Yuwei Gui; Johnson, Rob (mayo de 2009). "Explotación de las condiciones de carrera del sistema de archivos Unix mediante ataques de complejidad algorítmica" (PDF) . 30.º Simposio IEEE de Seguridad y Privacidad de 2009. Berkeley, CA: IEEE Computer Society. págs. 27-41 . doi : 10.1109/SP.2009.10 . ISBN 978-0-7695-3633-0. S2CID 6393789 . Archivado del original (PDF) el 18-05-2021.
- ^ Martelli, Alex (2006). «Capítulo 6: Excepciones». Python en pocas palabras (2.ª ed.). O'Reilly Media . pág. 134. ISBN 978-0-596-10046-9.
- ^ Dean, Drew; Hu, Alan J. (agosto de 2004). "Arreglando carreras por diversión y lucro: cómo usar access(2)". Actas del 13.º Simposio de Seguridad de USENIX . San Diego, CA): 195–206 . CiteSeerX 10.1.1.83.8647 .
- ^ Tsafrir, Dan; Hertz, Tomer; Wagner, David; Da Silva, Dilma (junio de 2008). "Prevención portátil de ataques de carrera de archivos con resolución de ruta en modo de usuario" . Informe técnico RC24572, Centro de investigación IBM TJ Watson . Yorktown Heights, NY.
- ^ Spillane, Richard P.; Gaikwad, Sachin; Chinni, Manjunath; Zadok, Erez (24-27 de febrero de 2009). "Habilitación del acceso transaccional a archivos mediante extensiones ligeras del kernel" (PDF) . Séptima Conferencia USENIX sobre Tecnologías de Archivos y Almacenamiento (FAST 2009) . San Francisco, CA.
- ^ Porter, Donald E.; Hofmann, Owen S.; Rossbach, Christopher J.; Benn, Alexander; Witchel, Emmett (11-14 de octubre de 2009). "Operating System Transactions" (PDF) . Actas del 22.º Simposio ACM sobre Principios de Sistemas Operativos (SOSP '09) . Big Sky, MT.
- ^ Russinovich, Mark; Solomon, David A. Windows Internals . Microsoft Press . ISBN 978-0735648739.
- ^ "Alternativas al uso de NTFS transaccional" . Microsoft Developer Network . Archivado del original el 29 de septiembre de 2022. Consultado el 10 de diciembre de 2015 .
- ^ Hao Chen; Wagner, David; Dean, Drew (12 de mayo de 2002). "Setuid desmitificado" (PDF) .
- ^ "Evento de servicio de AWS en la región US-EAST-1" . Amazon Web Services . 27 de octubre de 2025. Consultado el 30 de octubre de 2025 .
Lecturas adicionales
- Bishop, Matt; Dilger, Michael (1996). "Comprobación de condiciones de carrera en accesos a archivos" (PDF) . Computing Systems . pp. 131–152 .
- Tsafrir, Dan; Hertz, Tomer; Wagner, David; Da Silva, Dilma (2008). "Resolución portátil de problemas de competencia TOCTTOU de archivos con amplificación de la dificultad" (PDF) . Actas de la 6.ª Conferencia USENIX sobre Tecnologías de Archivos y Almacenamiento (FAST '08), San José (CA), 26-29 de febrero de 2008. págs. 189-206 .
- vulnerabilidades de seguridad informática
- Errores de software