Каковы проблемы безопасности и условия гонки при использовании `find -exec`?


14

Со findстраницы руководства :

-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.

Что это значит? Почему существуют гонки с запуском из стартового каталога? И как эти риски безопасности?


Ответы:


13

Подробности нашел здесь :

-execДействие вызывает другую программу для запуска. Он передает программе имя файла, который рассматривается в данный момент. Вызванная программа обычно выполняет некоторое действие с этим файлом. Еще раз, есть условие гонки, которое может быть использовано здесь. В качестве конкретного примера возьмем команду

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

В этом простом примере мы определяем только один файл, который необходимо удалить, и вызываем /bin/rmего удаление. Проблема существует, потому что существует промежуток времени между моментом, когда find решает, что ему нужно обработать -execдействие, и моментом, когда /bin/rmкоманда фактически выполняет системный вызов unlink (), чтобы удалить файл из файловой системы. В течение этого периода времени злоумышленник может переименовать /tmp/umsp каталог, заменив его символической ссылкой на /etc. Нет способа /bin/rmопределить, что он работает с тем же файлом, который имел в виду. Как только символическая ссылка установлена, злоумышленник убедился в том /etc/passwd, что она вызывает удаление файла, что не является эффектом, предусмотренным командой, которая фактически была вызвана.

Не уверен, с какой вероятностью кто-нибудь сможет это использовать; но я думаю, что есть ответ!


В приведенном выше случае, execdirесли сначала выполнить chdir, /tmp/umspпрежде чем запускать команду, и, теоретически, повторная ссылка на каталог у злоумышленника не будет иметь никакого эффекта… если повторное связывание произойдет после того, как find «решит» оценить, -execно до того, как rmкоманда сможет выполнить свою работу. Но мне интересно, почему это может иметь значение: злоумышленник может просто выполнить повторную ссылку после того, как пользователь решил написать findкоманду.
Отей

1
@RuiFRibeiro Ссылка - это не аргумент, передаваемый команде, а промежуточный каталог. /tmp/umspявляется каталогом, когда findвидит его, но при rmзапуске атакованный изменил его на символическую ссылку на /etc. /tmp/umsp/passwdэто обычный файл, но не один и тот же.
Жиль "ТАК - перестань быть злым"

2

Я считаю, что причина, по которой -execэто опасно, заключается в том, что, если пользователь не укажет полное имя и путь к программе, которая будет выполняться, он потенциально может выполнить не ту программу.

Пример:

find /some/path -exec coolprogram

В /some/path , кто-то сделал другой coolprogram, и он загружает все ваши данные какому-то плохому актеру.

Но подождите, вы говорите, вы не должны выполнять это как ./coolprogram ? Да, но есть люди PATH=.:/bin:whatever, которые выполнят программу в текущем каталоге.

Это, вероятно, упрощено, но я думаю, что в некоторых случаях это может быть опасно. Однажды мне пришлось устранить проблему, когда нулевой байт cpioоказался в неправильном каталоге. Это вызвало сбой программы, потому что cpioон не работал, так как выполнял файл нулевого байта в каталоге.


3
Эти риски не изолированы find -exec. Если вы указали .свой путь, то просто выполнение coolprogramв текущем каталоге уже опасно, используете ли вы findэто или нет!
Дэнни Таппени

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.
Даг

Я предполагаю, что мораль этой истории заключается в том, чтобы иметь. на вашем пути тоже плохая идея, поэтому я позабочусь, чтобы ее там не было.
Даг

Интересно узнать о запрещении .в пути и {}в команде. Возможно, в будущем Linux просто запретит .путь, и инструментам не нужно будет реализовывать свои собственные проверки безопасности! :)
Дэнни Таппени

1
Я думаю, что 90% кода, который я пишу, предназначен только для того, чтобы поймать 5% ошибок. :)
Даг
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.