需为无特权进程proc1配置哪些能力以运行start-stop-daemon杀死proc2
要解决这个问题,咱们得先抓住核心:无特权进程要杀死root启动的进程,最关键的就是CAP_KILL能力——这是Linux专门用来允许进程向其他UID(包括root)进程发送信号的能力。不过因为你是通过/bin/sh中转调用start-stop-daemon,得额外处理能力在exec调用后的传递问题,具体步骤如下:
1. 给proc1二进制文件添加CAP_KILL能力
用setcap工具给你的proc1程序设置允许(permitted)和继承(inheritable)的CAP_KILL能力,这样后续exec启动的进程才有机会继承到这个能力:
setcap cap_kill+ip /path/to/your/proc1
+p:把CAP_KILL加入进程的允许能力集(permitted set),表示进程可以使用这个能力+i:把CAP_KILL加入进程的继承能力集(inheritable set),确保exec后的子进程能继承这个能力
2. 在proc1代码中保留能力(关键步骤)
默认情况下,Linux进程执行exec时会清空有效能力集,还会丢弃允许能力集——除非你通过prctl设置PR_SET_KEEPCAPS标志。所以在proc1调用execl之前,必须加上这段代码:
#include <sys/prctl.h> // ... // 在execl调用前执行 if (prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0) == -1) { perror("prctl failed to keep capabilities"); exit(EXIT_FAILURE); } // 然后调用execl execl("/bin/sh","sh","-c","/etc/init.d/proc2 restart",nullptr);
这个操作会告诉内核:在exec新进程后,保留当前进程的允许能力集,这样/bin/sh启动后就能拿到CAP_KILL的允许权限。
注意事项
这里有个小坑:/bin/sh本身不会主动把允许能力提升为有效能力,所以start-stop-daemon需要自己在代码里执行能力提升操作(比如用cap_set_proc),把CAP_KILL从允许集转到有效集才能实际使用。如果start-stop-daemon没做这个处理,可能还是杀不掉proc2。
更省心的替代方案
如果你的场景允许,直接给start-stop-daemon加CAP_KILL的文件能力会更靠谱——这样不管哪个进程调用它,都能获得杀死root进程的权限,不用折腾proc1的能力传递:
setcap cap_kill+p /sbin/start-stop-daemon
内容的提问来源于stack exchange,提问作者wjow
相关产品推荐
相关产品推荐

