diff options
| -rw-r--r-- | security/apparmor/capability.c | 15 | ||||
| -rw-r--r-- | security/apparmor/domain.c | 2 | ||||
| -rw-r--r-- | security/apparmor/include/capability.h | 5 | ||||
| -rw-r--r-- | security/apparmor/include/ipc.h | 4 | ||||
| -rw-r--r-- | security/apparmor/ipc.c | 9 | ||||
| -rw-r--r-- | security/apparmor/lsm.c | 2 |
6 files changed, 15 insertions, 22 deletions
diff --git a/security/apparmor/capability.c b/security/apparmor/capability.c index 84d1f5f53877..1101c6f64bb7 100644 --- a/security/apparmor/capability.c +++ b/security/apparmor/capability.c | |||
| @@ -53,8 +53,7 @@ static void audit_cb(struct audit_buffer *ab, void *va) | |||
| 53 | 53 | ||
| 54 | /** | 54 | /** |
| 55 | * audit_caps - audit a capability | 55 | * audit_caps - audit a capability |
| 56 | * @profile: profile confining task (NOT NULL) | 56 | * @profile: profile being tested for confinement (NOT NULL) |
| 57 | * @task: task capability test was performed against (NOT NULL) | ||
| 58 | * @cap: capability tested | 57 | * @cap: capability tested |
| 59 | * @error: error code returned by test | 58 | * @error: error code returned by test |
| 60 | * | 59 | * |
| @@ -63,8 +62,7 @@ static void audit_cb(struct audit_buffer *ab, void *va) | |||
| 63 | * | 62 | * |
| 64 | * Returns: 0 or sa->error on success, error code on failure | 63 | * Returns: 0 or sa->error on success, error code on failure |
| 65 | */ | 64 | */ |
| 66 | static int audit_caps(struct aa_profile *profile, struct task_struct *task, | 65 | static int audit_caps(struct aa_profile *profile, int cap, int error) |
| 67 | int cap, int error) | ||
| 68 | { | 66 | { |
| 69 | struct audit_cache *ent; | 67 | struct audit_cache *ent; |
| 70 | int type = AUDIT_APPARMOR_AUTO; | 68 | int type = AUDIT_APPARMOR_AUTO; |
| @@ -73,7 +71,6 @@ static int audit_caps(struct aa_profile *profile, struct task_struct *task, | |||
| 73 | sa.type = LSM_AUDIT_DATA_CAP; | 71 | sa.type = LSM_AUDIT_DATA_CAP; |
| 74 | sa.aad = &aad; | 72 | sa.aad = &aad; |
| 75 | sa.u.cap = cap; | 73 | sa.u.cap = cap; |
| 76 | sa.aad->tsk = task; | ||
| 77 | sa.aad->op = OP_CAPABLE; | 74 | sa.aad->op = OP_CAPABLE; |
| 78 | sa.aad->error = error; | 75 | sa.aad->error = error; |
| 79 | 76 | ||
| @@ -124,8 +121,7 @@ static int profile_capable(struct aa_profile *profile, int cap) | |||
| 124 | 121 | ||
| 125 | /** | 122 | /** |
| 126 | * aa_capable - test permission to use capability | 123 | * aa_capable - test permission to use capability |
| 127 | * @task: task doing capability test against (NOT NULL) | 124 | * @profile: profile being tested against (NOT NULL) |
| 128 | * @profile: profile confining @task (NOT NULL) | ||
| 129 | * @cap: capability to be tested | 125 | * @cap: capability to be tested |
| 130 | * @audit: whether an audit record should be generated | 126 | * @audit: whether an audit record should be generated |
| 131 | * | 127 | * |
| @@ -133,8 +129,7 @@ static int profile_capable(struct aa_profile *profile, int cap) | |||
| 133 | * | 129 | * |
| 134 | * Returns: 0 on success, or else an error code. | 130 | * Returns: 0 on success, or else an error code. |
| 135 | */ | 131 | */ |
| 136 | int aa_capable(struct task_struct *task, struct aa_profile *profile, int cap, | 132 | int aa_capable(struct aa_profile *profile, int cap, int audit) |
| 137 | int audit) | ||
| 138 | { | 133 | { |
| 139 | int error = profile_capable(profile, cap); | 134 | int error = profile_capable(profile, cap); |
| 140 | 135 | ||
| @@ -144,5 +139,5 @@ int aa_capable(struct task_struct *task, struct aa_profile *profile, int cap, | |||
| 144 | return error; | 139 | return error; |
| 145 | } | 140 | } |
| 146 | 141 | ||
| 147 | return audit_caps(profile, task, cap, error); | 142 | return audit_caps(profile, cap, error); |
| 148 | } | 143 | } |
diff --git a/security/apparmor/domain.c b/security/apparmor/domain.c index 26c607c971f5..e5538a12d162 100644 --- a/security/apparmor/domain.c +++ b/security/apparmor/domain.c | |||
| @@ -75,7 +75,7 @@ static int may_change_ptraced_domain(struct task_struct *task, | |||
| 75 | if (!tracer || unconfined(tracerp)) | 75 | if (!tracer || unconfined(tracerp)) |
| 76 | goto out; | 76 | goto out; |
| 77 | 77 | ||
| 78 | error = aa_may_ptrace(tracer, tracerp, to_profile, PTRACE_MODE_ATTACH); | 78 | error = aa_may_ptrace(tracerp, to_profile, PTRACE_MODE_ATTACH); |
| 79 | 79 | ||
| 80 | out: | 80 | out: |
| 81 | rcu_read_unlock(); | 81 | rcu_read_unlock(); |
diff --git a/security/apparmor/include/capability.h b/security/apparmor/include/capability.h index 2e7c9d6a2f3b..fc3fa381d850 100644 --- a/security/apparmor/include/capability.h +++ b/security/apparmor/include/capability.h | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * This file contains AppArmor capability mediation definitions. | 4 | * This file contains AppArmor capability mediation definitions. |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 1998-2008 Novell/SUSE | 6 | * Copyright (C) 1998-2008 Novell/SUSE |
| 7 | * Copyright 2009-2010 Canonical Ltd. | 7 | * Copyright 2009-2013 Canonical Ltd. |
| 8 | * | 8 | * |
| 9 | * This program is free software; you can redistribute it and/or | 9 | * This program is free software; you can redistribute it and/or |
| 10 | * modify it under the terms of the GNU General Public License as | 10 | * modify it under the terms of the GNU General Public License as |
| @@ -38,8 +38,7 @@ struct aa_caps { | |||
| 38 | 38 | ||
| 39 | extern struct aa_fs_entry aa_fs_entry_caps[]; | 39 | extern struct aa_fs_entry aa_fs_entry_caps[]; |
| 40 | 40 | ||
| 41 | int aa_capable(struct task_struct *task, struct aa_profile *profile, int cap, | 41 | int aa_capable(struct aa_profile *profile, int cap, int audit); |
| 42 | int audit); | ||
| 43 | 42 | ||
| 44 | static inline void aa_free_cap_rules(struct aa_caps *caps) | 43 | static inline void aa_free_cap_rules(struct aa_caps *caps) |
| 45 | { | 44 | { |
diff --git a/security/apparmor/include/ipc.h b/security/apparmor/include/ipc.h index aeda0fbc8b2f..288ca76e2fb1 100644 --- a/security/apparmor/include/ipc.h +++ b/security/apparmor/include/ipc.h | |||
| @@ -19,8 +19,8 @@ | |||
| 19 | 19 | ||
| 20 | struct aa_profile; | 20 | struct aa_profile; |
| 21 | 21 | ||
| 22 | int aa_may_ptrace(struct task_struct *tracer_task, struct aa_profile *tracer, | 22 | int aa_may_ptrace(struct aa_profile *tracer, struct aa_profile *tracee, |
| 23 | struct aa_profile *tracee, unsigned int mode); | 23 | unsigned int mode); |
| 24 | 24 | ||
| 25 | int aa_ptrace(struct task_struct *tracer, struct task_struct *tracee, | 25 | int aa_ptrace(struct task_struct *tracer, struct task_struct *tracee, |
| 26 | unsigned int mode); | 26 | unsigned int mode); |
diff --git a/security/apparmor/ipc.c b/security/apparmor/ipc.c index c51d2266587e..777ac1c47253 100644 --- a/security/apparmor/ipc.c +++ b/security/apparmor/ipc.c | |||
| @@ -54,15 +54,14 @@ static int aa_audit_ptrace(struct aa_profile *profile, | |||
| 54 | 54 | ||
| 55 | /** | 55 | /** |
| 56 | * aa_may_ptrace - test if tracer task can trace the tracee | 56 | * aa_may_ptrace - test if tracer task can trace the tracee |
| 57 | * @tracer_task: task who will do the tracing (NOT NULL) | ||
| 58 | * @tracer: profile of the task doing the tracing (NOT NULL) | 57 | * @tracer: profile of the task doing the tracing (NOT NULL) |
| 59 | * @tracee: task to be traced | 58 | * @tracee: task to be traced |
| 60 | * @mode: whether PTRACE_MODE_READ || PTRACE_MODE_ATTACH | 59 | * @mode: whether PTRACE_MODE_READ || PTRACE_MODE_ATTACH |
| 61 | * | 60 | * |
| 62 | * Returns: %0 else error code if permission denied or error | 61 | * Returns: %0 else error code if permission denied or error |
| 63 | */ | 62 | */ |
| 64 | int aa_may_ptrace(struct task_struct *tracer_task, struct aa_profile *tracer, | 63 | int aa_may_ptrace(struct aa_profile *tracer, struct aa_profile *tracee, |
| 65 | struct aa_profile *tracee, unsigned int mode) | 64 | unsigned int mode) |
| 66 | { | 65 | { |
| 67 | /* TODO: currently only based on capability, not extended ptrace | 66 | /* TODO: currently only based on capability, not extended ptrace |
| 68 | * rules, | 67 | * rules, |
| @@ -72,7 +71,7 @@ int aa_may_ptrace(struct task_struct *tracer_task, struct aa_profile *tracer, | |||
| 72 | if (unconfined(tracer) || tracer == tracee) | 71 | if (unconfined(tracer) || tracer == tracee) |
| 73 | return 0; | 72 | return 0; |
| 74 | /* log this capability request */ | 73 | /* log this capability request */ |
| 75 | return aa_capable(tracer_task, tracer, CAP_SYS_PTRACE, 1); | 74 | return aa_capable(tracer, CAP_SYS_PTRACE, 1); |
| 76 | } | 75 | } |
| 77 | 76 | ||
| 78 | /** | 77 | /** |
| @@ -101,7 +100,7 @@ int aa_ptrace(struct task_struct *tracer, struct task_struct *tracee, | |||
| 101 | if (!unconfined(tracer_p)) { | 100 | if (!unconfined(tracer_p)) { |
| 102 | struct aa_profile *tracee_p = aa_get_task_profile(tracee); | 101 | struct aa_profile *tracee_p = aa_get_task_profile(tracee); |
| 103 | 102 | ||
| 104 | error = aa_may_ptrace(tracer, tracer_p, tracee_p, mode); | 103 | error = aa_may_ptrace(tracer_p, tracee_p, mode); |
| 105 | error = aa_audit_ptrace(tracer_p, tracee_p, error); | 104 | error = aa_audit_ptrace(tracer_p, tracee_p, error); |
| 106 | 105 | ||
| 107 | aa_put_profile(tracee_p); | 106 | aa_put_profile(tracee_p); |
diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c index fb99e18123b4..4257b7e2796b 100644 --- a/security/apparmor/lsm.c +++ b/security/apparmor/lsm.c | |||
| @@ -145,7 +145,7 @@ static int apparmor_capable(const struct cred *cred, struct user_namespace *ns, | |||
| 145 | if (!error) { | 145 | if (!error) { |
| 146 | profile = aa_cred_profile(cred); | 146 | profile = aa_cred_profile(cred); |
| 147 | if (!unconfined(profile)) | 147 | if (!unconfined(profile)) |
| 148 | error = aa_capable(current, profile, cap, audit); | 148 | error = aa_capable(profile, cap, audit); |
| 149 | } | 149 | } |
| 150 | return error; | 150 | return error; |
| 151 | } | 151 | } |
