具有setuid二进制的LD_PRELOAD

Mar*_*obo 9 linux setuid ld-preload

我试图LD_PRELOAD用一个具有setuid权限的应用程序预加载库.一开始尝试LD_PRELOAD,似乎它被setuid二进制文件忽略了,虽然当我和其他人一起尝试时它正在工作ls,dir等等.

从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.
Run Code Online (Sandbox Code Playgroud)

我尝试将库放入/usr/lib,/usr/local/lib/usr/lib64使用setuid权限,如上面的这个文档,但它似乎仍然没有工作.如果我LD_PRELOAD在标准dirs中使用setuid的情况下没有给出路径,那么它似乎无法找到库.如果我给它路径,它什么都不做.

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

编辑:请求的权限是:

图书馆:

-rwsr-sr-x 1 root root 72580 2012-02-10 07:51
Run Code Online (Sandbox Code Playgroud)

应用程序:

-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)
Run Code Online (Sandbox Code Playgroud)

小智 12

LD_PRELOAD不能与setuid一起使用.这是linux中的一个安全功能.有关参考,请参阅本文,其中详细介绍了如何使用LD_PRELOAD自定义代码替换某些库调用malloc.


Mic*_*kis 5

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

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

allow sysadm_t mozilla_t:process { noatsecure };
Run Code Online (Sandbox Code Playgroud)


Chr*_*lan -1

像这样安装你的库:

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

确保 LD_PRELOAD 已导出到您的环境

$ export LD_PRELOAD=/usr/lib/yourlib.so
$ env | grep LD_PRELOAD  # verify
Run Code Online (Sandbox Code Playgroud)

然后运行你的程序。