PATHにあるディレクトリに対して「-execdir」アクションを使用すると安全でないのはなぜですか?


19

-execdirfind のアクション-execとnot の組み合わせを使用するのは安全ではないのはなぜですか?

以下のコマンドを実行すると、次のプロンプトメッセージが表示されます。

/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)

このプロンプトが表示される原因は何ですか?

回答:


22

間違ったプログラムを実行する可能性があります。誰かがあなたに彼らのプログラムを実行させることができます。

-execdirアクションが見つかったファイル(複数可)を含むディレクトリからあなたのコマンドを実行します。とき$PATHのような相対パス、含まれている.かで始まらないものを/-execdirファイルが見つかったディレクトリ(または別のディレクトリには、それに関連した解決された)ので、安全ではまた、あなたがしようとしているものと同じ名前の実行可能ファイルを含むことができ、走る。信頼できない可能性のある実行可能ファイルは、代わりに実行されます。

これは別のユーザーによって意図的に悪用され、実行しようとしているプログラムの代わりに、プログラムを実行させ、データセキュリティの侵害や侵害を引き起こす可能性があります。または、それほど頻繁ではありませんが、問題を起こそうとする人がいなくても、誤って誤ったプログラムが実行される可能性があります。

PATH環境変数のすべてが絶対パスである場合、検索および-execdiringしているディレクトリがに含まれていても、このエラーは発生しませんPATH。(これが機能することを確認しました。)相対ディレクトリはないが、$PATHこのエラーが引き続き表示されると思われる場合は、の出力を含む詳細で質問を更新してくださいecho "$PATH"

具体例。

何がうまくいかないかの例として、

  • アリスは.、自分の名前の前$PATHに何もcd付けずに、どのディレクトリでもプログラムを実行できるようにしたいので、彼女の中にいます。./
  • アリスの熱狂的なイブは/home/eve/sharedアリスと共有しました。
  • アリスは、.cイブが彼女と共有したファイルの統計(行、単語、バイト)を求めています。

アリスが実行されます:

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

アリスにとって残念なことに、イブは独自のスクリプトを作成し、名前を付けwc、実行可能ファイル(chmod +x)を設定し、の下のディレクトリの1つに密かに配置しました/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アリスは何かが間違っていること、つまりdo_evil実行されたことさえ知りません。 )

findこれを防ぐ方法。

find相対ディレクトリが含まれる-execdir場合$PATHにアクションの実行を拒否することにより、このセキュリティ問題の発生を防ぎます。

find 特定の状況に応じて2つの診断メッセージを提供します。

  • 場合.である$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、で実行する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含めることは本質的に危険であり、とにかく回避するのが最善です。上記の例の架空の状況を考慮してください。実行する代わりにfind、アリスは単にcdsを~eve/shared/blah実行しwc *.cます。blahEveのwcスクリプトが含まれている場合do_evil、Aliceとして実行されます。


2
あなたがこれを聞いたことがあるかどうか、あなたはとても良い先生になるとは知りません:)
heemayl

5
@heemaylネット上で有用なものを書くすべての人は、すでに教師です:-)
Ciro Santilli新疆改造中心法轮功六四事件

5

ここに詳細な情報があります。別の優れたリファレンスはこちらです。最初の参照から引用するには:

オプション-execdirは、GNU findで導入されたより新しいオプションで、-execのより安全なバージョンを作成しようとします。-execと同じセマンティックを持ち、2つの重要な機能強化があります。

ファイルへの絶対パスを常に提供します(-execの場合、ファイルへの相対パスを使用するのは非常に危険です)。

絶対パスを提供することに加えて、安全のためにPATH変数もチェックします(ドットがPATH環境変数に存在する場合、間違ったディレクトリから実行可能ファイルを取得できます)

2番目のリファレンスから:

現在のディレクトリが$ PATH環境変数に含まれている場合、「-execdir」アクションは何も実行しません。「-execdir」は、ファイルを見つけるディレクトリと同じディレクトリでプログラムを実行するため、これが必要です。一般的に、そのようなディレクトリは信頼できないユーザーによって書き込み可能です。同様の理由で、「-execdir」では、実行するコマンドの名前に「{}」を使用できません。


「PATH env変数にドットが存在する場合、間違ったディレクトリから実行可能ファイルを取得できる」理由を答えてください。どの間違ったディレクトリ?そして、なぜそれを安全にするためにこれをしなければならないのですか?おかげで
αғsнιη

私は私の更新のポストの2番目のリンクは、あなたの質問に答えることを願っています
ロン・

3

主な問題は、そのPATH中に相対フォルダーを含むシステム変数の値にあります。したがって、セキュリティ上の理由から、findコマンドは間違ったプログラムを実行する可能性があるため、バイナリを実行できません。


したがって、たとえば、警告に従って現在のディレクトリがPATHにある場合:

現在のディレクトリは、PATH環境変数に含まれています。

コマンドを実行します:

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

ローカルスクリプト(rm実行可能フラグ付き)を含むrm -fr /場合、すべてのファイルを削除できます。これは、expectedを実行する代わりに、現在のディレクトリから/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で追跡できます。


Bashバージョンの回避策は次のとおりです。

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

使用例(PATH特定のコマンドにフィルター処理を渡す):

env PATH=${PATH//:\.\/node_modules\/\.bin/} find . -type f

以下は、好きではないsedものすべてを削除するように思われるものfindです。askubuntu.com
Ciro Santilli新疆改造中心法轮功六四事件

3

xargsおよびbash -c cd回避策

OK、私はあきらめます:

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の正規表現-FUを回避することができます/programming/16541582/finding-multiple-files-recursively-and-renaming-in-linux/54163971#54163971

RTFSが希望を打ち砕く

findの意見を無視する方法が存在することを希望している人のために、いくつかの情報源でそれを押しつぶします

このことから、パスチェックをオフにする方法はないようです。

チェックする正確なルールは次のとおりです:がPATH空の場合、またはで始まらない場合は失敗し/ます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.