La posibilidad de este ataque no es algo inevitable en el uso de archivos temporales. Se deriva de una implementación insegura de archivos temporales.
Por ejemplo, en un sistema Unix, se puede abrir un agujero si el directorio del archivo temporal tiene permisos incorrectos. El directorio /tmp
es compartido por los usuarios, por lo que todos tienen permiso de escritura en el propio directorio (para poder crear archivos). Pero se aplica un permiso especial de "bit pegajoso" que evita que los usuarios puedan eliminar archivos que no son de su propiedad. Si falta ese bit de permiso, es posible que un proceso malintencionado cree un ataque de condición de carrera: advierte que se acaba de crear un archivo temporal y, antes de que el proceso de propiedad pueda usarlo, lo elimina y lo reemplaza con su propia (Las aplicaciones podrían verificar la propiedad y los permisos del archivo temporal que acaban de abrir, pero probablemente no molesten, si es que los hay, porque los programas confían en que el directorio temporal está configurado correctamente).
Si se crea un archivo temporal con permisos incorrectos, se puede acceder y manipularlo. Los programas que utilizan archivos temporales deben crearlos con los permisos apropiados. Esto significa que ciertas funciones de manipulación de archivos altamente independientes de la plataforma no se pueden usar. Por ejemplo, si usamos la función C fopen
para crear un archivo temporal, tenemos un agujero de seguridad, porque fopen
no tiene ningún parámetro para controlar qué permisos tendrá el archivo. En un sistema similar a Unix, creará un archivo con permisos liberales (menos solo los permisos eliminados por umask
). Las funciones de biblioteca específicas de la plataforma se deben usar para crear y abrir archivos temporales.
Un programa, cuando crea un archivo temporal, siempre verifica si ese archivo no existe ya. Sin embargo, esta comprobación debe ser atómica, de lo contrario, existe una condición de carrera entre la comprobación de que el archivo no existe y la apertura / creación del archivo. Esa condición de carrera no se arregla con los permisos correctos en el directorio temporal. Se arregla utilizando una operación atómica para crear el archivo. En Unix, el indicador O_EXCL
se usa además de O_CREAT
para pedirle al sistema operativo que falle en la llamada open
si el archivo ya existe, de lo contrario, para crearlo. Un posible pitall aquí es alojar el directorio de archivos temporales en algún sistema de archivos de red que no respeta la semántica atómica de O_EXCL
.
Por supuesto, los archivos temporales no están protegidos contra ataques desde el mismo contexto de seguridad. (Al menos, no sin la implementación de políticas de seguridad detalladas en el sistema operativo). Si un programa malintencionado se ejecuta como usuario joe
aleady, ese programa puede atacar archivos temporales creados por programas que se ejecutan como usuario joe
. Para evitar ese tipo de cosas, necesita un esquema de seguridad que sea más detallado que los simples dominios de seguridad basados en cuentas. Por ejemplo, un sistema de seguridad con reglas como: "solo el ejecutable /bin/foo
puede acceder a cualquier objeto del sistema de archivos cuya ruta coincida con el patrón /tmp/foo*
".