Ви можете запустити неправильну програму. Хтось може змусити вас запустити їх програму.
-execdir
Дія запускає вашу команду з каталогу , який містить файл (и). Коли $PATH
містяться відносні шляхи, наприклад, .
або що-небудь, що не починається з цього/
, не -execdir
є безпечним, оскільки каталог, у якому знайдений файл (або інший каталог, вирішений відносно нього), також може містити виконуваний файл з тим самим іменем, що і той, який ви намагаєтеся бігти. То потенційно ненадійний виконуваний файл замість цього запуститься.
Це може бути навмисно використане іншим користувачем, щоб змусити вас запускати їх програму, що може спричинити шкоду або порушити безпеку даних замість програми, яку ви намагаєтеся запустити. Або, рідше, це може просто призвести до того, що неправильна програма буде ненавмисно запущена, навіть без того, щоб хтось намагався зробити цю проблему.
Якщо все в вашій PATH
змінній середовища це абсолютний шлях, ця помилка не повинна виникати, навіть якщо каталог , який ви шукаєте , і -execdir
ІНГ від це міститься в PATH
. (Я перевірив, що це працює.) Якщо ви вважаєте, що у вас немає жодних відносних каталогів, $PATH
але ви все ще отримуєте цю помилку, будь ласка, оновіть своє запитання деталями, включаючи вихідні дані echo "$PATH"
.
Конкретний приклад.
Прикладіть, наприклад, що може піти не так:
- Аліса має
.
в своєму розпорядженні, $PATH
тому що вона хоче мати змогу запускати програми в будь-якому каталозі, в якому вона була cd
б, не намагаючись привласнити свої імена ./
.
- Вільшанка Аліса Єва поділилася
/home/eve/shared
з Алісою.
- Аліса хоче статистика (рядки, слова, байти) щодо
.c
файлів, якими Єва поділилася з нею.
Отже, Аліса працює:
find ~eve/shared -name \*.c -execdir wc {} \;
На жаль для Аліси, Єва створила свій власний сценарій, назвала його wc
, встановила його виконуваним ( chmod +x
) і підпільно розмістила його в одному з каталогів під /home/eve/shared
. Сценарій Єви виглядає так:
#!/bin/sh
/usr/bin/wc "$@"
do_evil # Eve replaces this command with whatver evil she wishes to do
Тому , коли Аліса використовує find
з -execdir
бігти wc
на файлах Єва поділилася, і він отримує файли в тому ж каталозі, що і призначені для користувача Єви wc
сценарію, Єви wc
пробігів - з усіма привілеями Аліси!
(Будучи хитрою, Єва змусила wc
сценарій виконувати функцію обгортки для системи wc
, тому Аліса навіть не знає, що щось пішло не так, тобто це do_evil
було запущено. Однак можливі більш прості - а також більш складні - варіанти. )
Як find
це запобігає.
find
запобігає виникненню цієї проблеми безпеки , відмовившись вживати -execdir
дій, коли $PATH
містить відносну каталогію.
find
пропонує два діагностичні повідомлення залежно від конкретної ситуації.
Якщо .
є $PATH
, то (як ви вже бачили) він говорить:
find: The current directory is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove the current directory from your $PATH (that is, remove "." or leading or trailing colons)
Напевно, є спеціальне повідомлення для .
справи, оскільки це особливо часто.
Якщо відносний шлях, відмінний від - .
скажіть, - foo
з'являється $PATH
і ви біжите find
з ним -execdir
, він говорить:
find: The relative path `foo' is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove that entry from $PATH
Краще взагалі не мати відносних шляхів $PATH
.
Ризик виникнення .
або інших відносних шляхів $PATH
особливо посилюється при використанні утиліти, яка автоматично змінює каталог, тому find
не дозволить вам використовуватись -execdir
у цій ситуації.
Але мати відносні шляхи, особливо .
, у вашій $PATH
суті ризиковано, і справді найкраще уникнути цього. Розглянемо вигадану ситуацію на прикладі вище. Припустимо, замість того, щоб бігати find
, Аліса просто cd
перебирається ~eve/shared/blah
і працює wc *.c
. Якщо blah
містить wc
сценарій Єви , do_evil
працює як Аліса.