2009-08-21 1 views
6

Рассмотрите этот сценарий, в котором исполняемый файл A.bin использует libY.so и libZ.so. A.c, Y.c и Z.c записаны в C. Z.c и Y.c скомпилированы в соответствующие .so файлы.Программа не может загрузить после установки бита setuid на

Это структура каталогов файлов

$ домой/бен/A.bin $ Главная/Библиотека/libY.so $ домой/Библиотека/libZ.so

Когда я бегу .bin как обычный пользователь, A.bin работает нормально, как ожидалось. Примечание: $ LD_LIBRARY_PATH содержит $ home/lib

Я изменил код в A.c, добавив некоторые функции, которым нужны привилегии администратора (например, привязка к порту менее 1000). Я установил бит setuid для A.bin, libY.so и libZ.so в rwsrwsrws и изменил права собственности на файлы на root. Когда я пытаюсь запустить A.bin, я получаю следующую ошибку

ld.so.1: A.bin: со смертельным исходом: libY.so: открыть не удалось: Нет такого файла или каталога не Убитые

Когда я просто удалите разрешение setuid из всех этих файлов, тогда двоичные прогоны, за исключением функциональных сбоев, в которых ему нужны привилегии root.

Как преодолеть эту проблему?

Edit: ОС Solaris 5,10

ответ

10

Как сказал AProgrammer при выполнении программ setuid, $ LD_LIBRARY_PATH игнорируется. Следовательно, путь должен быть зашит в сам исполняемом файле, используя этот флаг при линковании

Gcc -R $ HOME/Библиотеке

флаг -r строит поиск во время выполнения списка пути в исполняемый файл.

Ссылка: http://www.justskins.com/forums/loading-shared-libraries-from-a-setuid-program-116597.html

3

В некоторых Unix варианты, SUID исполняемые файлы имеют некоторые функции безопасности, такие как игнорирование LD_LIBRARY_PATH, проверка собственности и права доступа на исполняемый файл и использоваться совместно используемые библиотеки, ... Я не помните о случае Solaris, но вы должны, вероятно, проверить это.

+4

* Любая * UNIX-подобная ОС должна игнорировать LD_LIBRARY_PATH для Setuid бинарных файлов, в противном случае это дыра в безопасности вы можете водить грузовик через. – caf

+0

@caf: Я столкнулся с тем, кто этого не сделал. Все бинарные файлы setuid были статически связаны. – Joshua