F Florian Weimer #
Message details and related content
* Jürg Billeter:
On Fri, 2018-11-30 at 14:40 +0100, Florian Weimer wrote:quoted
* Jürg Billeter:quoted
This introduces a new thread group flag that can be set by calling prctl(PR_SET_KILL_DESCENDANTS_ON_EXIT, 1, 0, 0, 0) When a thread group exits with this flag set, it will send SIGKILL to all descendant processes. This can be used to prevent stray child processes. This flag is cleared on privilege gaining execve(2) to ensure an unprivileged process cannot get a privileged process to send SIGKILL.So this is inherited across regular execve? I'm not sure that's a good idea.Yes, this matches PR_SET_CHILD_SUBREAPER (and other process attributes). Besides consistency and allowing a parent to configure the flag for a spawned process, this is also needed to prevent a process from clearing the flag (in combination with a seccomp filter).
I think the semantics of PR_SET_CHILD_SUBREAPER are different, and the
behavior makes more sense there.
quoted
quoted
Descendants that are orphaned and reparented to an ancestor of the current process before the current process exits, will not be killed. PR_SET_CHILD_SUBREAPER can be used to contain orphaned processes.For double- or triple-forking daemons, the reparenting will be racy, if I understand things correctly.Can you please elaborate, if you're concerned about a particular race? As the commit message mentions, for containment this flag can be combined with PR_SET_CHILD_SUBREAPER (and PR_SET_NO_NEW_PRIVS).
Without PR_SET_CHILD_SUBREAPER, if a newly execve'ed daemon performs double/triple forking to disentangle itself from the parent process session, and the parent process which set PR_SET_KILL_DESCENDANTS_ON_EXIT terminates, behavior depends on when exactly the parent process terminates. The daemon process will leak if it has completed its reparenting. I think this could be sufficiently common that solution is needed here. Thanks, Florian