Estaba leyendo: https://en.wikipedia.org/wiki/Time-of-check_to_time-of-use
Mostraron que este código tiene errores y entiendo perfectamente por qué es así:
if (access("file", W_OK) != 0) { exit(1); } // Attacker: symlink("/etc/passwd", "file"); fd = open("file", O_WRONLY); // Actually writing over /etc/passwd write(fd, buffer, sizeof(buffer));Pero la verdadera pregunta es cómo protegerse contra este tipo de exploits.
Puede usar el indicador O_NOFOLLOW . Hará que la open falle si el basename de la ruta es un enlace simbólico. Eso solucionaría el ataque descrito.
Para cubrir los enlaces a lo largo de la ruta del directorio, puede verificar si frealpath(fd, ...) coincide con lo que esperaría.
Otra forma de evitar que un proceso sobrescriba /etc/passwd es ejecutarlo como no root para que no tenga permiso. O bien, puede usar chroot, o más generalmente, un contenedor, para evitar que el sistema /etc/passwd del sistema host sea visible para el proceso.
Sin embargo, de manera más general, el sistema de archivos TOCTOU no se puede resolver en este momento en Linux. Necesitaría soporte de transacciones en el sistema de archivos o en el nivel de llamada del sistema, que faltan.
No existe una solución infalible.
Tenga en cuenta también el teorema de Rice . Podría ser relevante.
Pero podría adoptar una convención de todo el sistema (y documentarla) de que cada programa que accede a un archivo determinado utiliza funciones de bloqueo como flock(2) .