All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Serge E. Hallyn" <serge@hallyn.com>
To: John Stultz <john.stultz@linaro.org>
Cc: lkml <linux-kernel@vger.kernel.org>,
	Kees Cook <keescook@chromium.org>,
	"Serge E. Hallyn" <serge@hallyn.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Arjan van de Ven <arjan@linux.intel.com>,
	Oren Laadan <orenl@cellrox.com>,
	Ruchi Kandoi <kandoiruchi@google.com>,
	Rom Lemarchand <romlem@android.com>, Todd Kjos <tkjos@google.com>,
	Colin Cross <ccross@android.com>, Nick Kralevich <nnk@google.com>,
	Dmitry Shmidt <dimitrysh@google.com>,
	Elliott Hughes <enh@google.com>,
	Android Kernel Team <kernel-team@android.com>
Subject: Re: [RFC][PATCH 1/2 v3] proc: Relax /proc/<tid>/timerslack_ns capability requirements
Date: Mon, 18 Jul 2016 15:22:49 -0500	[thread overview]
Message-ID: <20160718202249.GA24233@mail.hallyn.com> (raw)
In-Reply-To: <1468872671-9002-1-git-send-email-john.stultz@linaro.org>

Quoting John Stultz (john.stultz@linaro.org):
> When an interface to allow a task to change another tasks
> timerslack was first proposed, it was suggested that something
> greater then CAP_SYS_NICE would be needed, as a task could be
> delayed further then what normally could be done with nice
> adjustments.
> 
> So CAP_SYS_PTRACE was adopted instead for what became the
> /proc/<tid>/timerslack_ns interface. However, for Android (where
> this feature originates), giving the system_server
> CAP_SYS_PTRACE would allow it to observe and modify all tasks
> memory. This is considered too high a privilege level for only
> needing to change the timerslack.
> 
> After some discussion, it was realized that a CAP_SYS_NICE
> process can set a task as SCHED_FIFO, so they could fork some
> spinning processes and set them all SCHED_FIFO 99, in effect
> delaying all other tasks for an infinite amount of time.
> 
> So as a CAP_SYS_NICE task can already cause trouble for other
> tasks, using it as a required capability for accessing and
> modifying /proc/<tid>/timerslack_ns seems sufficient.
> 
> Thus, this patch loosens the capability requirements to
> CAP_SYS_NICE and removes CAP_SYS_PTRACE, simplifying some
> of the code flow as well.
> 
> This is technically an ABI change, but as the feature just
> landed in 4.6, I suspect no one is yet using it.
> 
> Cc: Kees Cook <keescook@chromium.org>
> Cc: "Serge E. Hallyn" <serge@hallyn.com>

Acked-by: Serge Hallyn <serge@hallyn.com>

> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> CC: Arjan van de Ven <arjan@linux.intel.com>
> Cc: Oren Laadan <orenl@cellrox.com>
> Cc: Ruchi Kandoi <kandoiruchi@google.com>
> Cc: Rom Lemarchand <romlem@android.com>
> Cc: Todd Kjos <tkjos@google.com>
> Cc: Colin Cross <ccross@android.com>
> Cc: Nick Kralevich <nnk@google.com>
> Cc: Dmitry Shmidt <dimitrysh@google.com>
> Cc: Elliott Hughes <enh@google.com>
> Cc: Android Kernel Team <kernel-team@android.com>
> Signed-off-by: John Stultz <john.stultz@linaro.org>
> ---
> v2: Removed CAP_SYS_PTRACE check and simplified code flow
> v3: Tweaked where CAP_SYS_NICE check is made, suggeded by NickK
> 
>  fs/proc/base.c | 34 ++++++++++++++++++++--------------
>  1 file changed, 20 insertions(+), 14 deletions(-)
> 
> diff --git a/fs/proc/base.c b/fs/proc/base.c
> index a11eb71..c94abae 100644
> --- a/fs/proc/base.c
> +++ b/fs/proc/base.c
> @@ -2281,16 +2281,19 @@ static ssize_t timerslack_ns_write(struct file *file, const char __user *buf,
>  	if (!p)
>  		return -ESRCH;
>  
> -	if (ptrace_may_access(p, PTRACE_MODE_ATTACH_FSCREDS)) {
> -		task_lock(p);
> -		if (slack_ns == 0)
> -			p->timer_slack_ns = p->default_timer_slack_ns;
> -		else
> -			p->timer_slack_ns = slack_ns;
> -		task_unlock(p);
> -	} else
> +	if (!capable(CAP_SYS_NICE)) {
>  		count = -EPERM;
> +		goto out;
> +	}
> +
> +	task_lock(p);
> +	if (slack_ns == 0)
> +		p->timer_slack_ns = p->default_timer_slack_ns;
> +	else
> +		p->timer_slack_ns = slack_ns;
> +	task_unlock(p);
>  
> +out:
>  	put_task_struct(p);
>  
>  	return count;
> @@ -2300,19 +2303,22 @@ static int timerslack_ns_show(struct seq_file *m, void *v)
>  {
>  	struct inode *inode = m->private;
>  	struct task_struct *p;
> -	int err =  0;
> +	int err = 0;
>  
>  	p = get_proc_task(inode);
>  	if (!p)
>  		return -ESRCH;
>  
> -	if (ptrace_may_access(p, PTRACE_MODE_ATTACH_FSCREDS)) {
> -		task_lock(p);
> -		seq_printf(m, "%llu\n", p->timer_slack_ns);
> -		task_unlock(p);
> -	} else
> +	if (!capable(CAP_SYS_NICE)) {
>  		err = -EPERM;
> +		goto out;
> +	}
>  
> +	task_lock(p);
> +	seq_printf(m, "%llu\n", p->timer_slack_ns);
> +	task_unlock(p);
> +
> +out:
>  	put_task_struct(p);
>  
>  	return err;
> -- 
> 1.9.1

  parent reply	other threads:[~2016-07-18 20:22 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-07-18 20:11 [RFC][PATCH 1/2 v3] proc: Relax /proc/<tid>/timerslack_ns capability requirements John Stultz
2016-07-18 20:11 ` [RFC][PATCH 2/2 v3] security: Add task_settimerslack/task_gettimerslack LSM hook John Stultz
2016-07-18 20:17   ` Nick Kralevich
2016-07-18 20:23   ` Serge E. Hallyn
2016-07-18 20:43   ` Kees Cook
2016-07-20  6:12   ` James Morris
2016-07-21  5:54     ` John Stultz
2016-07-21 11:43       ` James Morris
2016-07-18 20:16 ` [RFC][PATCH 1/2 v3] proc: Relax /proc/<tid>/timerslack_ns capability requirements Nick Kralevich
2016-07-18 20:22 ` Serge E. Hallyn [this message]
2016-07-18 20:41 ` Kees Cook

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160718202249.GA24233@mail.hallyn.com \
    --to=serge@hallyn.com \
    --cc=akpm@linux-foundation.org \
    --cc=arjan@linux.intel.com \
    --cc=ccross@android.com \
    --cc=dimitrysh@google.com \
    --cc=enh@google.com \
    --cc=john.stultz@linaro.org \
    --cc=kandoiruchi@google.com \
    --cc=keescook@chromium.org \
    --cc=kernel-team@android.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nnk@google.com \
    --cc=orenl@cellrox.com \
    --cc=romlem@android.com \
    --cc=tglx@linutronix.de \
    --cc=tkjos@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.