Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux功能(setcap)似乎禁用了LD_LIBRARY_路径_Linux_Shared Libraries_Linux Capabilities - Fatal编程技术网

Linux功能(setcap)似乎禁用了LD_LIBRARY_路径

Linux功能(setcap)似乎禁用了LD_LIBRARY_路径,linux,shared-libraries,linux-capabilities,Linux,Shared Libraries,Linux Capabilities,我使用LD\u LIBRARY\u PATH为应用程序设置特定用户库的路径。但是如果我在这个应用程序上设置了功能 sudo setcap CAP_NET_BIND_SERVICE=eip myapplication 然后,LD\u LIBRARY\u路径似乎被忽略。当我启动这个程序时,Linux抱怨说它找不到某个共享库 我猜有某种保护措施在起作用,以防止具有扩展权限的应用程序被劫持。有解决方法吗?是的,出于安全原因,它被禁用。forsudo说明: 请注意,大多数操作系统上的动态链接器都将删除

我使用
LD\u LIBRARY\u PATH
为应用程序设置特定用户库的路径。但是如果我在这个应用程序上设置了功能

sudo setcap CAP_NET_BIND_SERVICE=eip myapplication
然后,
LD\u LIBRARY\u路径
似乎被忽略。当我启动这个程序时,Linux抱怨说它找不到某个共享库


我猜有某种保护措施在起作用,以防止具有扩展权限的应用程序被劫持。有解决方法吗?

是的,出于安全原因,它被禁用。

for
sudo
说明:

请注意,大多数操作系统上的动态链接器都将删除 可以控制来自环境的动态链接的变量 setuid可执行文件,包括sudo。取决于操作系统 这可能包括RLD*、DYLD*、LD_、LDR_、LIBPATH、SHLIB_路径和 其他的。这些类型的变量将从环境中删除 在sudo开始执行之前,因此,不可能 sudo试图保存它们


正如我们所知,实现这一点的实际机制是glibc。如果UID与EUID不匹配(这是任何
setuid
程序的情况,包括
sudo
),则删除所有“不安全环境变量”。因此,具有提升权限的程序运行时不会进行任何更改。

如其他答案中所述,此行为是有意的。如果您可以自己编译(或至少链接)应用程序,那么有一些解决方法。然后,您可以将
-Wl,-rpath
传递给gcc或
-rpath
传递给ld,并且在执行时根本不需要指定
ld\u库路径。

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登录< /p> < p>执行。另一个要考虑的替代方案是“纠正”一个编译不良的ELF共享库和/或使用PACCHELVER来设置RPATH。


ld.so.conf并不总是确定的赌注。如果您正在运行的任何内容都已正确编译,那么它将起作用。在我的例子中,对于一个特别打包的供应商的apache产品,它的编译非常糟糕:它们甚至没有使用唯一的.so文件名,因此它们与基本RHEL存储库中的.so文件名冲突,这些存储库提供了一些非常关键的常用库。因此,这是唯一的选择,以隔离如何使用它们。对供应商库路径中的共享对象使用ld.so.conf会破坏很多东西,包括yum以及glibc共享库在系统范围内的故障。

这一切都很好,但setcap不会更改UID或EUID。它确实添加了功能(“提升的权限”)。即使使用-rpath,Linux也会在调用setcap后阻止加载共享库。并且yum将被破坏。请注意,您必须在已编辑的二进制文件上重新运行setcap命令。尽管如此,这是这里最有用的答案——特别是如果供应商的构建管道配置错误