【问题标题】:Program can't load after setting the setuid bit on设置 setuid 位后程序无法加载
【发布时间】:2010-11-21 14:06:21
【问题描述】:

考虑这种情况,其中可执行 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,并将文件的所有权更改为 root。当我尝试运行 A.bin 时,出现以下错误

ld.so.1:A.bin:致命:libY.so:打开失败:没有这样的文件或目录 被杀

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

如何解决这个问题?

编辑:操作系统是 Solaris 5.10

【问题讨论】:

    标签: c unix permissions setuid shared-objects


    【解决方案1】:

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

    gcc -R $home/lib

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

    参考:http://www.justskins.com/forums/loading-shared-libraries-from-a-setuid-program-116597.html

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 任何类 UNIX 操作系统必须忽略 setuid 二进制文件的 LD_LIBRARY_PATH,否则它是一个安全漏洞,您可以驾驶卡车通过。
      • @caf:我遇到了一个没有。所有 setuid 二进制文件都是静态链接的。
      猜你喜欢
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      • 2015-04-08
      相关资源
      最近更新 更多