tmppipe=$(mktemp -u)
mkfifo -m 600 "$tmppipe"
Contrairement à la création régulière de fichiers, susceptible d'être détournée par un fichier existant ou un lien symbolique, la création d'un canal de nom mkfifo
ou la fonction sous - jacente crée un nouveau fichier à l'emplacement spécifié ou échoue. Quelque chose comme : >foo
n'est pas sûr car si l'attaquant peut prédire la sortie de mktemp
l'attaquant, il peut créer le fichier cible pour lui-même. Mais mkfifo foo
échouerait dans un tel scénario.
Si vous avez besoin de la pleine portabilité POSIX, mkfifo -m 600 /tmp/myfifo
est sûr contre le détournement mais enclin à un déni de service; sans accès à un puissant générateur de noms de fichiers aléatoires, vous devez gérer les tentatives de nouvelle tentative.
Si vous ne vous souciez pas des subtils problèmes de sécurité liés aux fichiers temporaires, vous pouvez suivre une règle simple: créer un répertoire privé et tout y conserver.
tmpdir=
cleanup () {
if [ -n "$tmpdir" ] ; then rm -rf "$tmpdir"; fi
if [ -n "$1" ]; then kill -$1 $$; fi
}
tmpdir=$(mktemp -d)
trap 'cleanup' EXIT
trap 'cleanup HUP' HUP
trap 'cleanup TERM' TERM
trap 'cleanup INT' INT
mkfifo "$tmpdir/pipe"
Gilles, arrête de faire le mal
la source
trap "rm -rf '$tempdir'" EXIT HUP INT TERM
? Le piège peut-il faire sa propre expansion variable?$tempdir
au moment où latrap
commande est évaluée, pas au moment où l'interruption est déclenchée. Dans ce cas, cela ne fait aucune différence, sauf que votre code casse horriblement si la valeur detempdir
contient un seul guillemet, alors que mon code fonctionne toujours.$tempdir
été déclaré localement et il doit être défini globalement pour que trap puisse y accéder. Ça a du sens maintenant ...$tempdir
valeur ne change pas non plus, ce qui est acceptable à toutes fins utiles.Une alternative plus sûre consiste à utiliser
mktemp
pour créer un répertoire en toute sécurité, puis placez votre canal nommé dans ce répertoire, faites unrm -R $dir
pour vous en débarrasser à la fin.la source
mktemp
répertoire, car c'était vraiment la seule réponse acceptable, juste au cas où vous ne l'auriez pas remarqué, @Gilles a déjà posté cette réponse en profondeur.Utilisez l'option "dry-run":
la source
-u
option "n'est pas encouragée".-t
, mais tant que cela fonctionne de manière fiable, j'irais avec.-t
c'est découragé?mkstemp()
fonction ( linux.die.net/man/3/mkstemp ). L'-t
interrupteur n'est pas découragé, c'est-p
mon mauvais.Vous pouvez utiliser
mktemp
pour créer un fichier temporaire, puis le supprimer et créer un canal nommé avec le même nom.Par exemple:
la source
$TMPPIPE
avant avantmkfifo
évite-t-elle le problème «dangereux» associéTMPPIPE=`mktemp -u` ; mkfifo $TMPPIPE
?mkfifo
est en fait sûr, contrairement à la création habituelle de fichiers à partir du shell. Si ce n'était pas le cas, créer un fichier puis le supprimer ne serait d'aucune utilité (en fait, cela faciliterait grandement le travail de l'attaquant en ne l'obligeant pas à deviner le nom du fichier). La réponse de dogbane fonctionne donc, mais la création de fichier intermédiaire est une complication inutile.mktemp
page de manuel a appelé l'-u
option «dangereux»?mktemp -d
vous avez quand même obtenu quelques points pour votre contribution. Merci pour toute votre aide, je l'apprécie vraiment!mktemp -u
n'est pas sûr lors de la création d'un fichier normal, car il offre une protection contre le déni de service (si le nom qu'il génère est suffisamment imprévisible) mais n'empêche pas un attaquant de créer le fichier sous le nez du programme. La création d'un fifo au lieu d'un fichier normal est un cas d'utilisation rare que la page de manuel ne traite pas.Utilisez
mkfifo
oumknod
sous Unix, où deux processus distincts peuvent accéder au canal par son nom - un processus peut l'ouvrir en tant que lecteur et l'autre en tant que rédacteur.Le canal nommé peut être supprimé comme n'importe quel fichier:
NamedPipe peut être utilisé dans un fichier normal pour une seule lecture.
http://www.linuxjournal.com/article/2156
la source
mkfifo
. Il ne répond pas à ma question sur les canaux nommés temporaires , pas plus qu'à lamkdir
création de répertoires temporaires.mktemp
à la création en toute sécurité d' un canal nommé?mktemp
résultat lui-même (bien sûr, en supprimant d'abord le fichier temporaire, puis en l'exécutantmkfifo
).mktemp
peut également être utilisé pour créer un répertoire temporaire, essayez avec-t -d
switch.