Программа не может загрузиться после установки бита 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, но вам, вероятно, следует это проверить.