我编写了调用fork()
来创建子进程的C应用程序。应用程序以root身份运行。在父进程中,我使用wait()
来等待已终止的子进程。在子进程中,我使用带有prctl()
选项的PR_SET_PDEATHSIG
来检测父进程的死亡。它工作正常。为了降低安全问题的风险,子进程调用setuid()
来更改UID。问题是:子进程无法再检测到父进程的死亡。
我已经四处寻找答案并找到了一些有用的链接,但它没有帮助:
prctl
related):虽然此链接包含明确的答案,但没有解决方案。如何正确地做到这一点?
答案 0 :(得分:0)
我偶然发现了同样的问题,内核重置了凭证更改的PDEATH
信号:
https://github.com/torvalds/linux/blob/master/kernel/cred.c#L450
可以使用以下代码和strace -f
验证:
#include <sys/prctl.h>
#include <unistd.h>
#include <signal.h>
int main(int argc, char *argv[])
{
if (fork() == 0) {
// This works as expected
setgid(1000);
setuid(1000);
prctl(PR_SET_PDEATHSIG, SIGTERM);
// This doesn't work since pdeath_signal will be reset
// setgid(1000);
// setuid(1000);
pause();
}
sleep(1);
kill(getpid(), SIGTERM);
return (0);
}