Программа не может загрузиться после установки бита setuid

Рассмотрим этот сценарий, в котором исполняемый файл A.bin использует libY.so и libZ.so. Ac, Yc и Zc все написаны на CZc, а Yc скомпилированы в соответствующие файлы.so.

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

$ home / bin / A.bin $home/lib / libY.so $home/lib / libZ.so

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

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

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

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

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

Изменить: ОС Solaris 5.10

2 ответа

Решение

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

gcc -R $home/lib

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

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

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

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