Из руководства по findutils:
Например, такие конструкции, как эти две команды
# risky find -exec sh -c "something {}" \; find -execdir sh -c "something {}" \;очень опасны Причина этого заключается в том, что символ {{} расширяется до имени файла, которое может содержать точку с запятой или другие символы, специальные для оболочки. Если, например, кто-то создает файл,
/tmp/foo; rm -rf $HOMEдве вышеуказанные команды могут удалить чей-то домашний каталог.Поэтому по этой причине не запускайте команды, которые передадут недоверенные данные (например, имена файлов) командам, которые интерпретируют аргументы как команды для дальнейшей интерпретации (например, '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 {} \;,first
{}заменяется, но поскольку{}он не"$@"заключен в кавычки, не имеет ли он той же проблемы, что и исходная команда? Например,"$@"будет расширена"/tmp/foo;","rm","-rf"и"$HOME"?почему
{}не избежал или не цитируется?
- Не могли бы вы привести другие примеры (все еще с
sh -cили без него, если это применимо; с или без,findкоторые могут быть необязательны), где применяются те же виды проблем и решений, и которые являются минимальными примерами, чтобы мы могли сосредоточиться на проблеме и решении с как можно меньше отвлекаться? См. Способы предоставления аргументов для команды, выполняемой `bash -c`
Благодарю.