tmppipe=$(mktemp -u)
mkfifo -m 600 "$tmppipe"
A diferencia de la creación normal de archivos, que es propensa a ser secuestrada por un archivo existente o un enlace simbólico, la creación de un canal de nombre a través de mkfifo
o la función subyacente crea un nuevo archivo en el lugar especificado o falla. Algo así como : >foo
no es seguro porque si el atacante puede predecir la salida de mktemp
entonces el atacante puede crear el archivo de destino por sí mismo. Pero mkfifo foo
fallaría en tal escenario.
Si necesita portabilidad POSIX completa, mkfifo -m 600 /tmp/myfifo
es seguro contra el secuestro pero propenso a una denegación de servicio; sin acceso a un generador seguro de nombres de archivos aleatorios, deberá administrar los intentos de reintento.
Si no le importan los sutiles problemas de seguridad relacionados con los archivos temporales, puede seguir una regla simple:cree un directorio privado y guarde todo allí.
tmpdir=
cleanup () {
trap - EXIT
if [ -n "$tmpdir" ] ; then rm -rf "$tmpdir"; fi
if [ -n "$1" ]; then trap - $1; kill -$1 $$; fi
}
tmpdir=$(mktemp -d)
trap 'cleanup' EXIT
trap 'cleanup HUP' HUP
trap 'cleanup TERM' TERM
trap 'cleanup INT' INT
mkfifo "$tmpdir/pipe"
Una alternativa más segura es usar mktemp
para crear un directorio de forma segura, luego coloque su tubería con nombre dentro de ese directorio, haga un rm -R $dir
para deshacerse de él al final.
Utilice la opción de "ejecución en seco":
mkfifo $(mktemp -ut pipe.XXX)