LD_PRELOAD与setuid二进制

我正在尝试使用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/lib64 ,并具有setuid权限,但是它依然不起作用。 如果我不给LD_PRELOAD一个path的情况下,我在与setuid标准dir库,它似乎无法find库。 如果我给它的path,它什么都不做。

setuid二进制文件是在非root用户shell中运行的根权限二进制文件。 有什么想法吗? 不知道我是否错过了一个path,一个环境variables,或者我误解了上面的文档。

编辑 :权限请求是:

图书馆:

 -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) 

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

如果你使用SELinux,这可能是由于它。 glibc支持的ELF辅助矢量之一是AT_SECURE 。 这个特定的参数(默认为0或1)告诉ELF动态连接器取消设置可能对系统有害的各种环境变量。 其中之一是LD_PRELOAD 。 通常情况下,当调用setuid / setgid应用程序时(为了防止明显的漏洞),环境卫生是完成的。 SELinux还增强了这种卫生条件,只要应用程序在SELinux中触发域转换(例如,通过二进制标记的sysadm_tmozilla_t )。 SELinux为加载的应用程序设置AT_SECURE标志(例如,mozilla / firefox)。

noatsecure权限会禁用特定转换的环境卫生活动。 你可以通过下面的允许语句来做到这一点(因为它将适用于上面的例子):

 allow sysadm_t mozilla_t:process { noatsecure }; 

像这样安装你的lib:

  • 位置:/ lib或/ usr / lib
  • 权限:root:root
  • 有setuid和setgid

确保LD_PRELOAD导出到您的环境

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

然后运行你的程序。