使用Linux capabilities实现C++用户态程序启动root子进程问题咨询
非root父进程通过capabilities启动root子进程遗漏配置排查点
- 子进程可执行文件属主配置错误
chmod 4755仅为文件设置setuid执行位,执行时会将进程身份切换为文件的属主,你需要额外执行chown root:root 子进程可执行文件路径将子进程文件的属主设置为root,否则setuid位不会切换到root身份,若子进程内部有root身份校验逻辑会直接启动失败。 - 未实际执行uid/gid切换逻辑
仅将cap_setuid、cap_setgid设为父进程有效能力不会自动切换用户身份,你需要在fork之后、exec之前主动调用setuid(0)、setgid(0)系统调用切换到root用户,否则exec子进程时仍然以父进程的普通用户身份运行,触发权限校验失败。 - 父进程能力集配置缺失
你仅为父进程配置了permitted集的能力,若需要在exec调用后保留能力传递到子进程,必须同时将所需能力加入父进程的*可继承能力集(inheritable set)*与子进程文件的可继承能力集。另外如果父进程运行身份没有子进程可执行文件的访问/执行权限,还需要为父进程补充CAP_DAC_OVERRIDE能力,否则会直接导致exec调用失败。 - 子进程所在分区禁用了suid位
执行mount | grep 子进程文件所在目录检查对应分区的挂载参数,如果存在nosuid标识,那么子进程的4755权限的setuid位会完全失效,执行时无法提升到root权限。 - 父进程securebits配置错误
如果你误开启了SECBIT_NOROOT等标志位,会导致调用setuid(0)切换uid后无法拿到root对应的全量权限,直接触发子进程启动失败。
内容的提问来源于stack exchange,提问作者kishoredbn
相关产品推荐
相关产品推荐

