为什么使用’-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的进展。