|
Message-Id: <1509603390-7587-3-git-send-email-me@tobin.cc> Date: Thu, 2 Nov 2017 17:16:30 +1100 From: "Tobin C. Harding" <me@...in.cc> To: kernel-hardening@...ts.openwall.com Cc: "Tobin C. Harding" <me@...in.cc> Subject: [RFC 2/2] seq_file: sanitize for non-privileged processes Kernel addresses should not be leaked to user space. Currently the only mechanism we have to restrict kernel addresses from leaking is the sysctl kptr_restrict. We don't need to rely on this mechanism, we can sanitize kernel addresses in seq_files whenever a non-privileged process attempts to show them. Call vsnprintf_sanitize() for non-privileged processes. Signed-off-by: Tobin C. Harding <me@...in.cc> --- fs/seq_file.c | 13 ++++++++++++- include/linux/seq_file.h | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/fs/seq_file.c b/fs/seq_file.c index dc7c2be963ed..740980339b7f 100644 --- a/fs/seq_file.c +++ b/fs/seq_file.c @@ -46,6 +46,7 @@ static void *seq_buf_alloc(unsigned long size) */ int seq_open(struct file *file, const struct seq_operations *op) { + const struct cred *cred = current_cred(); struct seq_file *p; WARN_ON(file->private_data); @@ -80,6 +81,12 @@ int seq_open(struct file *file, const struct seq_operations *op) * file.open() which calls seq_open() and then sets FMODE_PWRITE. */ file->f_mode &= ~FMODE_PWRITE; + + p->sanitize = true; + if (uid_eq(cred->uid, GLOBAL_ROOT_UID) || + uid_eq(cred->euid, GLOBAL_ROOT_UID)) { + p->sanitize = false; + } return 0; } EXPORT_SYMBOL(seq_open); @@ -391,9 +398,13 @@ EXPORT_SYMBOL(seq_escape); void seq_vprintf(struct seq_file *m, const char *f, va_list args) { int len; + int (*fn)(char *, size_t, const char *, va_list) = vsnprintf_sanitize; + + if (m->sanitize == false) + fn = vsnprintf; if (m->count < m->size) { - len = vsnprintf(m->buf + m->count, m->size - m->count, f, args); + len = fn(m->buf + m->count, m->size - m->count, f, args); if (m->count + len < m->size) { m->count += len; return; diff --git a/include/linux/seq_file.h b/include/linux/seq_file.h index e305b66a9fb9..45840c866e26 100644 --- a/include/linux/seq_file.h +++ b/include/linux/seq_file.h @@ -25,6 +25,7 @@ struct seq_file { const struct seq_operations *op; int poll_event; const struct file *file; + bool sanitize; void *private; }; -- 2.7.4
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.