「find -exec」を使用する際のセキュリティ上の問題と競合状態は何ですか?


14

findmanページから:

-exec command ;
    There are unavoidable security problems
    surrounding use of the -exec action; you should use the
    -execdir option instead.

-execdir command {} +
    Like -exec, but the specified command is run from the
    subdirectory containing the matched file, which is not
    normally the directory in which you started find.  This a much
    more secure method for invoking commands, as it avoids race
    conditions during resolution of the paths to the matched
    files.

これは何を意味するのでしょうか?開始ディレクトリから実行すると競合状態になるのはなぜですか?そして、これらのセキュリティリスクはどうですか?


関連:なぜfindの出力をループするのは悪い習慣ですか?それはいくつかの答えでカバーされています。
ステファンシャゼル

回答:


13

ここで詳細を見つけました:

この-execアクションにより、別のプログラムが実行されます。その時点で考慮されているファイルの名前をプログラムに渡します。通常、呼び出されたプログラムは、そのファイルに対して何らかのアクションを実行します。繰り返しますが、ここで悪用できる競合状態があります。具体的な例としてコマンドを取り上げます

 find /tmp -path /tmp/umsp/passwd -exec /bin/rm

この簡単な例では/bin/rm、削除するファイルを1つだけ特定し、削除するように呼び出し ています。findが-execアクションを処理する必要があると判断した時点と、/bin/rmコマンドが実際にunlink()システムコールを発行してファイルシステムからファイルを削除する時点との間に時間差があるため、問題が存在 します。この期間内に、攻撃者は/tmp/umsp ディレクトリの名前を変更して、へのシンボリックリンクに置き換えることができ/etcます。/bin/rmfindが念頭に置いていたのと同じファイルで動作していると判断する方法はありません。シンボリックリンクが配置されると、攻撃者はfindを説得して/etc/passwdファイルの削除を引き起こしますが、これは実際に呼び出されたコマンドが意図した効果ではありません。

誰がこれを悪用する可能性があるかはわかりません。しかし、答えがあると思います!


上記の場合には、execdirへの最初のchdirしまう/tmp/umspのコマンドを実行し、そしてその理論的に、攻撃者の再リンクディレクトリが...何の効果も持たないだろう前にあれば、「決定」再リンクは検索後に起こったは評価する-execが、前rmのコマンドにその作業を行うことができます。しかし、なぜこれが違いをもたらすのだろうか:ユーザーがfindコマンドを作成することを決定した後、攻撃者は単純に再リンクを行うことができます。
オテウス

1
@RuiFRibeiroリンクはコマンドに渡される引数ではなく、中間ディレクトリです。/tmp/umspfind見たときはディレクトリですが、rm実行すると、攻撃者はそれをシンボリックリンクに変更しました/etc/tmp/umsp/passwdこれは通常のファイルですが、同じファイルではありません。
ジル「SO-悪であるのをやめる」

2

-exec危険な理由は、ユーザーが実行するプログラムのフルネームとパスを指定しないと、間違ったプログラムが実行される可能性があるためだと考えています。

例:

find /some/path -exec coolprogram

では/some/path、誰かが別のものを作成しcoolprogram、すべてのデータを悪いアクターにアップロードします。

しかし、待って、あなたが言うように、あなたはそれを実行する必要はありません./coolprogramか?はい。ただしPATH=.:/bin:whatever、現在のディレクトリでプログラムを実行するユーザーがいます。

これはおそらく簡略化されていますが、場合によっては危険になると思います。ゼロバイトcpioが間違ったディレクトリになってしまう問題を一度トラブルシューティングしなければなりませんでした。cpioディレクトリでゼロバイトのファイルを実行しているために機能しなかったため、プログラムがクラッシュしました。


3
これらのリスクはに隔離されていませんfind -exec。あなたが置かれている場合は.、あなたのパスに、単に実行しcoolprogram、あなたの現在のディレクトリには、あなたが使用しているかどうか、すでに危険であるfindかどうか、それを行うには!
ダニータッペニー16

1
同意しましたが、-execdirは私が言及した条件も監視しているようです:The ‘-execdir’ action refuses to do anything if the current directory is included in the $PATH environment variable. This is necessary because ‘-execdir’ runs programs in the same directory in which it finds files – in general, such a directory might be writable by untrusted users. For similar reasons, ‘-execdir’ does not allow ‘{}’ to appear in the name of the command to be run.
Doug

物語の教訓は持っているということだと思う。あなたの道で悪い考えもあります。それが私がそれがそこにないことを確かめる理由です。
ダグ

.パスと{}コマンドでの禁止について知るのは興味深い。将来的にはLinuxが.完全にパスを禁止し、ツールが独自の安全性チェックを実装する必要がなくなるかもしれません!:)
ダニータッペニー16

1
私が書いたコードの90%は、間違っているものの5%をキャッチするためだけのものだと思います。:)
ダグ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.