11

我正在尝试使用LD_PRELOAD具有 setuid 权限的应用程序预加载库。起初尝试过LD_PRELOAD,似乎它被 setuid 二进制文件忽略了,尽管当我与其他人一起尝试时它正在工作lsdir等等。

从 LD_PRELOAD 的文档中:

   LD_PRELOAD
          A whitespace-separated list of additional, user-specified, ELF shared
          libraries to be loaded before all others.  This can be used to
          selectively override functions in other shared libraries.  For set-
          user-ID/set-group-ID ELF binaries, only libraries in the standard
          search directories that are also set-user-ID will be loaded.

我尝试按照上面的文档将库放入/usr/lib,/usr/local/lib/usr/lib64setuid 权限,但它似乎仍然不起作用。如果我LD_PRELOAD在标准目录中使用 setuid 有库的情况下没有给出路径,它似乎无法找到该库。如果我给它路径,它不会做任何事情。

setuid 二进制文件是在非 root 用户 shell 中运行的 root 权限二进制文件。有什么想法吗?不确定我是否缺少路径、环境变量,或者我误解了上面的文档。

编辑:请求的权限是:

图书馆:

-rwsr-sr-x 1 root root 72580 2012-02-10 07:51

应用程序:

-rwsr-xr-x 1 root root 137517601 2012-02-10 

env | grep LD
LD_LIBRARY_PATH=/usr/lib (I added this manually myself, usually LD_LIBRARY_PATH is empty)
4

5 回答 5

14

LD_PRELOAD 不能与 setuid 一起使用。这是linux中的一个安全特性。作为参考,请查看这篇文章,该文章详细介绍了如何使用LD_PRELOAD自定义代码替换一些库调用,在malloc.

于 2012-06-21T23:16:31.043 回答
5

如果您使用的是 SELinux,这可能是由于它。glibc 支持的 ELF 辅助向量之一是AT_SECURE. 这个特定参数(默认为 0 或 1)告诉 ELF 动态链接器取消设置被认为可能对您的系统有害的各种环境变量。其中之一是LD_PRELOAD。通常,当调用 setuid/setgid 应用程序时会完成此环境清理(以防止明显的漏洞)。SELinux 还增强了这种卫生,只要应用程序在 SELinux 中触发域转换(比如sysadm_t通过mozilla_t二进制标记的moz,或其他);SELinuxAT_SECURE为已加载的应用程序设置标志(在示例中为 mozilla/firefox)。

noatsecure权限禁用特定转换的环境卫生活动。您可以通过以下允许语句执行此操作(因为它适用于上面的示例):

allow sysadm_t mozilla_t:process { noatsecure };
于 2012-02-11T09:50:35.040 回答
0

在带有 glibc 的系统上,您可以使用另一种支持的方式预加载库:通过将库添加到/etc/ld.so.preload. 这个不受限制LD_PRELOAD

特别是,通过这种方式,我能够预加载(无用,只是为了证明它可以工作)libgtk3-nocsd.so/usr/bin/passwd中,并且当我运行时passwd ruslan,库确实出现在/proc/<PID_OF_PASSWD>/maps等待passwd当前密码输入时。

一个缺点是您不能像使用LD_PRELOAD. 如果你真的需要这个,也许你可以改变你的库来尝试检查它是否想要做任何事情,基于当前进程二进制文件的路径是什么(检测它就像在这里讨论的那样)。

于 2019-05-21T11:27:44.600 回答
0

LD_PRELOAD不能与 set-user-ID/set-group-ID 程序一起使用,除非 et-user-ID/set-group-ID 程序以相同的真实有效用户和组运行。

例如, afterfork和 before exec*,设置

  • setreuid给 set-user-ID 程序的所有者
  • setregid到 set-group-ID 程序的组
于 2019-12-27T17:18:54.853 回答
-1

像这样安装你的库:

  • 位置:/lib 或 /usr/lib
  • 权限:根:根
  • 已开启 setuid 和 setgid

确保 LD_PRELOAD 已导出到您的环境

$ export LD_PRELOAD=/usr/lib/yourlib.so
$ env | grep LD_PRELOAD  # verify

然后运行你的程序。

于 2012-02-10T19:26:07.180 回答