lockdown: Lock down tracing and perf kprobes when in confidentiality mode
authorDavid Howells <dhowells@redhat.com>
Tue, 20 Aug 2019 00:17:58 +0000 (17:17 -0700)
committerJames Morris <jmorris@namei.org>
Tue, 20 Aug 2019 04:54:16 +0000 (21:54 -0700)
Disallow the creation of perf and ftrace kprobes when the kernel is
locked down in confidentiality mode by preventing their registration.
This prevents kprobes from being used to access kernel memory to steal
crypto data, but continues to allow the use of kprobes from signed
modules.

Reported-by: Alexei Starovoitov <alexei.starovoitov@gmail.com>
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Matthew Garrett <mjg59@google.com>
Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
Reviewed-by: Kees Cook <keescook@chromium.org>
Cc: Naveen N. Rao <naveen.n.rao@linux.ibm.com>
Cc: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
Cc: davem@davemloft.net
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: James Morris <jmorris@namei.org>
include/linux/security.h
kernel/trace/trace_kprobe.c
security/lockdown/lockdown.c

index 669e8de5299dc1a5b83af33e73884e4e70be02b9..0b2529dbf0f4a05010c9c34956f682af8ae59e93 100644 (file)
@@ -117,6 +117,7 @@ enum lockdown_reason {
        LOCKDOWN_MMIOTRACE,
        LOCKDOWN_INTEGRITY_MAX,
        LOCKDOWN_KCORE,
+       LOCKDOWN_KPROBES,
        LOCKDOWN_CONFIDENTIALITY_MAX,
 };
 
index 7d736248a070b2f633349856345e2013d4a3cd34..fcb28b0702b272eef21bce127f7b88d577bb474a 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/uaccess.h>
 #include <linux/rculist.h>
 #include <linux/error-injection.h>
+#include <linux/security.h>
 
 #include "trace_dynevent.h"
 #include "trace_kprobe_selftest.h"
@@ -415,6 +416,10 @@ static int __register_trace_kprobe(struct trace_kprobe *tk)
 {
        int i, ret;
 
+       ret = security_locked_down(LOCKDOWN_KPROBES);
+       if (ret)
+               return ret;
+
        if (trace_probe_is_registered(&tk->tp))
                return -EINVAL;
 
index 403b30357f75a76560253d6b36bea82cdaf81a82..27b2cf51e443c3536050910766ca81bc411bf173 100644 (file)
@@ -32,6 +32,7 @@ static char *lockdown_reasons[LOCKDOWN_CONFIDENTIALITY_MAX+1] = {
        [LOCKDOWN_MMIOTRACE] = "unsafe mmio",
        [LOCKDOWN_INTEGRITY_MAX] = "integrity",
        [LOCKDOWN_KCORE] = "/proc/kcore access",
+       [LOCKDOWN_KPROBES] = "use of kprobes",
        [LOCKDOWN_CONFIDENTIALITY_MAX] = "confidentiality",
 };