AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 621132
Accepted
αғsнιη
αғsнιη
Asked: 2015-05-09 07:26:40 +0800 CST2015-05-09 07:26:40 +0800 CST 2015-05-09 07:26:40 +0800 CST

为什么对 PATH 中的目录使用“-execdir”操作不安全?

  • 772

-execdir为什么在使用 isn't的同时使用 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)

什么可能导致出现此提示?

command-line
  • 5 5 个回答
  • 11943 Views

5 个回答

  • Voted
  1. Best Answer
    Eliah Kagan
    2015-05-09T08:55:42+08:002015-05-09T08:55:42+08:00

    您可能会运行错误的程序。有人可以让你运行他们的程序。

    该-execdir操作从包含找到的文件的目录运行您的命令。当$PATH包含相对路径(例如.或任何不以 开头的内容/)时,-execdir是不安全的,因为找到文件的目录(或相对于它解析的另一个目录)也可能包含与您尝试的文件同名的可执行文件跑步。然后将运行该可能不受信任的可执行文件。

    这可能会被其他用户故意利用,让您运行他们的程序,而不是您尝试运行的程序,这可能会造成危害或破坏数据安全。或者,在少数情况下,它可能只是导致无意中运行了错误的程序,即使没有人试图让问题发生。

    如果您的PATH环境变量中的所有内容都是绝对路径,则不应发生此错误,即使您正在搜索和访问的目录-execdir包含在. (我已经检查过这是否有效。)如果您认为您没有任何相关目录但仍然收到此错误,请使用详细信息更新您的问题,包括.PATH$PATHecho "$PATH"

    一个具体的例子。

    作为可能出错的示例,假设:

    • 爱丽丝喜欢.她$PATH,因为她希望能够在她想要的任何目录中运行程序cd,而不必费心在它们的名称前加上./.
    • 爱丽丝的友敌夏娃/home/eve/shared与爱丽丝分享了。
    • .cAlice 想要Eve 与她共享的文件的统计信息(行数、字数、字节数) 。

    所以爱丽丝运行:

    find ~eve/shared -name \*.c -execdir wc {} \;
    

    不幸的是,对于爱丽丝来说,夏娃已经创建了她自己的脚本,将其命名为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 使用findwith-execdir运行wcEve 共享的文件时,它会访问与 Eve 的自定义wc脚本位于同一目录中的文件,Eve 的wc运行——具有 Alice 的所有权限!

    (狡猾的 Eve 已经让她的wc脚本充当系统的包装器wc,所以 Alice 甚至不知道出了什么问题,也就是说,它do_evil已经运行了。然而,更简单——也更复杂——的变化是可能的。 )

    如何find防止这种情况。

    find通过在包含相对目录时拒绝执行-execdir操作来防止此安全问题的发生。$PATH

    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--appears以外的相对路径$PATH并且你运行findwith -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的路径中,本身就有风险,无论如何最好避免。考虑上面示例中的虚构情况。假设find爱丽丝没有跑,而是简单地cd跑~eve/shared/blah了wc *.c。如果blah包含 Eve 的wc脚本,do_evil则作为 Alice 运行。

    • 23
  2. Ron
    2015-05-09T07:38:29+08:002015-05-09T07:38:29+08:00

    这里有非常详细的信息。另一个很好的参考是这里。引用第一个参考:

    选项 -execdir 是 GNU find 中引入的一个更现代的选项,它试图创建一个更安全的 -exec 版本。它与 -exec 具有相同的语义,但有两个重要的增强功能:

    它始终提供文件的绝对路径(在 -exec 的情况下使用文件的相对路径非常危险)。

    除了提供绝对路径外,它还会检查 PATH 变量的安全性(如果 PATH 环境变量中存在点,您可以从错误的目录中获取可执行文件)

    来自第二个参考:

    如果当前目录包含在 $PATH 环境变量中,“-execdir”操作将拒绝执行任何操作。这是必要的,因为“-execdir”在它找到文件的同一目录中运行程序——通常,不受信任的用户可能可以写入这样的目录。出于类似的原因,“-execdir”不允许“{}”出现在要运行的命令的名称中。

    • 5
  3. kenorb
    2015-09-29T12:47:22+08:002015-09-29T12:47:22+08:00

    主要问题在于其中包含相关文件夹的系统变量的值PATH,因此出于安全原因,find命令不允许您执行二进制文件,因为它可能会执行错误的程序。


    因此,例如,如果您根据收到的警告在 PATH 中有当前目录:

    当前目录包含在 PATH 环境变量中。

    你将运行你的命令:

    find . -type f -name 'partOfFileNames*' -execdir rm -- {} +
    

    如果您的本地脚本(rm带有可执行标志)包含rm -fr /在其中,它可以删除您的所有文件,因为/bin/rm您不会执行 expected ,而是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关注此错误的进展。


    这是 Bash 版本解决方法:

    PATH=${PATH//:\.\/node_modules\/\.bin/}
    

    用法示例(将过滤传递PATH给特定命令):

    env PATH=${PATH//:\.\/node_modules\/\.bin/} find . -type f
    
    • 3
  4. Ciro Santilli OurBigBook.com
    2019-01-14T06:06:07+08:002019-01-14T06:06:07+08:00

    放PATH=/usr/bin

    这并不理想,但它倾向于解决大多数用例,假设两者find和要使用的程序(rm此处)都在该目录中:

    PATH=/usr/bin find -execdir rm ...
    

    您可以根据需要添加任何缺少的路径。

    xargs和bash -c cd解决方法

    好吧,我放弃:

    find . -type f |
      xargs -I '{}' bash -c 'cd "$(dirname "{}")" && pwd && echo "$(basename "{}")"'
    

    sed解决方法

    比以前的解决方法差一点:

    PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" find . -execdir echo '{}' \;
    

    一个测试用例:

    [ "$(printf '/a/b::c/d:/e/f\n' | sed -E 's/(^|:)[^\/][^:]*//g')" = '/a/b:/e/f' ] || echo fail
    

    具体来说rename,您还可以使用一些 Perl regex-fu:https ://stackoverflow.com/questions/16541582/finding-multiple-files-recursively-and-renaming-in-linux/54163971#54163971

    RTFS希望破灭

    对于那些希望存在一种方法来忽略find的自以为是的人,让我用一些来源来粉碎它:

    • https://git.savannah.gnu.org/cgit/findutils.git/tree/find/parser.c?h=v4.6.0#n2847
    • https://git.savannah.gnu.org/cgit/findutils.git/tree/find/parser.c?h=v4.6.0#n2944

    从中我们看到似乎没有办法关闭路径检查。

    它检查的确切规则是:如果PATH为空或不以 开头则失败/。

    • 3
  5. kenorb
    2020-05-03T09:40:43+08:002020-05-03T09:40:43+08:00

    解决方法是在命令之前传递自定义 PATH,例如

    PATH=/usr/bin find . -type f -name 'partOfFileNames*' -execdir echo rm -- {} +
    

    以上解决方法将阻止加载全局$PATH,但我们自己的。


    这是另一个示例(更灵活),假设我们要运行cat命令:

    PATH=$(dirname $(which find)):$(dirname $(which cat)) find /etc -name hosts -execdir cat {} ';'
    

    或者:

    PATH=$(dirname $(which cat find) | paste -sd:) find ...
    

    通过运行,$(dirname $(which cat))我们计算出要运行的命令所在的位置。

    • 2

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve