• [^] # Re: mkstemp / mkdtemp

    Posté par . En réponse au lien Against /tmp. Évalué à 3. Dernière modification le 26 octobre 2024 à 19:40.

    Les arguments avancés contre $$ sont en général (j'ai fait une recherche pour ne pas en oublier):

    1) Incohérences et collisions : Si un script utilise $$ pour nommer un fichier temporaire, chaque exécution aura un nom de fichier différent (car le PID change pour chaque exécution). Cela peut provoquer des incohérences si le script s'attend à retrouver ce fichier par la suite.

    -> je n'utilise pas $$ directement , je le stocke dans une variable temporaire.

    2) Sécurité et vulnérabilité aux attaques : Utiliser $$ dans le nom de fichier peut rendre le script vulnérable aux attaques par liens symboliques. Un attaquant peut deviner le PID du processus et créer un lien symbolique pointant vers Dieu sait quoi.

    -> il est vrai, mais mktemp ne protégera pas davantage (voir plus loin)

    3) Problèmes de nettoyage : Si le script ne se termine pas correctement, le fichier temporaire créé avec $$ pourrait rester sur le disque. En cas de redémarrage ou de nouvelle exécution du script, un fichier temporaire précédent pourrait être confondu avec celui de la nouvelle exécution, surtout si le PID se reproduit après un certain temps.

    -> j'efface toujours $TMP en sortie. Si par le plus grand des hasards mon script plantait, était relancé et que j'avais fait un tour du compteur des PID pour retomber sur le même nom de fichier (si j'arrive à ça, je crois que je vais tenter un loto), ma première écriture dans le fichier va le tronquer si il existait déjà (la première écriture est une redirection simple avec > ).

    Maintenant, voyons le cas de mktemp qui est censé compliquer la vie de l'attaquant et être « plus sécurisé ».

    Voici un script shell qui ne fait pas grand chose, à part créer un fichier temporaire et passer ensuite son temps à d'obscurs traitements inclusifs.

    #!/bin/bash
    TMP=$(mktemp)
    echo $TMP
    for((;;)) do sleep 1; printf '·'; done
    

    Ce qui donne:

    coriseth tmp /tmp$ ./mktemp.sh 
    /tmp/tmp.Qbx9OP740h
    ···········
    

    Mais pendant ce temps ...

    /tmp$ ps -p $(pgrep mktemp.sh) -o lstart=
    Sat Oct 26 19:08:19 2024
    /tmp$ ls -l /tmp | grep 19:08
     0 -rw------- 1 jseb jseb 0 26-10-24 19:08 tmp.Qbx9OP740h
    

    Et voilà.

    Discussions en français sur la création de jeux videos : IRC libera / #gamedev-fr