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 /include/linux/security.h | |
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 'include/linux/security.h')
-rw-r--r-- | include/linux/security.h | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/include/linux/security.h b/include/linux/security.h index 26eca85b2417..a4dc74d86ac6 100644 --- a/include/linux/security.h +++ b/include/linux/security.h | |||
@@ -76,7 +76,7 @@ extern int cap_task_prctl(int option, unsigned long arg2, unsigned long arg3, | |||
76 | extern int cap_task_setscheduler(struct task_struct *p, int policy, struct sched_param *lp); | 76 | extern int cap_task_setscheduler(struct task_struct *p, int policy, struct sched_param *lp); |
77 | extern int cap_task_setioprio(struct task_struct *p, int ioprio); | 77 | extern int cap_task_setioprio(struct task_struct *p, int ioprio); |
78 | extern int cap_task_setnice(struct task_struct *p, int nice); | 78 | extern int cap_task_setnice(struct task_struct *p, int nice); |
79 | extern int cap_syslog(int type); | 79 | extern int cap_syslog(int type, bool from_file); |
80 | extern int cap_vm_enough_memory(struct mm_struct *mm, long pages); | 80 | extern int cap_vm_enough_memory(struct mm_struct *mm, long pages); |
81 | 81 | ||
82 | struct msghdr; | 82 | struct msghdr; |
@@ -1349,6 +1349,7 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts) | |||
1349 | * logging to the console. | 1349 | * logging to the console. |
1350 | * See the syslog(2) manual page for an explanation of the @type values. | 1350 | * See the syslog(2) manual page for an explanation of the @type values. |
1351 | * @type contains the type of action. | 1351 | * @type contains the type of action. |
1352 | * @from_file indicates the context of action (if it came from /proc). | ||
1352 | * Return 0 if permission is granted. | 1353 | * Return 0 if permission is granted. |
1353 | * @settime: | 1354 | * @settime: |
1354 | * Check permission to change the system time. | 1355 | * Check permission to change the system time. |
@@ -1463,7 +1464,7 @@ struct security_operations { | |||
1463 | int (*sysctl) (struct ctl_table *table, int op); | 1464 | int (*sysctl) (struct ctl_table *table, int op); |
1464 | int (*quotactl) (int cmds, int type, int id, struct super_block *sb); | 1465 | int (*quotactl) (int cmds, int type, int id, struct super_block *sb); |
1465 | int (*quota_on) (struct dentry *dentry); | 1466 | int (*quota_on) (struct dentry *dentry); |
1466 | int (*syslog) (int type); | 1467 | int (*syslog) (int type, bool from_file); |
1467 | int (*settime) (struct timespec *ts, struct timezone *tz); | 1468 | int (*settime) (struct timespec *ts, struct timezone *tz); |
1468 | int (*vm_enough_memory) (struct mm_struct *mm, long pages); | 1469 | int (*vm_enough_memory) (struct mm_struct *mm, long pages); |
1469 | 1470 | ||
@@ -1762,7 +1763,7 @@ int security_acct(struct file *file); | |||
1762 | int security_sysctl(struct ctl_table *table, int op); | 1763 | int security_sysctl(struct ctl_table *table, int op); |
1763 | int security_quotactl(int cmds, int type, int id, struct super_block *sb); | 1764 | int security_quotactl(int cmds, int type, int id, struct super_block *sb); |
1764 | int security_quota_on(struct dentry *dentry); | 1765 | int security_quota_on(struct dentry *dentry); |
1765 | int security_syslog(int type); | 1766 | int security_syslog(int type, bool from_file); |
1766 | int security_settime(struct timespec *ts, struct timezone *tz); | 1767 | int security_settime(struct timespec *ts, struct timezone *tz); |
1767 | int security_vm_enough_memory(long pages); | 1768 | int security_vm_enough_memory(long pages); |
1768 | int security_vm_enough_memory_mm(struct mm_struct *mm, long pages); | 1769 | int security_vm_enough_memory_mm(struct mm_struct *mm, long pages); |
@@ -2008,9 +2009,9 @@ static inline int security_quota_on(struct dentry *dentry) | |||
2008 | return 0; | 2009 | return 0; |
2009 | } | 2010 | } |
2010 | 2011 | ||
2011 | static inline int security_syslog(int type) | 2012 | static inline int security_syslog(int type, bool from_file) |
2012 | { | 2013 | { |
2013 | return cap_syslog(type); | 2014 | return cap_syslog(type, from_file); |
2014 | } | 2015 | } |
2015 | 2016 | ||
2016 | static inline int security_settime(struct timespec *ts, struct timezone *tz) | 2017 | static inline int security_settime(struct timespec *ts, struct timezone *tz) |