Кажется, что возможности Linux (setcap) отключают LD_LIBRARY_PATH

Я использую LD_LIBRARY_PATH установить путь определенной пользовательской библиотеки для приложения. Но если я установлю возможности для этого приложения

sudo setcap CAP_NET_BIND_SERVICE=eip myapplication

затем LD_LIBRARY_PATH кажется, игнорируется. Когда я запускаю программу, Linux жалуется, что не может найти определенную общую библиотеку.

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

5 ответов

Решение

Да, это отключено по соображениям безопасности.

Как уже говорилось в других ответах, это поведение предназначено. Существует некоторый обходной путь, если вы можете скомпилировать (или хотя бы связать) приложение самостоятельно. Тогда вы можете пройти -Wl,-rpath <yourDynamicLibraryPath> в GCC или -rpath <yourDynamicLibraryPath> к лд и вам не нужно будет указывать LD_LIBRARY_PATH вообще на исполнение.

Решение этой проблемы в Linux заключается в следующем:

перейти в каталог $cd /etc/ld.so.conf.d/создать новый файл $touch xyz.conf открыть этот файл в любом редакторе $vi xyz.conf

Добавьте путь вашей динамической библиотеки в этот файл построчно, например, если ваш путь следующий:

/home/xyz/libs1:/home/xyz/libs2/:/home/xyz/libs3/тогда в этом файле должно быть три записи:/home/xyz/libs1//home/xyz/libs2//home/xyz/libs3/

Затем сохраните этот файл и выполните следующую команду: $ldconfig

Все вышеперечисленные операции необходимо выполнить от имени пользователя root

Справочная страница для sudo объясняет:

Обратите внимание, что динамический компоновщик в большинстве операционных систем удаляет переменные, которые могут управлять динамическим компоновкой из среды исполняемых файлов setuid, включая sudo. В зависимости от операционной системы это может включать RLD*, DYLD *, LD_, LDR_, LIBPATH, SHLIB_PATH и другие. Переменные такого типа удаляются из среды еще до того, как sudo даже начинает выполнение, и поэтому sudo не может их сохранить.

Как объясняет эта ссылка, действительный механизм для этого находится в glibc. Если UID не совпадает с EUID (что имеет место для любого setuid программа, в том числе sudo), затем удаляются все "незащищенные переменные среды". Таким образом, программа с повышенными привилегиями запускается без изменений.

Альтернативой для рассмотрения является "исправление" плохо скомпилированной разделяемой библиотеки ELF и / или исполняемого файла с использованием patchelf для установки rpath. https://nixos.org/patchelf.html

ld.so.conf не всегда верная ставка. Это будет работать, если все, что вы работаете, было скомпилировано правильно. В моем случае, с конкретным специально упакованным продуктом apache производителя, он был скомпилирован так плохо: они даже не использовали уникальные имена файлов.so, поэтому они конфликтовали с именами файлов.so из RPM в базовых репозиториях RHEL, предоставляющих некоторые довольно важные наиболее часто используемые библиотеки., Так что это был единственный вариант, чтобы изолировать, как они были использованы. Использование ld.so.conf против этих общих объектов в пути lib вендора уничтожило бы множество вещей, включая yum, а также сбои совместно используемой библиотеки glibc в масштабе всей системы.

Другие вопросы по тегам