为什么使用’-execdir’操作对于PATH中的目录是不安全的?
为什么在使用-exec
时使用find的-execdir
动作组合是不安全的?
当我运行以下命令时,我收到以下提示消息:
/path/to/currentDir/$ find . -type f -name 'partOfFileNames*' -execdir rm -- {} + find: The current directory is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove the current directory from your $PATH (that is, remove "." or leading or trailing colons)
什么可能导致这个提示出现?
你可以运行错误的程序。 有人可以让你运行他们的程序。
-execdir
操作从包含找到的文件的目录运行您的命令。 当$PATH
包含相对路径时,例如.
或者任何不以/
-execdir
内容, -execdir
是不安全的,因为找到文件的目录(或相对于它解析的另一个目录)也可能包含与您尝试运行的目录同名的可执行文件。 然后,可能会运行该可能不受信任的可执行文件。
这可能被另一个用户故意利用,导致您运行他们的程序,这可能会造成伤害或破坏数据安全性,而不是您尝试运行的程序。 或者,通常情况下,即使没有任何人试图解决问题,也可能导致错误的程序无意中被运行。
如果PATH
环境变量中的所有内容都是绝对路径,则不应发生此错误,即使您正在搜索和-execdir
的目录包含在PATH
。 (我已经检查过这是否有效。)如果您认为$PATH
没有任何相关目录但仍然出现此错误,请更新您的问题,包括echo "$PATH"
的输出。
一个具体的例子。
作为可能出错的一个例子,假设:
- 爱丽丝
.
在她的$PATH
因为她希望能够在任何她想要的目录中运行程序,而无需在./
其名称。 - Alice的frenemy Eve与Alice共享
/home/eve/shared
sharing。 - Alice想要与她共享的
.c
文件中的统计信息(行,单词,字节)。
所以Alice跑:
find ~eve/shared -name \*.c -execdir wc {} \;
不幸的是,对于Alice,Eve创建了自己的脚本,将其命名为wc
,将其设置为可执行文件( chmod +x
),并将其秘密地放置在/home/eve/shared
下的一个目录中。 Eve的脚本如下所示:
#!/bin/sh /usr/bin/wc "$@" do_evil # Eve replaces this command with whatver evil she wishes to do
因此,当Alice使用find
with -execdir
在Eve共享的文件上运行wc
,并且它到达与Eve的自定义wc
脚本相同的目录中的文件时,Eve的wc
运行 – 具有Alice的所有权限!
(狡猾,Eve已经让她的wc
脚本充当了系统wc
的包装器,所以Alice甚至不知道出现了什么问题,即do_evil
已经运行。但是,更简单 – 也更复杂 – 变化是可能的。)
如何防止这种情况。
当$PATH
包含相对目录时,拒绝接受-execdir
操作,以防止发生此安全问题 。
find
根据具体情况提供两条诊断消息。
-
如果
.
在$PATH
,然后(正如你所见)它说:find: The current directory is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove the current directory from your $PATH (that is, remove "." or leading or trailing colons)
它可能有一个特殊的信息
.
因为它特别常见。 -
如果是相对路径以外的
.
–say,foo
出现在$PATH
,你用-execdir
运行find
,它说:find: The relative path ` foo ' is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove that entry from $PATH
最好不要在$PATH
中拥有相对路径。
有风险.
或者当使用自动更改目录的实用程序时, $PATH
其他相对路径会特别高,这就是为什么在这种情况下find
不会让你使用-execdir
。
但是有相对的路径,特别是.
,在你的$PATH
本身存在风险,无论如何最好避免。 考虑上面例子中的虚构情况。 假设不是运行find
,而是简单地将cd
转到~eve/shared/blah
并运行wc *.c
。 如果blah
包含Eve的wc
脚本, do_evil
将以Alice do_evil
运行。
这里有详细的信息。 另一个很好的参考是这里 。 引用第一个参考:
选项-execdir是GNU中引入的更现代的选项find是尝试创建更安全的-exec版本。 它具有与-exec相同的语义,具有两个重要的增强function:
它始终提供文件的绝对路径(在-exec的情况下,使用文件的相对路径非常危险)。
除了提供绝对路径之外,它还检查PATH变量的安全性(如果PATH env变量中存在点,则可以从错误的目录中拾取可执行文件)
从第二次参考:
如果当前目录包含在$ PATH环境变量中,则“-execdir”操作拒绝执行任何操作。 这是必要的,因为’-execdir’在找到文件的同一目录中运行程序 – 通常,这样的目录可能是不受信任的用户可写的。 出于类似的原因,’ – execdir’不允许'{}’出现在要运行的命令的名称中。
主要问题是系统变量PATH
的值,其中包含相关文件夹,因此出于安全原因, find
命令不允许您执行二进制文件,因为它可能会执行错误的程序。
因此,例如,如果您根据警告得到PATH中的当前目录:
当前目录包含在PATH环境变量中。
你将运行你的命令:
find . -type f -name 'partOfFileNames*' -execdir rm -- {} +
如果您将拥有包含rm -fr /
本地脚本(带有可执行标志的rm -fr /
),它可以删除所有文件,因为您不会执行rm
/bin/rm
,而是从当前目录执行rm
,所以可能这不是你想要的。
作为附注,这是Travis CI( GH#2811 )中的已知问题,当它因错误而失败时:
find:相对路径`./node_modules/.bin’包含在PATH环境变量中,与find的-execdir动作结合使用是不安全的。 请从$ PATH中删除该条目
因此,解决方案是从PATH变量中删除受影响的条目,例如
PATH=`echo $PATH | sed -e 's/:\.\/node_modules\/\.bin//'`
正如drogus提出的那样 。 GH#4862可以遵循这个bug的进展。