Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 66cc69e3 authored by Mathieu Desnoyers's avatar Mathieu Desnoyers Committed by Rusty Russell
Browse files

Fix: module signature vs tracepoints: add new TAINT_UNSIGNED_MODULE



Users have reported being unable to trace non-signed modules loaded
within a kernel supporting module signature.

This is caused by tracepoint.c:tracepoint_module_coming() refusing to
take into account tracepoints sitting within force-loaded modules
(TAINT_FORCED_MODULE). The reason for this check, in the first place, is
that a force-loaded module may have a struct module incompatible with
the layout expected by the kernel, and can thus cause a kernel crash
upon forced load of that module on a kernel with CONFIG_TRACEPOINTS=y.

Tracepoints, however, specifically accept TAINT_OOT_MODULE and
TAINT_CRAP, since those modules do not lead to the "very likely system
crash" issue cited above for force-loaded modules.

With kernels having CONFIG_MODULE_SIG=y (signed modules), a non-signed
module is tainted re-using the TAINT_FORCED_MODULE taint flag.
Unfortunately, this means that Tracepoints treat that module as a
force-loaded module, and thus silently refuse to consider any tracepoint
within this module.

Since an unsigned module does not fit within the "very likely system
crash" category of tainting, add a new TAINT_UNSIGNED_MODULE taint flag
to specifically address this taint behavior, and accept those modules
within Tracepoints. We use the letter 'X' as a taint flag character for
a module being loaded that doesn't know how to sign its name (proposed
by Steven Rostedt).

Also add the missing 'O' entry to trace event show_module_flags() list
for the sake of completeness.

Signed-off-by: default avatarMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Acked-by: default avatarSteven Rostedt <rostedt@goodmis.org>
NAKed-by: default avatarIngo Molnar <mingo@redhat.com>
CC: Thomas Gleixner <tglx@linutronix.de>
CC: David Howells <dhowells@redhat.com>
CC: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
parent cff26a51
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -49,3 +49,4 @@ Description: Module taint flags:
			O - out-of-tree module
			F - force-loaded module
			C - staging driver module
			X - unsigned module
+2 −1
Original line number Diff line number Diff line
@@ -53,7 +53,8 @@ This has a number of options available:

     If this is off (ie. "permissive"), then modules for which the key is not
     available and modules that are unsigned are permitted, but the kernel will
     be marked as being tainted.
     be marked as being tainted, and the concerned modules will be marked as
     tainted, shown with the character 'X'.

     If this is on (ie. "restrictive"), only modules that have a valid
     signature that can be verified by a public key in the kernel's possession
+3 −0
Original line number Diff line number Diff line
@@ -265,6 +265,9 @@ characters, each representing a particular tainted value.

 13: 'O' if an externally-built ("out-of-tree") module has been loaded.

 14: 'X' if an unsigned module has been loaded in a kernel supporting
     module signature.

The primary reason for the 'Tainted: ' string is to tell kernel
debuggers if this is a clean kernel or if anything unusual has
occurred.  Tainting is permanent: even if an offending module is
+2 −0
Original line number Diff line number Diff line
@@ -792,6 +792,8 @@ can be ORed together:
1024 - A module from drivers/staging was loaded.
2048 - The system is working around a severe firmware bug.
4096 - An out-of-tree module has been loaded.
8192 - An unsigned module has been loaded in a kernel supporting module
       signature.

==============================================================

+1 −0
Original line number Diff line number Diff line
@@ -469,6 +469,7 @@ extern enum system_states {
#define TAINT_CRAP			10
#define TAINT_FIRMWARE_WORKAROUND	11
#define TAINT_OOT_MODULE		12
#define TAINT_UNSIGNED_MODULE		13

extern const char hex_asc[];
#define hex_asc_lo(x)	hex_asc[((x) & 0x0f)]
Loading