execve()的envp arg arm中的ld_library_path即使调用setuid part删除了其特权,

LD_LIBRARY_PATH in envp arg of execve() gets removed even if the calling setuid parent prog dropped its privileged

本文关键字:setuid 调用 part 删除 特权 library envp arg arm execve ld      更新时间:2023-10-16

背景: 我了解到,出于安全原因,带有setUID的父程程序无法将LD_Library_path作为ENV的一部分,因此,任何子进程也不会"查看" LD_LIBRARY_PATH。

上下文: 我的父程程序(请参阅https://github.com/shadow-robot/ethercat_grant/blob/kinetic-devel/src/shercat_grant.cpp)需要设置以更改儿童程序的cap_net_raw之类的功能。但是,儿童程序(例如在我的控制下,例如https://github.com/shadow-robot/ros_ethercat/blob/blob/kinetic-devel/ros_ethercat_ethercat_lloop/src/src/main.cpp)使用libs,使用rpath,您需要访问自己,依赖性libs,不在我的控制之下,而只能通过ld_library_path(由于Ubuntu Bionic Bionic https://github.com/shadow-robot/ethercat_grant_grant_grant_grant/issues/4)在ld_library_path中找到。

所以我需要解决方法将ld_library_path传递到子过程。我以为 execve()应该有所帮助,我的问题仅在这里。

解决方案:我将()ld_library_path =/my/path/在父级应用中,删除特权,然后使用新的env拨打execve()。我想这是安全的,因为在ENV中重新添加的LD_LIBRARY_PATH仅用作标准用户而不是特权用户。请参阅此处的代码https://github.com/ubi-agni/ethercat_grant/blob/env_append/src/ethercat_grant.cpp

问题: ld_library_path在execve()中再次删除。[编辑]如果cap_set_file之前没有使用CAP_SET_FILE,它似乎行为正确(只要在拨打execve之前删除特权,只要删除),因此问题是功能之间的关系,并且Execve和Execve以某种方式[/edit]

研究:我发现了一些仍在开放的报告http://austingroupbugs.net/view.php?id=922,但没有明确解释(在Man Ld中。因此,或其他),即使丢弃特权后的setUID匹配setEuid(对于组相同),execve()也会再次删除ld_library_path。

问题:我想知道这种行为仍然是打算的,或者如果我错过了某些proc/螺纹功能,我也应该更改,以便孩子的过程不继承父母"安全"执行,因此使我的新env保持完整?[编辑]它似乎确实与影响子过程的功能[/edit]

谢谢。

现在,我发现问题来自能力 and 不是来自setuid >如本文所述