aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKees Cook <keescook@chromium.org>2017-08-10 00:11:00 -0400
committerKees Cook <keescook@chromium.org>2017-08-17 19:29:19 -0400
commitc71b02e4d207cbcf097f9746d5f7967b22905e70 (patch)
treef3eaa286c2a932e1f348ae3b322eedd9fea9cefa
parentd7caa33687cea218b6d68beea89d10a45a901e19 (diff)
Revert "pstore: Honor dmesg_restrict sysctl on dmesg dumps"
This reverts commit 68c4a4f8abc60c9440ede9cd123d48b78325f7a3, with various conflict clean-ups. The capability check required too much privilege compared to simple DAC controls. A system builder was forced to have crash handler processes run with CAP_SYSLOG which would give it the ability to read (and wipe) the _current_ dmesg, which is much more access than being given access only to the historical log stored in pstorefs. With the prior commit to make the root directory 0750, the files are protected by default but a system builder can now opt to give access to a specific group (via chgrp on the pstorefs root directory) without being forced to also give away CAP_SYSLOG. Suggested-by: Nick Kralevich <nnk@google.com> Signed-off-by: Kees Cook <keescook@chromium.org> Reviewed-by: Petr Mladek <pmladek@suse.cz> Reviewed-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
-rw-r--r--fs/pstore/inode.c22
-rw-r--r--include/linux/syslog.h9
-rw-r--r--kernel/printk/printk.c3
3 files changed, 1 insertions, 33 deletions
diff --git a/fs/pstore/inode.c b/fs/pstore/inode.c
index f1e88b695090..d814723fb27d 100644
--- a/fs/pstore/inode.c
+++ b/fs/pstore/inode.c
@@ -36,7 +36,6 @@
36#include <linux/slab.h> 36#include <linux/slab.h>
37#include <linux/spinlock.h> 37#include <linux/spinlock.h>
38#include <linux/uaccess.h> 38#include <linux/uaccess.h>
39#include <linux/syslog.h>
40 39
41#include "internal.h" 40#include "internal.h"
42 41
@@ -132,18 +131,6 @@ static const struct seq_operations pstore_ftrace_seq_ops = {
132 .show = pstore_ftrace_seq_show, 131 .show = pstore_ftrace_seq_show,
133}; 132};
134 133
135static int pstore_check_syslog_permissions(struct pstore_private *ps)
136{
137 switch (ps->record->type) {
138 case PSTORE_TYPE_DMESG:
139 case PSTORE_TYPE_CONSOLE:
140 return check_syslog_permissions(SYSLOG_ACTION_READ_ALL,
141 SYSLOG_FROM_READER);
142 default:
143 return 0;
144 }
145}
146
147static ssize_t pstore_file_read(struct file *file, char __user *userbuf, 134static ssize_t pstore_file_read(struct file *file, char __user *userbuf,
148 size_t count, loff_t *ppos) 135 size_t count, loff_t *ppos)
149{ 136{
@@ -163,10 +150,6 @@ static int pstore_file_open(struct inode *inode, struct file *file)
163 int err; 150 int err;
164 const struct seq_operations *sops = NULL; 151 const struct seq_operations *sops = NULL;
165 152
166 err = pstore_check_syslog_permissions(ps);
167 if (err)
168 return err;
169
170 if (ps->record->type == PSTORE_TYPE_FTRACE) 153 if (ps->record->type == PSTORE_TYPE_FTRACE)
171 sops = &pstore_ftrace_seq_ops; 154 sops = &pstore_ftrace_seq_ops;
172 155
@@ -204,11 +187,6 @@ static int pstore_unlink(struct inode *dir, struct dentry *dentry)
204{ 187{
205 struct pstore_private *p = d_inode(dentry)->i_private; 188 struct pstore_private *p = d_inode(dentry)->i_private;
206 struct pstore_record *record = p->record; 189 struct pstore_record *record = p->record;
207 int err;
208
209 err = pstore_check_syslog_permissions(p);
210 if (err)
211 return err;
212 190
213 if (!record->psi->erase) 191 if (!record->psi->erase)
214 return -EPERM; 192 return -EPERM;
diff --git a/include/linux/syslog.h b/include/linux/syslog.h
index c3a7f0cc3a27..e1c3632f4e81 100644
--- a/include/linux/syslog.h
+++ b/include/linux/syslog.h
@@ -49,13 +49,4 @@
49 49
50int do_syslog(int type, char __user *buf, int count, int source); 50int do_syslog(int type, char __user *buf, int count, int source);
51 51
52#ifdef CONFIG_PRINTK
53int check_syslog_permissions(int type, int source);
54#else
55static inline int check_syslog_permissions(int type, int source)
56{
57 return 0;
58}
59#endif
60
61#endif /* _LINUX_SYSLOG_H */ 52#endif /* _LINUX_SYSLOG_H */
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index fc47863f629c..97bda7b0655b 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -649,7 +649,7 @@ static int syslog_action_restricted(int type)
649 type != SYSLOG_ACTION_SIZE_BUFFER; 649 type != SYSLOG_ACTION_SIZE_BUFFER;
650} 650}
651 651
652int check_syslog_permissions(int type, int source) 652static int check_syslog_permissions(int type, int source)
653{ 653{
654 /* 654 /*
655 * If this is from /proc/kmsg and we've already opened it, then we've 655 * If this is from /proc/kmsg and we've already opened it, then we've
@@ -677,7 +677,6 @@ int check_syslog_permissions(int type, int source)
677ok: 677ok:
678 return security_syslog(type); 678 return security_syslog(type);
679} 679}
680EXPORT_SYMBOL_GPL(check_syslog_permissions);
681 680
682static void append_char(char **pp, char *e, char c) 681static void append_char(char **pp, char *e, char c)
683{ 682{