我正在尝试使用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.
我试图把库放在/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_t
将mozilla_t
)。 SELinux为加载的应用程序设置AT_SECURE
标志(例如,mozilla / firefox)。
noatsecure
权限会禁用特定转换的环境卫生活动。 你可以通过下面的允许语句来做到这一点(因为它将适用于上面的例子):
allow sysadm_t mozilla_t:process { noatsecure };
像这样安装你的lib:
确保LD_PRELOAD导出到您的环境
$ export LD_PRELOAD=/usr/lib/yourlib.so $ env | grep LD_PRELOAD # verify
然后运行你的程序。