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的父程程序无法将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 >如本文所述
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- std::cout.imbue()多重调用
- execve()的envp arg arm中的ld_library_path即使调用setuid part删除了其特权,