考虑这种情况,其中可执行文件A.bin使用libY.so和libZ.so. A.c,Y.c和Z.c都是用C语言编写的。 Z.c和Y.c被编译成相应的.so文件。
这是文件的目录结构
$ HOME /斌/ A.bin $ HOME / lib目录/ libY.so $ HOME / lib目录/ libZ.so
当我以普通用户身份运行A.bin时,A.bin按预期正常运行。 注意:$ LD_LIBRARY_PATH包含$ home / lib
我在A.c中更改了一些代码,添加了一些需要管理员权限的功能(比如绑定到小于1000的端口)。 我将A.bin,libY.so和libZ.so的setuid位设置为rwsrwsrws,并将文件的所有权更改为root。当我尝试运行A.bin时,我收到以下错误
ld.so.1:A.bin:致命:libY.so:打开失败:没有这样的文件或目录 杀死
当我刚刚从所有这些文件中删除setuid权限时,除了功能失败之外,二进制文件才会运行,因为它需要root权限。
如何克服这个问题?
编辑:操作系统是Solaris 5.10
答案 0 :(得分:10)
正如AProgrammer所说,在执行setuid程序时,$ LD_LIBRARY_PATH被忽略。因此,在链接
时,必须使用此标志在可执行文件中对路径进行硬编码gcc -R $ home / lib
-R标志将运行时搜索路径列表构建为可执行文件。
参考:http://www.justskins.com/forums/loading-shared-libraries-from-a-setuid-program-116597.html
答案 1 :(得分:3)
在某些Unix变体中,suid可执行文件具有一些安全功能,例如忽略LD_LIBRARY_PATH
,检查可执行文件的所有权和访问权限以及使用的共享库,......我不记得Solaris的情况,但是你应该检查一下。