findutilsのマニュアルより:
たとえば、これらの2つのコマンドなどの構成体
# risky find -exec sh -c "something {}" \; find -execdir sh -c "something {}" \;非常に危険です。この理由は、「{}」がファイル名に展開されるためです。ファイル名には、シェルに特殊なセミコロンまたはその他の文字が含まれる場合があります。たとえば、誰かがファイルを作成した場合、
/tmp/foo; rm -rf $HOME上記の2つのコマンドは誰かのホームディレクトリを削除できます。したがって、このため、引数をさらに解釈されるコマンドとして解釈するコマンド(たとえば、「sh」)に信頼できないデータ(ファイル名など)を渡すコマンドを実行しないでください。
シェルの場合、この問題に対する巧妙な回避策があります。
# safer find -exec sh -c 'something "$@"' sh {} \; find -execdir sh -c 'something "$@"' sh {} \;このアプローチは、すべての問題を回避することを保証するものではありませんが、攻撃者が選択したデータをシェルコマンドのテキストに置き換えるよりもはるかに安全です。
find -exec sh -c "something {}" \;の置換{}が引用符で囲まれていないため、単一の文字列として扱われないという問題の原因はありますか?ソリューションでは
find -exec sh -c 'something "$@"' sh {} \;、最初
{}に置き換えられますが、{}引用符で囲まれていない"$@"ため、元のコマンドと同じ問題はありませんか?たとえば、"$@"に展開されます"/tmp/foo;"、"rm"、"-rf"、と"$HOME"?なぜ
{}エスケープまたは引用されないのですか?
- あなたは他の例(まだして与えることができる
sh -c;の有無にかかわらず、またはそれなしに該当する場合はfind、我々が持つ問題と解決策に焦点を当てることができるように、最小限の例であり、問題と解決策の同じ種類が適用され、かつその必要はないとすることができるが)できるだけ気を散らすものはありませんか?`bash -c`によって実行されるコマンドに引数を提供する方法を参照してください
ありがとう。