在
Linux系统中,无特权的
用户启动程序.创建的进程具有CAP_NET_RAW,CAP_NET_ADMIN
功能,模式有效,允许,可继承.
然后,此进程通过
调用fork和execv来
调用另一个程序udhcpc来创建子进程,但子进程不会按预期继承CAP_NET_RAW,CAP_NET_ADMIN
功能.即使在设置
功能之前,我也称为prctl(PR_SET_KEEPCAPS,1).
关于如何在fork后跟execve继承非特权父进程的能力的任何建议?
在execve()上,检查正在执行的
文件(在本例中为udhcpc)的
文件功能集,并与线程的
功能集合在一起.特别是,
文件的Inheritable set与线程的Inheritable set进行AND编辑,以确定新的Permitted集,并且必须设置
文件的Effective位,以便从Permitted集复制新的Effective set.
这意味着在您的情况下,您必须使用setcap cap_net_raw,cap_net_admin = ei / path / to / udhcpc来获得所需的效果(除了在父进程中设置功能之外 – 不需要prctl()).