public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* RFC: sign the modules at install time
@ 2012-10-17 20:36 Linus Torvalds
  2012-10-17 22:19 ` David Howells
                   ` (2 more replies)
  0 siblings, 3 replies; 44+ messages in thread
From: Linus Torvalds @ 2012-10-17 20:36 UTC (permalink / raw)
  To: David Miller, Rusty Russell, David Howells; +Cc: Linux Kernel Mailing List

[-- Attachment #1: Type: text/plain, Size: 1280 bytes --]

This was based on the complaint from Davem that the "make
allmodconfig" build got way slower because module signing takes a
while.

And quite frankly, the whole "extra strip and sign" thing at modpost
time was just nasty ugly code.

Why don't we do something *much* simpler? We already have a
conditional stripping of modules (that whole INSTALL_MOD_STRIP) logic,
and it really simplifies everything if we just do something very
similar for the signing of modules. At "make modules_install" time,
exactly like the stripping is done.

Sure, it means that if you want to load modules directly from your
kernel build tree (without installing them), you'd better be running a
kernel that doesn't need the signing (or you need to sign things
explicitly). But seriously, nobody cares. If you are building a module
after booting the kernel with the intention of loading that modified
module, you aren't going to be doing that whole module signing thing
*anyway*. Signed modules make sense when building the kernel and
module together, so signing them as we install the kernel and module
is just sensible.

And it really is much simpler as shown by the diffstat: 13
insertions(+), 78 deletions(-).

It seems to work for me from my (very very limited) testing. Comments?

           Linus

[-- Attachment #2: patch.diff --]
[-- Type: application/octet-stream, Size: 5213 bytes --]

 Makefile                 | 10 +++++++
 scripts/Makefile.modinst |  2 +-
 scripts/Makefile.modpost | 77 +-----------------------------------------------
 scripts/sign-file        |  2 +-
 4 files changed, 13 insertions(+), 78 deletions(-)

diff --git a/Makefile b/Makefile
index 5be2ee8c90e4..39a710d6c372 100644
--- a/Makefile
+++ b/Makefile
@@ -717,6 +717,16 @@ endif # INSTALL_MOD_STRIP
 export mod_strip_cmd
 
 
+ifeq ($(CONFIG_MODULE_SIG),y)
+MODSECKEY = ./signing_key.priv
+MODPUBKEY = ./signing_key.x509
+mod_sign_cmd = sh $(srctree)/scripts/sign-file $(MODSECKEY) $(MODPUBKEY)
+else
+mod_sign_cmd = true
+endif
+export mod_sign_cmd
+
+
 ifeq ($(KBUILD_EXTMOD),)
 core-y		+= kernel/ mm/ fs/ ipc/ security/ crypto/ block/
 
diff --git a/scripts/Makefile.modinst b/scripts/Makefile.modinst
index 3d13d3a3edfe..dda4b2b61927 100644
--- a/scripts/Makefile.modinst
+++ b/scripts/Makefile.modinst
@@ -17,7 +17,7 @@ __modinst: $(modules)
 	@:
 
 quiet_cmd_modules_install = INSTALL $@
-      cmd_modules_install = mkdir -p $(2); cp $@ $(2) ; $(mod_strip_cmd) $(2)/$(notdir $@)
+      cmd_modules_install = mkdir -p $(2); cp $@ $(2) ; $(mod_strip_cmd) $(2)/$(notdir $@) ; $(mod_sign_cmd) $(2)/$(notdir $@)
 
 # Modules built outside the kernel source tree go into extra by default
 INSTALL_MOD_DIR ?= extra
diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost
index 002089141df4..a1cb0222ebe6 100644
--- a/scripts/Makefile.modpost
+++ b/scripts/Makefile.modpost
@@ -14,8 +14,7 @@
 # 3)  create one <module>.mod.c file pr. module
 # 4)  create one Module.symvers file with CRC for all exported symbols
 # 5) compile all <module>.mod.c files
-# 6) final link of the module to a <module.ko> (or <module.unsigned>) file
-# 7) signs the modules to a <module.ko> file
+# 6) final link of the module to a <module.ko> file
 
 # Step 3 is used to place certain information in the module's ELF
 # section, including information such as:
@@ -33,8 +32,6 @@
 # Step 4 is solely used to allow module versioning in external modules,
 # where the CRC of each module is retrieved from the Module.symvers file.
 
-# Step 7 is dependent on CONFIG_MODULE_SIG being enabled.
-
 # KBUILD_MODPOST_WARN can be set to avoid error out in case of undefined
 # symbols in the final module linking stage
 # KBUILD_MODPOST_NOFINAL can be set to skip the final link of modules.
@@ -119,7 +116,6 @@ $(modules:.ko=.mod.o): %.mod.o: %.mod.c FORCE
 targets += $(modules:.ko=.mod.o)
 
 # Step 6), final link of the modules
-ifneq ($(CONFIG_MODULE_SIG),y)
 quiet_cmd_ld_ko_o = LD [M]  $@
       cmd_ld_ko_o = $(LD) -r $(LDFLAGS)                                 \
                              $(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE) \
@@ -129,78 +125,7 @@ $(modules): %.ko :%.o %.mod.o FORCE
 	$(call if_changed,ld_ko_o)
 
 targets += $(modules)
-else
-quiet_cmd_ld_ko_unsigned_o = LD [M]  $@
-      cmd_ld_ko_unsigned_o =						\
-		$(LD) -r $(LDFLAGS)					\
-			 $(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE)	\
-			 -o $@ $(filter-out FORCE,$^)			\
-		$(if $(AFTER_LINK),; $(AFTER_LINK))
-
-$(modules:.ko=.ko.unsigned): %.ko.unsigned :%.o %.mod.o FORCE
-	$(call if_changed,ld_ko_unsigned_o)
-
-targets += $(modules:.ko=.ko.unsigned)
-
-# Step 7), sign the modules
-MODSECKEY = ./signing_key.priv
-MODPUBKEY = ./signing_key.x509
-
-ifeq ($(wildcard $(MODSECKEY))+$(wildcard $(MODPUBKEY)),$(MODSECKEY)+$(MODPUBKEY))
-ifeq ($(KBUILD_SRC),)
-	# no O= is being used
-	SCRIPTS_DIR := scripts
-else
-	SCRIPTS_DIR := $(KBUILD_SRC)/scripts
-endif
-SIGN_MODULES := 1
-else
-SIGN_MODULES := 0
-endif
-
-# only sign if it's an in-tree module
-ifneq ($(KBUILD_EXTMOD),)
-SIGN_MODULES := 0
-endif
 
-# We strip the module as best we can - note that using both strip and eu-strip
-# results in a smaller module than using either alone.
-EU_STRIP = $(shell which eu-strip || echo true)
-
-quiet_cmd_sign_ko_stripped_ko_unsigned = STRIP [M] $@
-      cmd_sign_ko_stripped_ko_unsigned = \
-		cp $< $@ && \
-		strip -x -g $@ && \
-		$(EU_STRIP) $@
-
-ifeq ($(SIGN_MODULES),1)
-
-quiet_cmd_genkeyid = GENKEYID $@
-      cmd_genkeyid = \
-		perl $(SCRIPTS_DIR)/x509keyid $< $<.signer $<.keyid
-
-%.signer %.keyid: %
-	$(call if_changed,genkeyid)
-
-KEYRING_DEP := $(MODSECKEY) $(MODPUBKEY) $(MODPUBKEY).signer $(MODPUBKEY).keyid
-quiet_cmd_sign_ko_ko_stripped = SIGN [M] $@
-      cmd_sign_ko_ko_stripped = \
-		sh $(SCRIPTS_DIR)/sign-file $(MODSECKEY) $(MODPUBKEY) $< $@
-else
-KEYRING_DEP :=
-quiet_cmd_sign_ko_ko_unsigned = NO SIGN [M] $@
-      cmd_sign_ko_ko_unsigned = \
-		cp $< $@
-endif
-
-$(modules): %.ko :%.ko.stripped $(KEYRING_DEP) FORCE
-	$(call if_changed,sign_ko_ko_stripped)
-
-$(patsubst %.ko,%.ko.stripped,$(modules)): %.ko.stripped :%.ko.unsigned FORCE
-	$(call if_changed,sign_ko_stripped_ko_unsigned)
-
-targets += $(modules)
-endif
 
 # Add FORCE to the prequisites of a target to force it to be always rebuilt.
 # ---------------------------------------------------------------------------
diff --git a/scripts/sign-file b/scripts/sign-file
index e58e34e50ac5..3084ba43a19d 100644
--- a/scripts/sign-file
+++ b/scripts/sign-file
@@ -16,7 +16,7 @@ fi
 key="$1"
 x509="$2"
 src="$3"
-dst="$4"
+dst="${4:-$3}"
 
 if [ ! -r "$key" ]
 then

^ permalink raw reply related	[flat|nested] 44+ messages in thread
* Re: RFC: sign the modules at install time
@ 2012-10-18 21:31 George Spelvin
  0 siblings, 0 replies; 44+ messages in thread
From: George Spelvin @ 2012-10-18 21:31 UTC (permalink / raw)
  To: linux-kernel; +Cc: jwboyer, linux, torvalds

The micturator of the Holy Penguin Pee spake:
> (Side note: I hope people realize that the random key is generated
> with a 100-year lifespan. So if you build a kernel today, you do
> potentially have a "year-2112 problem". I'm not horribly worried, but
> I *am* a bit worried about 32-bit time_t overflow and I hope 32-bit
> openssl doesn't do anything odd)

Well, the kernel uses time_t, which should be >= 64 bits on any machine
still operational outside the computer history museum at that time.

But it also allows an expiry time of 0 to indicate "no expiration".  


It's worth noting that in X.509 *keys* don't have expirations; only
*certifications* do.  That is, the signature binding a name to the key.
You can issue any number of certificates, with different expiration dates,
on the same key.

(The only reason that there's this "certificate = key" confusion
is that X.509 doesn't specify a format for a bare key, so the
certificate format is also used as a key container.)

I haven't figured out the kernel key loading procedure, but it's not
clear that it even sets the expiry time.  It does not, for example,
have any equivalent to the X.509 validity start time, so it wasn't
designed with importing certificates in mind.


Even if it is set, you could disable expiration checking on key lookup
and not care about expiration dates.  (Pass no_state_check=true as the
last argument to keyring_search_aux.)

^ permalink raw reply	[flat|nested] 44+ messages in thread

end of thread, other threads:[~2012-10-22  1:25 UTC | newest]

Thread overview: 44+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-10-17 20:36 RFC: sign the modules at install time Linus Torvalds
2012-10-17 22:19 ` David Howells
2012-10-17 22:44   ` Linus Torvalds
2012-10-18  0:54     ` Greg KH
2012-10-18  3:14       ` Linus Torvalds
2012-10-18  3:18         ` Linus Torvalds
2012-10-18  4:34         ` Rusty Russell
2012-10-18 17:16           ` Greg KH
2012-10-18  4:31     ` Rusty Russell
2012-10-18 12:11       ` Josh Boyer
2012-10-18 16:29         ` Linus Torvalds
2012-10-19  0:20           ` Rusty Russell
2012-10-19 11:21             ` David Howells
2012-10-21 23:51               ` Rusty Russell
2012-10-20 16:41           ` Romain Francoise
2012-10-20 16:47             ` Linus Torvalds
2012-10-17 22:26 ` Josh Boyer
2012-10-17 23:07   ` Linus Torvalds
2012-10-17 23:20     ` Josh Boyer
2012-10-17 23:25       ` Linus Torvalds
2012-10-17 23:44         ` Linus Torvalds
2012-10-18  0:06           ` Linus Torvalds
2012-10-17 23:21     ` Linus Torvalds
2012-10-18  0:13       ` Josh Boyer
2012-10-18  4:41       ` Rusty Russell
2012-10-18  1:17 ` Rusty Russell
2012-10-18  3:27   ` Linus Torvalds
2012-10-18  5:34     ` Rusty Russell
2012-10-18 18:46       ` Linus Torvalds
2012-10-18 19:58         ` Josh Boyer
2012-10-19  0:48           ` Rusty Russell
2012-10-19 11:44             ` Josh Boyer
2012-10-19  1:16           ` Rusty Russell
2012-10-19 11:49             ` Josh Boyer
2012-10-19  1:23         ` Rusty Russell
2012-10-19  3:21           ` Stephen Rothwell
2012-10-19 11:25             ` David Howells
2012-10-19 11:30               ` Stephen Rothwell
2012-10-19 11:40               ` Alexander Holler
2012-10-20  3:53             ` Rusty Russell
2012-10-19 19:58           ` Linus Torvalds
2012-10-19 22:04             ` Linus Torvalds
2012-10-22  0:28               ` Rusty Russell
  -- strict thread matches above, loose matches on Subject: below --
2012-10-18 21:31 George Spelvin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox