Answers:
tmppipe=$(mktemp -u)
mkfifo -m 600 "$tmppipe"
与常规文件创建(容易被现有文件或符号链接劫持)不同,创建名称管道mkfifo
或基础函数要么在指定位置创建新文件,要么失败。这样的事情: >foo
是不安全的,因为如果攻击者可以预测其输出,mktemp
则攻击者可以为自己创建目标文件。但是mkfifo foo
在这种情况下会失败。
如果您需要完全的POSIX可移植性,mkfifo -m 600 /tmp/myfifo
则可以安全地防止劫持,但容易遭到拒绝服务;如果无法访问强随机文件名生成器,则需要管理重试尝试。
如果您不关心临时文件周围的细微安全性问题,可以遵循一个简单的规则:创建一个私有目录,并将所有内容保存在其中。
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"
trap "rm -rf '$tempdir'" EXIT HUP INT TERM
吗?陷阱可以做自己的变量扩展吗?
$tempdir
在trap
评估命令时扩展,而不是在触发陷阱时扩展。在这种情况下,它没有任何区别,只是如果代码的值tempdir
包含单引号,则代码将严重中断,而我的代码将始终有效。
$tempdir
是在本地声明的,必须全局定义它,陷阱才能对其进行访问。现在说得通...
$tempdir
值也不变,这对于所有目的都是可以接受的。请注意不要使用相同的名称来创建多个临时文件/目录...
使用“空运行”选项:
mkfifo $(mktemp -ut pipe.XXX)
-u
“不鼓励” 使用选项。
-t
,但是只要它可靠地工作,我就会同意的。
-t
建议这样做?
您可以mktemp
用来创建一个临时文件,然后将其删除并创建一个具有相同名称的命名管道。
例如:
TMPPIPE=$(mktemp -t pipe.XXX) && {
rm -f $TMPPIPE
mkfifo $TMPPIPE
}
$TMPPIPE
之前是否mkfifo
可以避免发生“不安全”问题TMPPIPE=`mktemp -u` ; mkfifo $TMPPIPE
?
mkfifo
实际上是安全的,与通常从shell创建常规文件不同。如果不是这样,创建文件然后删除它根本没有帮助(实际上,通过使攻击者不需要猜测文件名,这将极大地促进了攻击者的工作)。因此,dogbane的答案有效,但是中间文件的创建是无用的麻烦。
mktemp
手册页中称为-u
“不安全”选项的方面吗?
mktemp -d
您,仍然可以为您提供一些建议。感谢您的所有帮助,我非常感谢!
mktemp -u
在创建常规文件时是不安全的,因为它提供了防止拒绝服务的保护(如果它生成的名称足够不可预测),但不会阻止攻击者在程序的鼻子下创建文件。创建fifo而非常规文件是手册页无法解决的罕见用例。
在Unix中使用mkfifo
或,mknod
在Unix中,两个单独的进程可以按名称访问管道-一个进程可以将其作为读取器打开,而另一个进程可以作为写入器打开。
mkfifo my_pipe
gzip -9 -c < my_pipe > out.gz
cat file > my_pipe
可以像删除任何文件一样删除命名管道:
rm my_pipe
mkfifo --mode=0666 /tmp/namedPipe
gzip --stdout -d file.gz > /tmp/namedPipe
NamedPipe可以用作常规文件,只能读取一次。
mkfifo
。除了解决创建临时目录外,它没有解决我有关临时命名管道的问题mkdir
。
mktemp
解决安全创建命名管道所要解决的问题?
mktemp
结果本身创建命名管道(当然,首先删除temp文件,然后mkfifo
在该文件上运行)。 mktemp
也可以用于创建临时目录,请尝试使用-t -d
switch。