proc: relax /proc/<tid>/timerslack_ns capability requirements
authorJohn Stultz <>
Sat, 8 Oct 2016 00:02:26 +0000 (17:02 -0700)
committerLinus Torvalds <>
Sat, 8 Oct 2016 01:46:30 +0000 (18:46 -0700)
proc: relax /proc/<tid>/timerslack_ns capability requirements

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.

Signed-off-by: John Stultz <>
Reviewed-by: Nick Kralevich <>
Acked-by: Serge Hallyn <>
Acked-by: Kees Cook <>
Cc: Kees Cook <>
Cc: "Serge E. Hallyn" <>
Cc: Thomas Gleixner <>
Cc: Arjan van de Ven <>
Cc: Oren Laadan <>
Cc: Ruchi Kandoi <>
Cc: Rom Lemarchand <>
Cc: Todd Kjos <>
Cc: Colin Cross <>
Cc: Nick Kralevich <>
Cc: Dmitry Shmidt <>
Cc: Elliott Hughes <>
Cc: Android Kernel Team <>
Signed-off-by: Andrew Morton <>
Signed-off-by: Linus Torvalds <>