linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* PATCH? fix unshare(NEWPID) && vfork()
@ 2013-08-19 17:25 Oleg Nesterov
  2013-08-19 17:46 ` Linus Torvalds
  2013-08-19 18:10 ` Andy Lutomirski
  0 siblings, 2 replies; 21+ messages in thread
From: Oleg Nesterov @ 2013-08-19 17:25 UTC (permalink / raw)
  To: Andy Lutomirski, Brad Spengler, Eric W. Biederman, Linus Torvalds
  Cc: Colin Walters, linux-kernel

Hello.

Colin reports that vfork() doesn't work after unshare(PIDNS). The
reason is trivial, copy_process() does:

	/*
	 * If the new process will be in a different pid namespace
	 * don't allow the creation of threads.
	 */
	if ((clone_flags & (CLONE_VM|CLONE_NEWPID)) &&
	    (task_active_pid_ns(current) != current->nsproxy->pid_ns))
		return ERR_PTR(-EINVAL);

and CLONE_VM obviously nacks vfork(). So perhaps we can relax
this check to CLONE_THREAD? Or should we really nack CLONE_VM
by security reasons?

OTOH. Perhaps we should also deny CLONE_PARENT in this case?

In short. So far I am thinking about the patch below but I got
lost and totally confused. Will try to think more tomorrow, but
I would like to see the fix from someone who still understands
this all.

Oleg.

--- x/kernel/fork.c	2013-08-14 18:34:06.000000000 +0200
+++ x/kernel/fork.c	2013-08-19 19:03:43.848823039 +0200
@@ -1172,14 +1172,6 @@ static struct task_struct *copy_process(
 				current->signal->flags & SIGNAL_UNKILLABLE)
 		return ERR_PTR(-EINVAL);
 
-	/*
-	 * If the new process will be in a different pid namespace
-	 * don't allow the creation of threads.
-	 */
-	if ((clone_flags & (CLONE_VM|CLONE_NEWPID)) &&
-	    (task_active_pid_ns(current) != current->nsproxy->pid_ns))
-		return ERR_PTR(-EINVAL);
-
 	retval = security_task_create(clone_flags);
 	if (retval)
 		goto fork_out;
@@ -1578,8 +1570,9 @@ long do_fork(unsigned long clone_flags,
 	 * Do some preliminary argument and permissions checking before we
 	 * actually start allocating stuff
 	 */
-	if (clone_flags & (CLONE_NEWUSER | CLONE_NEWPID)) {
-		if (clone_flags & (CLONE_THREAD|CLONE_PARENT))
+	if ((clone_flags & (CLONE_NEWUSER | CLONE_NEWPID)) ||
+	    (task_active_pid_ns(current) != current->nsproxy->pid_ns)) {
+		if (clone_flags & (CLONE_THREAD | CLONE_PARENT | CLONE_NEWPID))
 			return -EINVAL;
 	}
 


^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2013-08-22 16:52 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-08-19 17:25 PATCH? fix unshare(NEWPID) && vfork() Oleg Nesterov
2013-08-19 17:46 ` Linus Torvalds
2013-08-19 17:51   ` Oleg Nesterov
2013-08-19 18:10 ` Andy Lutomirski
2013-08-19 18:33   ` Oleg Nesterov
2013-08-19 18:40     ` Andy Lutomirski
2013-08-19 18:43       ` Oleg Nesterov
2013-08-20 17:55         ` Eric W. Biederman
2013-08-20 18:45           ` Oleg Nesterov
2013-08-20 20:52             ` Eric W. Biederman
2013-08-21 16:35               ` Oleg Nesterov
2013-08-22 16:47                 ` Oleg Nesterov
2013-08-20 17:59         ` Andy Lutomirski
2013-08-20 18:50           ` Oleg Nesterov
2013-08-20 19:00             ` Andy Lutomirski
2013-08-20 19:05               ` Oleg Nesterov
2013-08-20 19:13                 ` Andy Lutomirski
2013-08-20 19:23                   ` Oleg Nesterov
2013-08-20 19:38                     ` Andy Lutomirski
2013-08-21 12:24                       ` Oleg Nesterov
2013-08-20 20:25               ` Eric W. Biederman

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).