gpt4 book ai didi

c++ - execve() 的 envp arg 中的 LD_LIBRARY_PATH 被删除,即使调用 setuid parent prog 放弃了它的特权

转载 作者:太空宇宙 更新时间:2023-11-04 04:14:04 25 4
gpt4 key购买 nike

背景: 我知道出于安全原因,带有 setuid 的父程序不能将 LD_LIBRARY_PATH 保留为 env 的一部分,因此任何子进程也不会“看到”LD_LIBRARY_PATH。

上下文: 我的父程序(参见 https://github.com/shadow-robot/ethercat_grant/blob/kinetic-devel/src/ethercat_grant.cpp )需要 setuid 来更改子程序的 CAP_NET_RAW 等功能。然而,子程序(在我的控制下,例如这个 https://github.com/shadow-robot/ros_ethercat/blob/kinetic-devel/ros_ethercat_loop/src/main.cpp )使用通过 RPATH 找到的库,它们本身需要访问依赖库,而不在我的控制下,只能通过 LD_LIBRARY_PATH 找到(由于 ubuntu 仿生 https://github.com/shadow-robot/ethercat_grant/issues/4 中新强制执行的 RUNPATH)。

所以我需要一个解决方法来将 LD_LIBRARY_PATH 传递给子进程。我认为 execve() 应该有所帮助,我的问题仅在于此。

解决方法:我 putenv() LD_LIBRARY_PATH=/my/path/在父应用程序中,删除特权,然后使用新环境调用 execve()。我想这是安全的,因为在环境中重新添加的 LD_LIBRARY_PATH 仅用作标准用户而不是特权用户。在这里查看代码 https://github.com/ubi-agni/ethercat_grant/blob/env_append/src/ethercat_grant.cpp

问题: LD_LIBRARY_PATH 在 execve() 中再次被删除。[编辑] 如果之前未使用 cap_set_file,它似乎表现正确(只要特权在调用 execve 之前被删除),所以问题是功能和 execve 之间的某种关系 [/EDIT]

研究: 我发现了一些旧的仍然公开的关于不良行为的报告 http://austingroupbugs.net/view.php?id=922 ,但没有明确解释(在 man ld.so 或其他文件中)即使 setuid 与 seteuid 匹配(对于组也是如此) ) 删除权限后,execve() 将再次删除 LD_LIBRARY_PATH。

问题:我想知道这种行为仍然是有意的,或者如果我错过了一些 proc/thread 功能,我也应该改变,这样子进程就不会继承父进程的“安全” “执行,从而保持我的新环境完好无损? [编辑] 这似乎真的与影响子进程的能力有关[/编辑]

谢谢。

最佳答案

现在我发现问题出在capabilities 而不是setuid,这似乎也是本文https://stackoverflow.com/a/10215158/10801865 中提到的期望行为

关于c++ - execve() 的 envp arg 中的 LD_LIBRARY_PATH 被删除,即使调用 setuid parent prog 放弃了它的特权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53818499/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com