αғs*_*нιη 21 command-line find environment-variables
为什么在使用-execdir时使用 find的操作组合不安全-exec?
当我运行以下命令时,我收到以下提示消息:
/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)
Run Code Online (Sandbox Code Playgroud)
出现此提示的原因可能是什么?
Eli*_*gan 23
该-execdir操作从包含找到的文件的目录运行您的命令。当$PATH包含相对路径,例如.或任何不以 开头的内容时/,-execdir是不安全的,因为找到文件的目录(或相对于它解析的另一个目录)也可能包含与您正在尝试的文件同名的可执行文件跑步。那个可能不受信任的可执行文件将改为运行。
这可能会被其他用户故意利用,让您运行他们的程序,而不是您尝试运行的程序,这可能会造成损害或破坏数据安全。或者,在较少情况下,它可能只是导致无意中运行了错误的程序,即使没有任何人试图使问题发生。
如果一切都在你的PATH环境变量是一个绝对路径,应该不会出现这种错误,即使目录你要搜索并-execdir从荷兰国际集团被包含在PATH。(我已经检查过它是否有效。)如果您认为您没有任何相关目录$PATH但仍然收到此错误,请使用详细信息更新您的问题,包括echo "$PATH".
作为可能出错的示例,假设:
.在她身上,$PATH因为她希望能够在她想要的任何目录中运行程序cd,而不必费心在他们的名字前面加上././home/eve/shared与爱丽丝分享。.cEve 与她共享的文件的统计信息(行、字、字节)。所以爱丽丝运行:
find ~eve/shared -name \*.c -execdir wc {} \;
Run Code Online (Sandbox Code Playgroud)
不幸的是,对于 Alice 来说,Eve 创建了她自己的脚本,将其命名为wc,将其设置为可执行 ( chmod +x),并将其秘密放置在/home/eve/shared. Eve 的脚本如下所示:
find ~eve/shared -name \*.c -execdir wc {} \;
Run Code Online (Sandbox Code Playgroud)
因此,当 Alice 使用findwith在 Eve 共享的文件-execdir上运行wc,并且它到达与 Eve 的自定义wc脚本相同目录中的文件时,Eve 的wc运行 - 具有 Alice 的所有权限!
(狡猾,Eve 让她的wc脚本充当系统的包装器wc,所以 Alice 甚至不会知道出了什么问题,即do_evil运行。然而,更简单——也更复杂——变化是可能的。 )
find防止这种情况。find通过-execdir在$PATH包含相对目录时拒绝采取操作来防止发生此安全问题。
find 根据具体情况提供两种诊断信息。
如果.是 in $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在--appears$PATH并运行find与-execdir,它说:
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本质上是有风险的,无论如何最好避免。考虑上面示例中的虚构情况。假设findAlice没有运行,而是简单地cds to~eve/shared/blah并运行wc *.c。如果blah包含 Eve 的wc脚本,do_evil则以 Alice 的身份运行。
有一个更详细的信息在这里。另一个很好的参考是here。引用第一个参考文献:
选项 -execdir 是在 GNU find 中引入的一个更现代的选项,它试图创建一个更安全的 -exec 版本。它具有与 -exec 相同的语义,但有两个重要的增强:
它总是提供文件的绝对路径(在 -exec 的情况下使用文件的相对路径非常危险)。
除了提供绝对路径之外,它还检查 PATH 变量的安全性(如果 PATH 环境变量中存在点,您可以从错误的目录中提取可执行文件)
从第二个参考:
如果当前目录包含在 $PATH 环境变量中,'-execdir' 操作将拒绝执行任何操作。这是必要的,因为“-execdir”在它找到文件的同一目录中运行程序——通常,这样的目录可能由不受信任的用户写入。出于类似的原因,“-execdir”不允许在要运行的命令的名称中出现“{}”。