Из руководства по 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`
Благодарю.