Y a-t-il un avantage à créer un fichier temporaire de manière plus prudente
Les fichiers temporaires sont généralement créés dans le répertoire temporaire (comme /tmp
) où tous les autres utilisateurs et processus ont un accès en lecture et en écriture (tout autre script peut y créer les nouveaux fichiers). Par conséquent, le script doit être prudent lors de la création des fichiers, par exemple en les utilisant avec les bonnes autorisations (par exemple, en lecture seule pour le propriétaire, voir :help umask
) et le nom du fichier ne doivent pas être facilement devinés (idéalement aléatoires). Sinon, si les noms de fichiers ne sont pas uniques, cela peut créer un conflit avec le même script exécuté plusieurs fois (par exemple, condition de concurrence) ou un attaquant pourrait soit détourner des informations sensibles (par exemple, lorsque les autorisations sont trop ouvertes et que le nom de fichier est facile à deviner) ou créer /remplacer le fichier par sa propre version du code (comme remplacer les commandes ou les requêtes SQL en fonction de ce qui est stocké).
Vous pouvez utiliser l'approche suivante pour créer le répertoire temporaire :
TMPDIR=".${0##*/}-$$" && mkdir -v "$TMPDIR"
ou fichier temporaire :
TMPFILE=".${0##*/}-$$" && touch "$TMPFILE"
Cependant, cela reste prévisible et n'est pas considéré comme sûr.
Selon man mktemp
, on peut lire :
Traditionnellement, de nombreux scripts shell prennent le nom du programme avec le pid comme suffixe et l'utilisent comme nom de fichier temporaire. Ce type de schéma de nommage est prévisible et la condition de concurrence qu'il crée est facile à gagner pour un attaquant.
Donc, pour être sûr, il est recommandé d'utiliser mktemp
commande pour créer un fichier ou un répertoire temporaire unique (-d
).
Le mktemp(1)
la page de manuel l'explique assez bien :
Traditionnellement, de nombreux scripts shell prennent le nom du programme avec le pid comme suffixe et l'utilisent comme nom de fichier temporaire. Ce type de schéma de nommage est prévisible et la condition de concurrence qu'il crée est facile à gagner pour un attaquant. Une approche plus sûre, bien que toujours inférieure, consiste à créer un répertoire temporaire en utilisant le même schéma de nommage. Bien que cela permette de garantir qu'un fichier temporaire ne sera pas corrompu, cela permet toujours une simple attaque par déni de service. Pour ces raisons, il est suggéré d'utiliser plutôt mktemp.
Dans un script, j'invoque mktemp quelque chose comme
mydir=$(mktemp -d "${TMPDIR:-/tmp/}$(basename $0).XXXXXXXXXXXX")
qui crée un répertoire temporaire dans lequel je peux travailler et dans lequel je peux nommer en toute sécurité les fichiers réels de manière lisible et utile.
mktemp
n'est pas standard, mais il existe sur de nombreuses plates-formes. Les "X" seront généralement convertis en un certain caractère aléatoire, et d'autres seront probablement plus aléatoires ; cependant, certains systèmes (busybox ash, par exemple) limitent ce caractère aléatoire plus significativement que d'autres
Soit dit en passant, la création sécurisée de fichiers temporaires est importante pour plus que le simple script shell. C'est pourquoi python a tempfile, perl a File::Temp, ruby a Tempfile, etc…
Vous voudrez peut-être regarder mktemp
L'utilitaire mktemp prend le modèle de nom de fichier donné et en écrase une partie pour créer un nom de fichier unique. Le modèle peut être n'importe quel nom de fichier avec un certain nombre de 'X' ajoutés, par exemple/tmp/tfile.XXXXXXXXXX. Les "X" à la fin sont remplacés par une combinaison du numéro de processus actuel et de lettres aléatoires.
Pour plus de détails :man mktemp
Oui, utilisez mktemp.
Il créera un fichier temporaire dans un dossier conçu pour stocker des fichiers temporaires et vous garantira un nom unique. Il affiche le nom de ce fichier :
> mktemp
/tmp/tmp.xx4mM3ePQY
>