来自find
手册页:
-exec command ; There are unavoidable security problems surrounding use of the -exec action; you should use the -execdir option instead. -execdir command {} + Like -exec, but the specified command is run from the subdirectory containing the matched file, which is not normally the directory in which you started find. This a much more secure method for invoking commands, as it avoids race conditions during resolution of the paths to the matched files.
这是什么意思?为什么从起始目录运行它会出现竞争条件?这些安全风险如何?
答案1
找到了详细信息这里:
该
-exec
操作会导致另一个程序运行。它将当时正在考虑的文件的名称传递给程序。然后,被调用的程序通常会对该文件执行某些操作。再次,这里存在可以利用的竞争条件。我们以命令为例find /tmp -path /tmp/umsp/passwd -exec /bin/rm
在这个简单的示例中,我们仅识别一个要删除的文件并调用
/bin/rm
将其删除。存在问题是因为 find 决定需要处理操作的时间点-exec
与命令/bin/rm
实际发出 unlink() 系统调用以从文件系统中删除文件的时间点之间存在时间间隔。在此时间段内,攻击者可以重命名该/tmp/umsp
目录,将其替换为/etc
.无法/bin/rm
确定它正在处理 find 所考虑的同一个文件。一旦符号链接到位,攻击者就会说服 find 导致文件删除/etc/passwd
,这并不是实际调用的命令所预期的效果。
不确定有人可以利用这个漏洞的可能性有多大;但我想答案就在那里!
答案2
我认为之所以-exec
危险是因为如果用户不指定要执行的程序的全名和路径,则可能会执行错误的程序。
例子:
find /some/path -exec coolprogram
在 中/some/path
,有人制作了另一个coolprogram
,并将您的所有数据上传给了某个坏人。
但是等等,你说,你不需要执行它吗./coolprogram
?是的,但是有些人有PATH=.:/bin:whatever
,它会执行当前目录中的程序。
这可能是简化的,但我认为在某些情况下可能会很危险。有一次,我必须解决一个零字节cpio
出现在错误目录中的问题。它导致程序崩溃,因为cpio
它在目录中运行零字节文件时无法工作。