Які проблеми безпеки та умови перегонів при використанні `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його. Проблема існує через те, що між моментом, коли вирішує, що потрібно вирішити -execдію, і точкою, коли /bin/rmкоманда фактично видає виклик unlink (), видаляє файл з файлової системи. Протягом цього періоду зловмисник може перейменувати /tmp/umsp каталог, замінивши його символічним посиланням на /etc. Немає можливості /bin/rmвизначити, що він працює над тим самим файлом, який знаходили на увазі. Після того, як символічне посилання встановлено, зловмисник переконав знайти, щоб викликати видалення /etc/passwdфайлу, що не є ефектом, призначеним командою, яка була фактично викликана.

Не впевнений, наскільки ймовірно, що хтось міг би скористатися цим; але я думаю, що тут є відповідь!


У наведеному вище випадку, execdirспочатку ChDir на /tmp/umspперед виконанням команди, і тому теоретично, яке пов'язується каталог зловмисника не матиме ніякого ефекту .. якщо перекомпонування сталося після того, як знахідка «вирішує» , щоб оцінити , -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це робите, чи ні!
Danny Tuppeny

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 просто забороняє .проходити цілком і інструментам не потрібно буде впроваджувати власні перевірки безпеки! :)
Danny Tuppeny

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