将setuid位设置为打开后,程序无法加载

tp5buhyn  于 2022-09-21  发布在  Unix
关注(0)|答案(2)|浏览(189)

考虑这样的场景,其中可执行的A.bin使用libY.so和libZ.so。A.C、Y.C和Z.C都是用C编写的。Z.C和Y.C被编译成各自的.so文件。

这是文件的目录结构

$HOME/bin/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,并将文件的所有权更改为根。当我尝试运行A.bin时,我得到以下错误

Ld.so.1:a.bin:FATAL:libY.so:打开失败:未终止此类文件或目录

当我只是从所有这些文件中删除setuid权限时,二进制文件就会运行,除非在需要根权限的地方功能失败。

如何克服这个问题?

编辑:操作系统为Solaris 5.10

zvokhttg

zvokhttg1#

正如AProgrammer所说,在执行setuid程序时,$LD_LIBRARY_PATH被忽略。因此,路径必须在链接时使用此标志在可执行文件本身中进行硬编码

GCC-R$HOME/lib

-R标志将运行时搜索路径列表构建为可执行文件。

sqxo8psd

sqxo8psd2#

在一些Unix变体中,suid可执行文件具有一些安全功能,如忽略LD_LIBRARY_PATH、检查可执行文件和使用的共享库的所有权和访问权限等。我不记得Solaris的情况了,但您可能应该检查一下。

相关问题