LINUX.ORG.RU

Причина конфликта SUDO_ASKPASS и LD_LIBRARY_PATH

 


0

1

Есть скрипт запуска программы

LD_LIBRARY_PATH+=someLibPath
export LD_LIBRARY_PATH;
./someProj ./someProj.cfg

Все здорово и работает. И тут программе понадобились права администратора. Немного меняем скрипт

LD_LIBRARY_PATH+=someLibPath
export LD_LIBRARY_PATH;
export SUDO_ASKPASS=~/password.sh

echo $LD_LIBRARY_PATH
echo $SUDO_ASKPASS

sudo -A ./someProj ./someProj.cfg

И тут вываливается ошибка при запуске программы, мол библиотек не вижу, будто LD_LIBRARY_PATH подтерли. Но echo перед запуском выводит все норм. Объясните пожалуйста, почему оно так?


Объясните пожалуйста, почему оно так?

man sudo

     -E, --preserve-env
                 Indicates to the security policy that the user wishes to preserve their existing environment variables.  The security policy may return an error if the user does not
                 have permission to preserve the environment.

И смотри дефолтные настройки в sudoers, может это запрещено

Pinkbyte ★★★★★
()
Ответ на: комментарий от Pinkbyte

Спасибо за направление, буду пробовать)

Burns
() автор топика
Ответ на: комментарий от Pinkbyte

Дописал строку в sudoers

user<tab>ALL=(ALL:ALL) ALL

Попробовал оба варианта

sudo -A -E ...
sudo -E - A

и все та же ошибка... Да, с политикой безопасности в линуксе мои познания оставляют желать лучшего. Можете еще что-нибудь посоветовать?

Burns
() автор топика
Ответ на: комментарий от Burns

Покажите содержимое файла /etc/sudoers

Поищите там строчки(это комментарии, если их нет - не страшно, там просто ниже описываются примеры):

## You may wish to keep some of the following environment variables
## when running commands via sudo.

И попробуйте добавить туда

Defaults env_keep += "LD_LIBRARY_PATH"

Это разрешит не затирать содержимое LD_LIBRARY_PATH при вызове sudo.

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

Pinkbyte ★★★★★
()
Ответ на: комментарий от Pinkbyte

Безопасность не важна. Компьютер будет работать без подключения к интернету.

Добавил env_keep. Картина не изменилась. Содержимое sudoers:

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults	env_reset
Defaults	mail_badpass
Defaults	secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Defaults	env_keep+="LD_LIBRARY_PATH"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root	ALL=(ALL:ALL) ALL
user	ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo	ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d

Burns
() автор топика
Ответ на: комментарий от Burns

If the setenv option is set in sudoers, the command to be run has the SETENV tag set or the command matched is ALL, the user may set variables that would otherwise be forbidden. See sudoers(5) for more information.

может быть это.

wakuwaku ★★★★
()
Ответ на: комментарий от Pinkbyte

Прошлая моя попытка решить эту проблему заключалась в правке passwd. Указал GID и UID root а. Все здорово, работало. Использую текстовый режим. Однако только графическая оболочка отвалилась. Хотелось бы ее оставить для более удобной работы с кодом. Вот решил сделать по-человечески, но что-то не удается

Burns
() автор топика
Ответ на: комментарий от Burns

А если передавать переменную внутрь sudo?

sudo env LD_LIBRARY_PATH="1" env | grep LD_LIBRARY_PATH

Если выхлоп не пустой - пробуйте тогда запустить свою программу так:

sudo env LD_LIBRARY_PATH="/your/path" your_program

Где /your/path соответственно нужное значение LD_LIBRARY_PATH, а your_program - ваша программа

Pinkbyte ★★★★★
()
Ответ на: комментарий от Burns

Указал GID и UID root а.

Ни в коем случае не надо так делать, если не знаешь, к чему это приведет.

Говорю как человек, который пользовался системой с отключенным рутом и пользователем neko с UID=0 :-)

Pinkbyte ★★★★★
()
Ответ на: комментарий от Pinkbyte

Ураааа)) Заработало :)))

Спасибо Вам большое, ребят)) А так - домашнее задание понял, разобраться с правами. Надо будет в закладки добавить! Еще раз огромное спасибо :)

Burns
() автор топика
Ответ на: комментарий от Burns

Ну, решение вам нашли. Отвечу на вопрос «Причина конфликта SUDO_ASKPASS и LD_LIBRARY_PATH».

SUID'ным программам не положено LD_LIBRARY_PATH, это не безопасно. Для пущей безопасности линкер (ld.so) не только игнорирует эту переменную, но и удаляет её, поэтому до собственно исполняемого кода программы sudo эта переменная не доходит, ″--preserve-env″ и ″env_keep″ бесполезны для LD_LIBRARY_PATH.

mky ★★★★★
()
Ответ на: комментарий от mky

Спасибо за разъяснение, а то я уже чуть в код sudo не полез - думал там сбрасывается LD_LIBRARY_PATH принудительно в целях безопасности, а оно оказывается на уровне линкера запилено.

Pinkbyte ★★★★★
()
Ответ на: комментарий от wakuwaku

Да, в общем, насколько я понимаю, SETENV и является тут верным решением. Но если это только одна программа, можно и так, наверное.

wakuwaku ★★★★
()
Ответ на: комментарий от wakuwaku

А что насчёт SETENV? Это флаг внутри sudo, разрешающий не очищать переменные среды для определённой программы.

sudo, сама программа, не получает LD_LIBRARY_PATH. Грубо говоря, если пропатчить самое начало её кода, вставить в функцию main():

puts(getenv("LD_LIBRARY_PATH"));
то ничего не напечатается, точнее будет сегфолт из-за NUL-указателя. Поэтому очищаются переменные среды через SETENV или нет перед exec() программы из sudo, не важно, LD_LIBRARY_PATH там нет.

mky ★★★★★
()
Ответ на: комментарий от mky

Хм, мне казалось sudo должно позаботиться об этом. Возможно, оно так не умеет. Тогда только прописать system-wide в ld.so.conf?

сама программа, не получает

имелось в виду заставись sudo выставлять LD_LIBRARY_PATH для определённого юзера и нужной команды.

wakuwaku ★★★★
()
Ответ на: комментарий от wakuwaku

sudo не выставляет переменные среды. Оно, либо их удаляет, либо пропускает как есть, без изменений.

Либо прописывать каталог с библиотекой в ld.so.conf, либо из sudo запускать промежуточную программу, которая установит LD_LIBRARY_PATH и запустит нужную программу. Это может быть ″env″, скриптик на bash, 10-строчник на Си или ещё что угодно.

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.