diff options
-rw-r--r-- | include/linux/cred.h | 2 | ||||
-rw-r--r-- | kernel/ptrace.c | 10 | ||||
-rw-r--r-- | kernel/sched/core.c | 10 | ||||
-rw-r--r-- | security/yama/yama_lsm.c | 12 |
4 files changed, 25 insertions, 9 deletions
diff --git a/include/linux/cred.h b/include/linux/cred.h index ebbed2ce6637..856d2622d832 100644 --- a/include/linux/cred.h +++ b/include/linux/cred.h | |||
@@ -357,10 +357,8 @@ static inline void put_cred(const struct cred *_cred) | |||
357 | extern struct user_namespace init_user_ns; | 357 | extern struct user_namespace init_user_ns; |
358 | #ifdef CONFIG_USER_NS | 358 | #ifdef CONFIG_USER_NS |
359 | #define current_user_ns() (current_cred_xxx(user_ns)) | 359 | #define current_user_ns() (current_cred_xxx(user_ns)) |
360 | #define task_user_ns(task) (task_cred_xxx((task), user_ns)) | ||
361 | #else | 360 | #else |
362 | #define current_user_ns() (&init_user_ns) | 361 | #define current_user_ns() (&init_user_ns) |
363 | #define task_user_ns(task) (&init_user_ns) | ||
364 | #endif | 362 | #endif |
365 | 363 | ||
366 | 364 | ||
diff --git a/kernel/ptrace.c b/kernel/ptrace.c index 1f5e55dda955..7b09b88862cc 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c | |||
@@ -215,8 +215,12 @@ ok: | |||
215 | smp_rmb(); | 215 | smp_rmb(); |
216 | if (task->mm) | 216 | if (task->mm) |
217 | dumpable = get_dumpable(task->mm); | 217 | dumpable = get_dumpable(task->mm); |
218 | if (!dumpable && !ptrace_has_cap(task_user_ns(task), mode)) | 218 | rcu_read_lock(); |
219 | if (!dumpable && !ptrace_has_cap(__task_cred(task)->user_ns, mode)) { | ||
220 | rcu_read_unlock(); | ||
219 | return -EPERM; | 221 | return -EPERM; |
222 | } | ||
223 | rcu_read_unlock(); | ||
220 | 224 | ||
221 | return security_ptrace_access_check(task, mode); | 225 | return security_ptrace_access_check(task, mode); |
222 | } | 226 | } |
@@ -280,8 +284,10 @@ static int ptrace_attach(struct task_struct *task, long request, | |||
280 | 284 | ||
281 | if (seize) | 285 | if (seize) |
282 | flags |= PT_SEIZED; | 286 | flags |= PT_SEIZED; |
283 | if (ns_capable(task_user_ns(task), CAP_SYS_PTRACE)) | 287 | rcu_read_lock(); |
288 | if (ns_capable(__task_cred(task)->user_ns, CAP_SYS_PTRACE)) | ||
284 | flags |= PT_PTRACE_CAP; | 289 | flags |= PT_PTRACE_CAP; |
290 | rcu_read_unlock(); | ||
285 | task->ptrace = flags; | 291 | task->ptrace = flags; |
286 | 292 | ||
287 | __ptrace_link(task, current); | 293 | __ptrace_link(task, current); |
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 2d8927fda712..2f5eb1838b3e 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
@@ -4029,8 +4029,14 @@ long sched_setaffinity(pid_t pid, const struct cpumask *in_mask) | |||
4029 | goto out_free_cpus_allowed; | 4029 | goto out_free_cpus_allowed; |
4030 | } | 4030 | } |
4031 | retval = -EPERM; | 4031 | retval = -EPERM; |
4032 | if (!check_same_owner(p) && !ns_capable(task_user_ns(p), CAP_SYS_NICE)) | 4032 | if (!check_same_owner(p)) { |
4033 | goto out_unlock; | 4033 | rcu_read_lock(); |
4034 | if (!ns_capable(__task_cred(p)->user_ns, CAP_SYS_NICE)) { | ||
4035 | rcu_read_unlock(); | ||
4036 | goto out_unlock; | ||
4037 | } | ||
4038 | rcu_read_unlock(); | ||
4039 | } | ||
4034 | 4040 | ||
4035 | retval = security_task_setscheduler(p); | 4041 | retval = security_task_setscheduler(p); |
4036 | if (retval) | 4042 | if (retval) |
diff --git a/security/yama/yama_lsm.c b/security/yama/yama_lsm.c index b4c29848b49d..0e72239aeb05 100644 --- a/security/yama/yama_lsm.c +++ b/security/yama/yama_lsm.c | |||
@@ -262,14 +262,18 @@ int yama_ptrace_access_check(struct task_struct *child, | |||
262 | /* No additional restrictions. */ | 262 | /* No additional restrictions. */ |
263 | break; | 263 | break; |
264 | case YAMA_SCOPE_RELATIONAL: | 264 | case YAMA_SCOPE_RELATIONAL: |
265 | rcu_read_lock(); | ||
265 | if (!task_is_descendant(current, child) && | 266 | if (!task_is_descendant(current, child) && |
266 | !ptracer_exception_found(current, child) && | 267 | !ptracer_exception_found(current, child) && |
267 | !ns_capable(task_user_ns(child), CAP_SYS_PTRACE)) | 268 | !ns_capable(__task_cred(child)->user_ns, CAP_SYS_PTRACE)) |
268 | rc = -EPERM; | 269 | rc = -EPERM; |
270 | rcu_read_unlock(); | ||
269 | break; | 271 | break; |
270 | case YAMA_SCOPE_CAPABILITY: | 272 | case YAMA_SCOPE_CAPABILITY: |
271 | if (!ns_capable(task_user_ns(child), CAP_SYS_PTRACE)) | 273 | rcu_read_lock(); |
274 | if (!ns_capable(__task_cred(child)->user_ns, CAP_SYS_PTRACE)) | ||
272 | rc = -EPERM; | 275 | rc = -EPERM; |
276 | rcu_read_unlock(); | ||
273 | break; | 277 | break; |
274 | case YAMA_SCOPE_NO_ATTACH: | 278 | case YAMA_SCOPE_NO_ATTACH: |
275 | default: | 279 | default: |
@@ -307,8 +311,10 @@ int yama_ptrace_traceme(struct task_struct *parent) | |||
307 | /* Only disallow PTRACE_TRACEME on more aggressive settings. */ | 311 | /* Only disallow PTRACE_TRACEME on more aggressive settings. */ |
308 | switch (ptrace_scope) { | 312 | switch (ptrace_scope) { |
309 | case YAMA_SCOPE_CAPABILITY: | 313 | case YAMA_SCOPE_CAPABILITY: |
310 | if (!ns_capable(task_user_ns(parent), CAP_SYS_PTRACE)) | 314 | rcu_read_lock(); |
315 | if (!ns_capable(__task_cred(parent)->user_ns, CAP_SYS_PTRACE)) | ||
311 | rc = -EPERM; | 316 | rc = -EPERM; |
317 | rcu_read_unlock(); | ||
312 | break; | 318 | break; |
313 | case YAMA_SCOPE_NO_ATTACH: | 319 | case YAMA_SCOPE_NO_ATTACH: |
314 | rc = -EPERM; | 320 | rc = -EPERM; |