All of lore.kernel.org
 help / color / mirror / Atom feed
From: Rusty Russell <rusty@ozlabs.org>
To: David Howells <dhowells@redhat.com>
Cc: dhowells@redhat.com, keyrings@linux-nfs.org,
	linux-crypto@vger.kernel.org,
	linux-security-module@vger.kernel.org,
	linux-kernel@vger.kernel.org, dmitry.kasatkin@intel.com,
	zohar@linux.vnet.ibm.com, arjan.van.de.ven@intel.com,
	alan.cox@intel.com, Jon Masters <jcm@jonmasters.org>
Subject: Re: [PATCH 21/21] MODSIGN: Apply signature checking to modules on module load [ver #3]
Date: Tue, 13 Dec 2011 12:45:40 +1030	[thread overview]
Message-ID: <87obvdtdwz.fsf@rustcorp.com.au> (raw)
In-Reply-To: <21605.1323706287@redhat.com>

On Mon, 12 Dec 2011 16:11:27 +0000, David Howells <dhowells@redhat.com> wrote:
> Rusty Russell <rusty@ozlabs.org> wrote:
> 
> > OK, then you need to generate stripped modules as part of the build,
> > too.  It's a bit of a pain, sure, but hardly a showstopper.
> 
> They'd have to be maximally stripped so that mkinitrd doesn't do anything to
> them, but you'd then get the debuginfo from them into the packaging if you're
> on some distribution or other.  And you also provide an option to not strip
> them if whoever wants them unstripped.

I was thinking we generate multiple modules; people will definitely want
unstripped versions as well.

> > A signature contains a magic marker
> 
> I don't like this particularly - you can't guarantee that this won't be
> generated by the assembler quite by accident.

We don't care, in practice.  It can't generate a valid key by accident.
The only difference is that you might get "bad key" instead of "no key"
if no sigature matches.  But a validly parsable signature won't happen
in practice.

> You should find the end of the
> ELF and work from there.  It should be a simple matter of parsing the header
> and the section table only, right?  Then you can look at the file offset +
> length of the last section in the file.

Tried that first.  It's more lines (which need to be carefully
scrutinized)...

>  At that point, assuming this isn't
> coincident with the actual end of the file, you can try parsing what's
> thereafter as a signature.  If it is actual PGP, then an RFC4880 parser should
> recognise it as valid, and a signature packet should be seen.

...and you can still have padding.  At which point, I realised that we
might as well just scan the whole thing and be done.

It's a bit cheeky, but I *know* it works, and can be verified by any
reader without knowing anything about ELF or trusting the format at all.

> > A signature contains a magic marker: it signs everything up to the
> > magic marker (ie. just append them):
> > 	SUM=`md5sum drivers/block/loop.ko | cut -d\  -f1`; echo "@Module signature:$SUM" >> drivers/block/loop.ko
> 
> That's not a useful signature, but I suspect you're just showing this as an
> example.

Yeah, it was supposed to be a dumb example...

> > We can have false positives, but at worst that make us report EINVAL
> > (bad signature) instead of ENOENT (no signature).
> 
> EKEYREJECTED please; that way it's the same as RHEL does now.

OK, sure (who knew that was there?).

> > Took me longer to figure out the damn crypto API
> 
> You don't actually need to use that.  The crypto API for the moment doesn't do
> crytographic signature verification.

Sure, I was working on mainline, which is why I chose md5 (plus using
md5sum is easy).

> returns -EBADMSG if none of its parsers recognise the signature, -ENOPKG if
> the signature is recognised, but we can't handle it (for instance if it's an
> unsupported hash algorithm), -ENOKEY if we recognise it, but there's no key
> available or -EKEYREJECTED if we recognised it, found the matching key, but
> the key couldn't be used to verify the signature for some reason.
> 
> 	/* Call repeatedly to shovel data into the crypto hash */
> 	verify_sig_add_data(mod_sig, dataptr, datasize);
> 
> 	/* Call to finalise and actually perform the verification */
> 	ret = verify_sig_end(mod_sig, sig, sig_size);
> 
> or:
> 
> 	/* Call to cancel the verification */
> 	verify_sig_cancel(mod_sig);
> 
> This does all the work for you.

That looks really nice, actually!

Thanks,
Rusty.

  reply	other threads:[~2011-12-13  2:15 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-12-02 18:42 [RFC][PATCH 00/21] Crypto keys and module signing [ver #3] David Howells
2011-12-02 18:42 ` [PATCH 01/21] MPILIB: Export some more symbols " David Howells
2011-12-02 18:42 ` [PATCH 02/21] MPILIB: Add a missing ENOMEM check " David Howells
2011-12-02 18:43 ` [PATCH 03/21] KEYS: Permit key_serial() to be called with a const key pointer " David Howells
2011-12-02 18:43 ` [PATCH 04/21] KEYS: Move the key config into security/keys/Kconfig " David Howells
2011-12-02 18:43 ` [PATCH 05/21] KEYS: Announce key type (un)registration " David Howells
2011-12-02 18:43 ` [PATCH 06/21] KEYS: Reorganise keys Makefile " David Howells
2011-12-02 18:43 ` [PATCH 07/21] KEYS: Create a key type that can be used for general cryptographic operations " David Howells
2012-01-16 12:53   ` Mimi Zohar
2012-01-17 15:32     ` David Howells
2012-01-18 10:56       ` Kasatkin, Dmitry
2011-12-02 18:44 ` [PATCH 08/21] KEYS: Add signature verification facility " David Howells
2012-01-18 11:20   ` Kasatkin, Dmitry
2012-01-18 12:26     ` David Howells
2012-01-18 13:26       ` Kasatkin, Dmitry
2012-01-18 15:13         ` David Howells
2012-01-18 15:20           ` Kasatkin, Dmitry
2012-01-18 15:20             ` Kasatkin, Dmitry
2012-01-18 19:59             ` David Howells
2012-01-20  1:52               ` Herbert Xu
2012-01-20  1:52                 ` Herbert Xu
2011-12-02 18:44 ` [PATCH 09/21] KEYS: Asymmetric public-key algorithm crypto key subtype " David Howells
2011-12-02 18:44 ` [PATCH 10/21] KEYS: DSA signature verification algorithm " David Howells
2011-12-02 18:44 ` [PATCH 11/21] KEYS: RSA " David Howells
2011-12-02 18:44 ` [PATCH 12/21] PGPLIB: PGP definitions (RFC 4880) " David Howells
2011-12-02 18:45 ` [PATCH 13/21] PGPLIB: Basic packet parser " David Howells
2011-12-02 18:45 ` [PATCH 14/21] PGPLIB: Signature " David Howells
2011-12-02 18:45 ` [PATCH 15/21] KEYS: PGP data " David Howells
2011-12-02 18:45 ` [PATCH 16/21] KEYS: PGP-based public key signature verification " David Howells
2012-01-18 11:36   ` Kasatkin, Dmitry
2012-01-18 12:49     ` David Howells
2012-01-18 13:34       ` Kasatkin, Dmitry
2012-01-18 13:34         ` Kasatkin, Dmitry
2011-12-02 18:46 ` [PATCH 17/21] KEYS: PGP format signature parser " David Howells
2011-12-02 18:46 ` [PATCH 18/21] KEYS: Provide a function to load keys from a PGP keyring blob " David Howells
2011-12-02 18:46 ` [PATCH 19/21] MODSIGN: Add indications of module ELF types " David Howells
2011-12-02 18:46 ` [PATCH 20/21] MODSIGN: Module ELF verifier " David Howells
2011-12-02 18:46 ` [PATCH 21/21] MODSIGN: Apply signature checking to modules on module load " David Howells
2011-12-09 11:18   ` Rusty Russell
2011-12-09 18:43     ` David Howells
2011-12-10  7:01       ` Rusty Russell
2011-12-10 14:08         ` David Howells
2011-12-11  4:57           ` Rusty Russell
2011-12-12  1:21             ` David Howells
2011-12-12  9:09               ` Rusty Russell
2011-12-12 16:11                 ` David Howells
2011-12-13  2:15                   ` Rusty Russell [this message]
2011-12-15  0:14                     ` David Howells
2011-12-16  0:41                       ` Rusty Russell
2011-12-10 18:37         ` Arjan van de Ven
2011-12-11  4:59           ` Rusty Russell
2012-01-08 22:02 ` [RFC][PATCH 00/21] Crypto keys and module signing " Mimi Zohar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87obvdtdwz.fsf@rustcorp.com.au \
    --to=rusty@ozlabs.org \
    --cc=alan.cox@intel.com \
    --cc=arjan.van.de.ven@intel.com \
    --cc=dhowells@redhat.com \
    --cc=dmitry.kasatkin@intel.com \
    --cc=jcm@jonmasters.org \
    --cc=keyrings@linux-nfs.org \
    --cc=linux-crypto@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-security-module@vger.kernel.org \
    --cc=zohar@linux.vnet.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.