是否可以使程序在具有 CAP_NET_RAW 功能的加载共享库中解释 $ORIGIN?

Ami*_*hum 5 c++ linux sudo raw-sockets suid

我正在编写一个同时包含 Python 和 C++ 库的应用程序。Python 部分需要发送和接收原始数据包,因此我为 Python 可执行文件提供了该CAP_NET_RAW功能。

我还在同一程序中使用 Cython 加载 C++ 共享库。我想使用依赖项的相对路径来编译共享库 - 即使用$ORIGIN特殊变量。

然而,由于Python具有此CAP_NET_RAW功能,Linux将其视为setuid程序并忽略$ORIGIN共享库依赖项定义中的字符串,因此它们无法加载

为了安全起见,动态链接器不允许$ORIGIN对设置用户和设置组 ID 程序使用替换序列。对于出现在DT_RUNPATH动态数组条目指定的字符串中的此类序列,包含该$ORIGIN序列的特定搜索路径将被忽略(尽管同一字符串中的其他搜索路径也会被处理)。作为参数传递的条目或路径$ORIGIN中的序列被视为错误。相同的限制可能适用于在安装了扩展安全机制的系统上拥有超过最低权限的进程。DT_NEEDEDdlopen()

这个安全功能给我们带来了很多痛苦。我们必须编译共享库的完整路径依赖项,并且它们在开发机器之间不可移植。

有什么方法可以在 Linux 中禁用此安全功能,以便$ORIGIN将其解释为具有额外功能的程序吗?