我正在编写一个包含Python和C ++库的应用程序。 Python部分需要发送和接收原始数据包,因此我给Python可执行文件CAP_NET_RAW
能力。
我还在同一程序中使用Cython加载C ++共享库。我想用依赖关系的相对路径编译共享库 - 即使用$ORIGIN
特殊变量。
但是,由于Python具有CAP_NET_RAW
功能,因此Linux将其视为setuid
程序,并忽略共享库的依赖关系定义so they fail to load内的$ORIGIN
字符串:< / p>
为了安全起见,动态链接器不允许对set-user和set-group ID程序使用
$ORIGIN
替换序列。对于出现在DT_RUNPATH
动态数组条目指定的字符串中的此类序列,将忽略包含$ORIGIN
序列的特定搜索路径(尽管处理同一字符串中的其他搜索路径)。将$ORIGIN
条目或作为参数传递给DT_NEEDED
的路径中的dlopen()
个序列视为错误。对于具有已安装扩展安全机制的系统具有超过最小权限的进程,可能会应用相同的限制。
这种安全功能给我们带来了很大的痛苦。我们必须编译共享库将具有完整路径依赖性,并且它们在开发机器之间不可移植。
有没有办法在Linux中禁用此安全功能,以便为具有额外功能的程序解释$ORIGIN
?