设置 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 的端口)。 我将 A.bin、libY.so 和 libZ.so 的 setuid 位设置为 rwsrwsrws,并将文件的所有权更改为 root。 当我尝试运行 A.bin 时,出现以下错误
ld.so.1: A.bin: fatal: libY.so: open failed: No such file or directory 。
当我从所有这些文件中删除 setuid 权限时,二进制文件就会运行,但需要 root 权限的功能会失败
如何克服这个问题?
编辑:操作系统是Solaris 5.10
Consider this scenario in which an executable A.bin uses libY.so and libZ.so. A.c, Y.c and Z.c are all written in C.
Z.c and Y.c are compiled into respective .so files.
This is the directory structure of the files
$home/bin/A.bin
$home/lib/libY.so
$home/lib/libZ.so
When I run A.bin as normal user, A.bin runs normally as expected.
Note: $LD_LIBRARY_PATH contains $home/lib
I changed some code in A.c adding some functionality which needs admin privileges(like binding to a port less than 1000).
I set the setuid bit for A.bin, libY.so and libZ.so to rwsrwsrws, and change the ownership of the files to root. When I try to run A.bin, I get the following error
ld.so.1: A.bin: fatal: libY.so: open failed: No such file or directory
Killed
When I just remove the setuid permission from all those files, then the binary runs except for the functionality fails where it needs root privileges.
How to overcome this problem ?
Edit: The OS is Solaris 5.10
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
正如AProgrammer所说,在执行setuid程序时,$LD_LIBRARY_PATH被忽略。 时,必须使用此标志将路径硬编码到可执行文件本身中。
因此,在链接gcc -R $home/lib
-R 标志将运行时搜索路径列表构建到可执行文件中。
As AProgrammer said, while executing setuid programs, $LD_LIBRARY_PATH is ignored. Hence the path has to be hardcoded in the executable itself using this flag while linking
gcc -R $home/lib
The -R flag builds runtime search path list into executable.
在某些 Unix 变体中,suid 可执行文件具有一些安全功能,例如忽略 LD_LIBRARY_PATH、检查可执行文件和使用的共享库的所有权和访问权限,...我不记得 Solaris 的情况,但你也许应该检查一下。
In some Unix variants, suid executables have some security features like ignoring
LD_LIBRARY_PATH
, checking ownership and access rights on the executable and used shared libraries,... I don't remember the case of Solaris, but you should probably check that.