Я пишу набор утилит в bash
, который имеет общую библиотеку. Каждый script, который я пишу, должен иметь блок кода, который определяет путь библиотеки относительно исполняемого файла. Не настоящий код, а пример:
#!/bin/bash
DIR="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
. $DIR/../lib/utilities/functions
Вместо преамбулы, которая пытается найти библиотеку, я имел яркую идею использовать переменную окружения для указания расположения библиотек.
#!/bin/bash
. $TOOLS_LIBRARY_PATH
Я мог бы использовать программу-оболочку для установки этой переменной среды, или я мог бы установить ее по своему пути. Могут быть лучшие способы организовать набор инструментов bash
, но вопрос:
Могу ли я доверять переменным окружения?
Это один из тех, которые я никогда не думал об этом. При программировании на других языках пути используются для поиска библиотек (например, LD_LIBRARY_PATH
, PYTHONPATH
, PERLLIB
, RUBYLIB
, CLASSPATH
, NODE_PATH
), но мне никогда не приходилось останавливаться и думать о том, как это может быть небезопасно.
Фактически, LD_LIBRARY_PATH
имеет Почему LD_LIBRARY_PATH
является плохим, чтобы препятствовать его использованию. Переменные среды пути библиотеки Ruby и Perl игнорируются, если вызывается их механизмы безопасности, $SAFE
и -T
(taint mode) соответственно.
Мои мысли до сих пор...
- Пользователь может установить
TOOLS_PATH_LIBRARY
в библиотеку по своему выбору, но утилита будет работать под их uid. Они могли просто запустить свою вредоносную библиотеку напрямую с помощьюbash
. - Мои инструменты
sudo
некоторые вещи. Кто-то может установить ихTOOLS_PATH_LIBRARY
на то, что использует это. Но инструменты не запускаются черезsudo
, они только вызываютsudo
здесь и там. Пользователь должен был бы бытьsudoer
в любом случае, он мог просто вызватьsudo
напрямую. - Если я не могу доверять
TOOLS_PATH_LIBRARY
, то я не могу доверятьPATH
. Все вызовы программы должны использовать абсолютные пути. - Я видел, как программы оболочки используют псевдонимы для абсолютных программ, поэтому вместо вызова
ls
используйте переменную, напримерLS=/bin/ls
. Из того, что я читал, это защита от переопределения программных дефолтов в качестве псевдонимов. Смотрите: PATH, функции и безопасность. Bash лучшие примеры использования сценариев.. - Perl taint mode рассматривает все переменные среды как "испорченные", которые предвещают, поэтому я пытаюсь рассуждать о рисках окружающей среды.
- Невозможно изменить одну другую среду, если только пользователь не является пользователем root. Таким образом, я беспокоюсь только о том, что пользователь меняет свою среду для повышения привилегий. См.: Есть ли способ изменить другие переменные среды процесса?
Я резина уклонилась в ответ, но я все еще собираюсь опубликовать его, так как это не ответ pat.
Обновить. Каковы проблемы безопасности, связанные с использованием переменных среды, для указания путей к библиотекам и исполняемым файлам?