diff options
author | Kees Cook <kees.cook@canonical.com> | 2010-02-03 18:36:43 -0500 |
---|---|---|
committer | James Morris <jmorris@namei.org> | 2010-02-03 22:20:12 -0500 |
commit | 002345925e6c45861f60db6f4fc6236713fd8847 (patch) | |
tree | d7849eafe1755116597166bbebf43e2bee86cb76 /security | |
parent | 0719aaf5ead7555b7b7a4a080ebf2826a871384e (diff) |
syslog: distinguish between /proc/kmsg and syscalls
This allows the LSM to distinguish between syslog functions originating
from /proc/kmsg access and direct syscalls. By default, the commoncaps
will now no longer require CAP_SYS_ADMIN to read an opened /proc/kmsg
file descriptor. For example the kernel syslog reader can now drop
privileges after opening /proc/kmsg, instead of staying privileged with
CAP_SYS_ADMIN. MAC systems that implement security_syslog have unchanged
behavior.
Signed-off-by: Kees Cook <kees.cook@canonical.com>
Acked-by: Serge Hallyn <serue@us.ibm.com>
Acked-by: John Johansen <john.johansen@canonical.com>
Signed-off-by: James Morris <jmorris@namei.org>
Diffstat (limited to 'security')
-rw-r--r-- | security/commoncap.c | 7 | ||||
-rw-r--r-- | security/security.c | 4 | ||||
-rw-r--r-- | security/selinux/hooks.c | 5 | ||||
-rw-r--r-- | security/smack/smack_lsm.c | 4 |
4 files changed, 13 insertions, 7 deletions
diff --git a/security/commoncap.c b/security/commoncap.c index f800fdb3de9..677fad9d5cb 100644 --- a/security/commoncap.c +++ b/security/commoncap.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/sched.h> | 27 | #include <linux/sched.h> |
28 | #include <linux/prctl.h> | 28 | #include <linux/prctl.h> |
29 | #include <linux/securebits.h> | 29 | #include <linux/securebits.h> |
30 | #include <linux/syslog.h> | ||
30 | 31 | ||
31 | /* | 32 | /* |
32 | * If a non-root user executes a setuid-root binary in | 33 | * If a non-root user executes a setuid-root binary in |
@@ -888,12 +889,16 @@ error: | |||
888 | /** | 889 | /** |
889 | * cap_syslog - Determine whether syslog function is permitted | 890 | * cap_syslog - Determine whether syslog function is permitted |
890 | * @type: Function requested | 891 | * @type: Function requested |
892 | * @from_file: Whether this request came from an open file (i.e. /proc) | ||
891 | * | 893 | * |
892 | * Determine whether the current process is permitted to use a particular | 894 | * Determine whether the current process is permitted to use a particular |
893 | * syslog function, returning 0 if permission is granted, -ve if not. | 895 | * syslog function, returning 0 if permission is granted, -ve if not. |
894 | */ | 896 | */ |
895 | int cap_syslog(int type) | 897 | int cap_syslog(int type, bool from_file) |
896 | { | 898 | { |
899 | /* /proc/kmsg can open be opened by CAP_SYS_ADMIN */ | ||
900 | if (type != 1 && from_file) | ||
901 | return 0; | ||
897 | if ((type != 3 && type != 10) && !capable(CAP_SYS_ADMIN)) | 902 | if ((type != 3 && type != 10) && !capable(CAP_SYS_ADMIN)) |
898 | return -EPERM; | 903 | return -EPERM; |
899 | return 0; | 904 | return 0; |
diff --git a/security/security.c b/security/security.c index 440afe5eb54..971092c06f3 100644 --- a/security/security.c +++ b/security/security.c | |||
@@ -203,9 +203,9 @@ int security_quota_on(struct dentry *dentry) | |||
203 | return security_ops->quota_on(dentry); | 203 | return security_ops->quota_on(dentry); |
204 | } | 204 | } |
205 | 205 | ||
206 | int security_syslog(int type) | 206 | int security_syslog(int type, bool from_file) |
207 | { | 207 | { |
208 | return security_ops->syslog(type); | 208 | return security_ops->syslog(type, from_file); |
209 | } | 209 | } |
210 | 210 | ||
211 | int security_settime(struct timespec *ts, struct timezone *tz) | 211 | int security_settime(struct timespec *ts, struct timezone *tz) |
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 9a2ee845e9d..a4862a0730f 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
@@ -76,6 +76,7 @@ | |||
76 | #include <linux/selinux.h> | 76 | #include <linux/selinux.h> |
77 | #include <linux/mutex.h> | 77 | #include <linux/mutex.h> |
78 | #include <linux/posix-timers.h> | 78 | #include <linux/posix-timers.h> |
79 | #include <linux/syslog.h> | ||
79 | 80 | ||
80 | #include "avc.h" | 81 | #include "avc.h" |
81 | #include "objsec.h" | 82 | #include "objsec.h" |
@@ -2049,11 +2050,11 @@ static int selinux_quota_on(struct dentry *dentry) | |||
2049 | return dentry_has_perm(cred, NULL, dentry, FILE__QUOTAON); | 2050 | return dentry_has_perm(cred, NULL, dentry, FILE__QUOTAON); |
2050 | } | 2051 | } |
2051 | 2052 | ||
2052 | static int selinux_syslog(int type) | 2053 | static int selinux_syslog(int type, bool from_file) |
2053 | { | 2054 | { |
2054 | int rc; | 2055 | int rc; |
2055 | 2056 | ||
2056 | rc = cap_syslog(type); | 2057 | rc = cap_syslog(type, from_file); |
2057 | if (rc) | 2058 | if (rc) |
2058 | return rc; | 2059 | return rc; |
2059 | 2060 | ||
diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index 529c9ca6587..a5721b373f5 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c | |||
@@ -157,12 +157,12 @@ static int smack_ptrace_traceme(struct task_struct *ptp) | |||
157 | * | 157 | * |
158 | * Returns 0 on success, error code otherwise. | 158 | * Returns 0 on success, error code otherwise. |
159 | */ | 159 | */ |
160 | static int smack_syslog(int type) | 160 | static int smack_syslog(int type, bool from_file) |
161 | { | 161 | { |
162 | int rc; | 162 | int rc; |
163 | char *sp = current_security(); | 163 | char *sp = current_security(); |
164 | 164 | ||
165 | rc = cap_syslog(type); | 165 | rc = cap_syslog(type, from_file); |
166 | if (rc != 0) | 166 | if (rc != 0) |
167 | return rc; | 167 | return rc; |
168 | 168 | ||