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 | |
| 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')
| -rw-r--r-- | include/linux/security.h | 11 | ||||
| -rw-r--r-- | include/linux/syslog.h | 29 |
2 files changed, 35 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) |
diff --git a/include/linux/syslog.h b/include/linux/syslog.h new file mode 100644 index 000000000000..5f02b1817be1 --- /dev/null +++ b/include/linux/syslog.h | |||
| @@ -0,0 +1,29 @@ | |||
| 1 | /* Syslog internals | ||
| 2 | * | ||
| 3 | * Copyright 2010 Canonical, Ltd. | ||
| 4 | * Author: Kees Cook <kees.cook@canonical.com> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License as published by | ||
| 8 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 9 | * any later version. | ||
| 10 | * | ||
| 11 | * This program is distributed in the hope that it will be useful, | ||
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 14 | * GNU General Public License for more details. | ||
| 15 | * | ||
| 16 | * You should have received a copy of the GNU General Public License | ||
| 17 | * along with this program; see the file COPYING. If not, write to | ||
| 18 | * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 19 | */ | ||
| 20 | |||
| 21 | #ifndef _LINUX_SYSLOG_H | ||
| 22 | #define _LINUX_SYSLOG_H | ||
| 23 | |||
| 24 | #define SYSLOG_FROM_CALL 0 | ||
| 25 | #define SYSLOG_FROM_FILE 1 | ||
| 26 | |||
| 27 | int do_syslog(int type, char __user *buf, int count, bool from_file); | ||
| 28 | |||
| 29 | #endif /* _LINUX_SYSLOG_H */ | ||
