c - 设置 setuid 位后程序无法加载

标签 c unix permissions setuid shared-objects

考虑这种情况,其中可执行文件 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 中的一些代码,添加了一些需要管理员权限的功能(比如绑定(bind)到小于 1000 的端口)。 我将 A.bin、libY.so 和 libZ.so 的 setuid 位设置为 rwsrwsrws,并将文件的所有权更改为 root。当我尝试运行 A.bin 时,出现以下错误

ld.so.1: A.bin: fatal: libY.so: 打开失败:没有那个文件或目录 杀了

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

如何克服这个问题?

编辑:操作系统是 Solaris 5.10

最佳答案

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

gcc -R $home/lib

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

关于c - 设置 setuid 位后程序无法加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1310583/

相关文章:

c - 如何在结构中正确使用 fgets?

c - 获取终止我的进程的 "User signal 1",C 中的 UNIX

python - 无法捕获线程程序中的异常

unix - vim 在启动时不执行自动命令,但读取 .vimrc

postgresql - 调用没有其他函数权限的函数

c - Net raid FS with FUSE, gcc -hello.c -o a.out, a.out 不可执行

command-line - 使文件归root所有后,有效用户ID不会改变

c - 用静态关键字 : what is static, 声明的数组是指针还是整个数组?

c - c中的文件输入输出

c - memcpy 与 C 中的赋值