Lor*_*one 26 linux shared-libraries linux-capabilities
我用来LD_LIBRARY_PATH
为应用程序设置某个用户库的路径.但是如果我在这个应用程序上设置功能
sudo setcap CAP_NET_BIND_SERVICE=eip myapplication
Run Code Online (Sandbox Code Playgroud)
然后LD_LIBRARY_PATH
似乎被忽略了.当我启动程序时,Linux抱怨它无法找到某个共享库.
我猜这里有一些保护措施,以防止具有扩展权限的应用程序被劫持.有解决方法吗?
sca*_*cai 10
正如其他答案中所述,这种行为是有意的.如果您可以自己编译(或至少链接)应用程序,则有某种解决方法.然后你可以传递-Wl,-rpath <yourDynamicLibraryPath>
给gcc或-rpath <yourDynamicLibraryPath>
ld,你不必LD_LIBRARY_PATH
在执行时指定.
该手册页的sudo
解释:
请注意,大多数操作系统上的动态链接器将删除可以控制来自setuid可执行文件环境(包括sudo)的动态链接的变量.根据操作系统的不同,这可能包括RLD*,DYLD*,LD_ ,LDR_,LIBPATH,SHLIB_PATH等.在sudo甚至开始执行之前,这些类型的变量将从环境中删除,因此,sudo不可能保留它们.
正如此链接所解释的那样,实现此目的的实际机制是glibc.如果UID与EUID不匹配(setuid
包括任何程序的情况sudo
),则删除所有"不安全的环境变量".因此,具有提升权限的程序无需更改即可运行.
小智 6
在Linux上,此问题的解决方案如下:
进入目录
$cd /etc/ld.so.conf.d/
创建一个新文件$ touch xyz.conf使用任何编辑器打开此文件
$vi xyz.conf
在此文件中逐行添加动态库路径,例如,如果您的路径如下:
/home/xyz/libs1:/home/xyz/libs2/:/home/xyz/libs3/
那么该文件中应包含三个条目,如下所示:
/home/xyz/libs1/
/home/xyz/libs2/
/home/xyz/libs3/
然后保存此文件并执行以下命令:
$ldconfig
上述所有操作都需要通过root登录执行