From: David Howells <dhowells-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
To: Matt Fleming <matt-mF/unelCI9GS6iBeEJttW/XRex20P6io@public.gmane.org>
Cc: dhowells-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org,
ard.biesheuvel-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org,
linux-efi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-security-module-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
keyrings-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
"H. Peter Anvin" <hpa-YMNOUZJC4hwAvxtiuMwx3w@public.gmane.org>,
Peter Jones <pjones-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Subject: Re: [PATCH 5/8] efi: Get the secure boot status [ver #6]
Date: Mon, 16 Jan 2017 15:39:18 +0000 [thread overview]
Message-ID: <794.1484581158@warthog.procyon.org.uk> (raw)
In-Reply-To: <20170116144954.GB27351-mF/unelCI9GS6iBeEJttW/XRex20P6io@public.gmane.org>
Matt Fleming <matt-mF/unelCI9GS6iBeEJttW/XRex20P6io@public.gmane.org> wrote:
> On Wed, 11 Jan, at 03:27:23PM, David Howells wrote:
> > Matt Fleming <matt-mF/unelCI9GS6iBeEJttW/XRex20P6io@public.gmane.org> wrote:
> >
> > > > + movb $0, BP_secure_boot(%rsi)
> > > > #ifdef CONFIG_EFI_STUB
> > > > /*
> > > > * The entry point for the PE/COFF executable is efi_pe_entry, so
> > >
> > > Is clearing ::secure_boot really necessary? Any code path that goes
> > > via efi_main() will set it correctly and all other code paths should
> > > get it cleared in sanitize_boot_params(), no?
> >
> > No.
> >
> > The boot_params->secure_boot parameter exists whether or not efi_main() is
> > traversed (ie. if EFI isn't enabled or CONFIG_EFI_STUB=n) and, if not cleared,
> > is of uncertain value.
> >
> > Further, sanitize_boot_params() has to be modified by this patch so as not to
> > clobber the secure_boot flag.
>
> Any new parameters that boot loaders do not know about should be
> cleared to zero by default in the boot loader because boot_params
> itself should be zero'd when allocated.
Do you mean the boot loader or the boot wrapper? If the loader, that is
outside my control - and given the purpose of the value, I'm not sure I
want to rely on that.
> There are two cases to consider:
>
> 1) boot_params is not zero'd
> 2) boot_params is zero'd
>
> 1) This is a broken boot loader implementation that violates the x86
> boot specification and I would never expect ->secure_boot to have a
> valid value.
If there's a boot specification that must be complied with, why does
sanitize_boot_params() even exist? Why does the comment on it say:
* Deal with bootloaders which fail to initialize unknown fields in
* boot_params to zero. The list fields in this list are taken from
* analysis of kexec-tools; if other broken bootloaders initialize a
* different set of fields we will need to figure out how to disambiguate.
> It should not be special-cased in sanitize_boot_params(), it should be
> zero'd.
Sigh. sanitize_boot_params() is part of the problem. The startup sequence
goes something like this:
(0) We enter the boot wrapper.
(1) We clear the secure-boot status value [my patch adds this].
(2) The boot wrapper *may* invoke efi_main() - which will determine the
secure-boot status.
(3) The boot wrapper calls extract_kernel() to decompress the kernel.
(4) extract_kernel() calls sanitize_boot_params() which would otherwise clear
the secure-boot flag.
(5) The boot wrapper jumps into the main kernel image, which now does not see
the secure boot status value we calculated.
So, no, sanitize_boot_params() must *not* zero the value unless we change the
call point for s_b_p().
> 2) In this case ->secure_boot should be zero unless modified inside of
> efi_main().
I have no idea whether this is guaranteed or not.
> Did you hit the scenario where ->secure_boot has a garbage value while
> developing these patches? I wouldn't expect to see it in practice.
I haven't actually checked what the value was before I cleared it. But, I've
found that security people get seriously paranoid about assuming things to be
implicitly so;-).
David
WARNING: multiple messages have this Message-ID (diff)
From: dhowells@redhat.com (David Howells)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 5/8] efi: Get the secure boot status [ver #6]
Date: Mon, 16 Jan 2017 15:39:18 +0000 [thread overview]
Message-ID: <794.1484581158@warthog.procyon.org.uk> (raw)
In-Reply-To: <20170116144954.GB27351@codeblueprint.co.uk>
Matt Fleming <matt@codeblueprint.co.uk> wrote:
> On Wed, 11 Jan, at 03:27:23PM, David Howells wrote:
> > Matt Fleming <matt@codeblueprint.co.uk> wrote:
> >
> > > > + movb $0, BP_secure_boot(%rsi)
> > > > #ifdef CONFIG_EFI_STUB
> > > > /*
> > > > * The entry point for the PE/COFF executable is efi_pe_entry, so
> > >
> > > Is clearing ::secure_boot really necessary? Any code path that goes
> > > via efi_main() will set it correctly and all other code paths should
> > > get it cleared in sanitize_boot_params(), no?
> >
> > No.
> >
> > The boot_params->secure_boot parameter exists whether or not efi_main() is
> > traversed (ie. if EFI isn't enabled or CONFIG_EFI_STUB=n) and, if not cleared,
> > is of uncertain value.
> >
> > Further, sanitize_boot_params() has to be modified by this patch so as not to
> > clobber the secure_boot flag.
>
> Any new parameters that boot loaders do not know about should be
> cleared to zero by default in the boot loader because boot_params
> itself should be zero'd when allocated.
Do you mean the boot loader or the boot wrapper? If the loader, that is
outside my control - and given the purpose of the value, I'm not sure I
want to rely on that.
> There are two cases to consider:
>
> 1) boot_params is not zero'd
> 2) boot_params is zero'd
>
> 1) This is a broken boot loader implementation that violates the x86
> boot specification and I would never expect ->secure_boot to have a
> valid value.
If there's a boot specification that must be complied with, why does
sanitize_boot_params() even exist? Why does the comment on it say:
* Deal with bootloaders which fail to initialize unknown fields in
* boot_params to zero. The list fields in this list are taken from
* analysis of kexec-tools; if other broken bootloaders initialize a
* different set of fields we will need to figure out how to disambiguate.
> It should not be special-cased in sanitize_boot_params(), it should be
> zero'd.
Sigh. sanitize_boot_params() is part of the problem. The startup sequence
goes something like this:
(0) We enter the boot wrapper.
(1) We clear the secure-boot status value [my patch adds this].
(2) The boot wrapper *may* invoke efi_main() - which will determine the
secure-boot status.
(3) The boot wrapper calls extract_kernel() to decompress the kernel.
(4) extract_kernel() calls sanitize_boot_params() which would otherwise clear
the secure-boot flag.
(5) The boot wrapper jumps into the main kernel image, which now does not see
the secure boot status value we calculated.
So, no, sanitize_boot_params() must *not* zero the value unless we change the
call point for s_b_p().
> 2) In this case ->secure_boot should be zero unless modified inside of
> efi_main().
I have no idea whether this is guaranteed or not.
> Did you hit the scenario where ->secure_boot has a garbage value while
> developing these patches? I wouldn't expect to see it in practice.
I haven't actually checked what the value was before I cleared it. But, I've
found that security people get seriously paranoid about assuming things to be
implicitly so;-).
David
WARNING: multiple messages have this Message-ID (diff)
From: David Howells <dhowells@redhat.com>
To: Matt Fleming <matt@codeblueprint.co.uk>
Cc: dhowells@redhat.com, ard.biesheuvel@linaro.org,
linux-efi@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-security-module@vger.kernel.org, keyrings@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
"H. Peter Anvin" <hpa@zytor.com>, Peter Jones <pjones@redhat.com>
Subject: Re: [PATCH 5/8] efi: Get the secure boot status [ver #6]
Date: Mon, 16 Jan 2017 15:39:18 +0000 [thread overview]
Message-ID: <794.1484581158@warthog.procyon.org.uk> (raw)
In-Reply-To: <20170116144954.GB27351@codeblueprint.co.uk>
Matt Fleming <matt@codeblueprint.co.uk> wrote:
> On Wed, 11 Jan, at 03:27:23PM, David Howells wrote:
> > Matt Fleming <matt@codeblueprint.co.uk> wrote:
> >
> > > > + movb $0, BP_secure_boot(%rsi)
> > > > #ifdef CONFIG_EFI_STUB
> > > > /*
> > > > * The entry point for the PE/COFF executable is efi_pe_entry, so
> > >
> > > Is clearing ::secure_boot really necessary? Any code path that goes
> > > via efi_main() will set it correctly and all other code paths should
> > > get it cleared in sanitize_boot_params(), no?
> >
> > No.
> >
> > The boot_params->secure_boot parameter exists whether or not efi_main() is
> > traversed (ie. if EFI isn't enabled or CONFIG_EFI_STUB=n) and, if not cleared,
> > is of uncertain value.
> >
> > Further, sanitize_boot_params() has to be modified by this patch so as not to
> > clobber the secure_boot flag.
>
> Any new parameters that boot loaders do not know about should be
> cleared to zero by default in the boot loader because boot_params
> itself should be zero'd when allocated.
Do you mean the boot loader or the boot wrapper? If the loader, that is
outside my control - and given the purpose of the value, I'm not sure I
want to rely on that.
> There are two cases to consider:
>
> 1) boot_params is not zero'd
> 2) boot_params is zero'd
>
> 1) This is a broken boot loader implementation that violates the x86
> boot specification and I would never expect ->secure_boot to have a
> valid value.
If there's a boot specification that must be complied with, why does
sanitize_boot_params() even exist? Why does the comment on it say:
* Deal with bootloaders which fail to initialize unknown fields in
* boot_params to zero. The list fields in this list are taken from
* analysis of kexec-tools; if other broken bootloaders initialize a
* different set of fields we will need to figure out how to disambiguate.
> It should not be special-cased in sanitize_boot_params(), it should be
> zero'd.
Sigh. sanitize_boot_params() is part of the problem. The startup sequence
goes something like this:
(0) We enter the boot wrapper.
(1) We clear the secure-boot status value [my patch adds this].
(2) The boot wrapper *may* invoke efi_main() - which will determine the
secure-boot status.
(3) The boot wrapper calls extract_kernel() to decompress the kernel.
(4) extract_kernel() calls sanitize_boot_params() which would otherwise clear
the secure-boot flag.
(5) The boot wrapper jumps into the main kernel image, which now does not see
the secure boot status value we calculated.
So, no, sanitize_boot_params() must *not* zero the value unless we change the
call point for s_b_p().
> 2) In this case ->secure_boot should be zero unless modified inside of
> efi_main().
I have no idea whether this is guaranteed or not.
> Did you hit the scenario where ->secure_boot has a garbage value while
> developing these patches? I wouldn't expect to see it in practice.
I haven't actually checked what the value was before I cleared it. But, I've
found that security people get seriously paranoid about assuming things to be
implicitly so;-).
David
next prev parent reply other threads:[~2017-01-16 15:39 UTC|newest]
Thread overview: 76+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-08 12:30 [PATCH 0/8] efi: Pass secure boot mode to kernel [ver #6] David Howells
2016-12-08 12:30 ` David Howells
2016-12-08 12:30 ` David Howells
2016-12-08 12:30 ` [PATCH 1/8] efi: use typed function pointers for runtime services table " David Howells
2016-12-08 12:30 ` David Howells
2016-12-08 12:30 ` [PATCH 2/8] x86/efi: Allow invocation of arbitrary runtime services " David Howells
2016-12-08 12:30 ` David Howells
2016-12-08 12:30 ` [PATCH 3/8] arm/efi: " David Howells
2016-12-08 12:30 ` David Howells
2016-12-08 12:30 ` [PATCH 4/8] efi: Add SHIM and image security database GUID definitions " David Howells
2016-12-08 12:30 ` David Howells
2016-12-08 12:30 ` [PATCH 5/8] efi: Get the secure boot status " David Howells
2016-12-08 12:30 ` David Howells
[not found] ` <148120024570.5854.10638278395097394138.stgit-S6HVgzuS8uM4Awkfq6JHfwNdhmdF6hFW@public.gmane.org>
2017-01-11 14:33 ` Matt Fleming
2017-01-11 14:33 ` Matt Fleming
2017-01-11 14:33 ` Matt Fleming
2017-01-11 15:27 ` David Howells
2017-01-11 15:27 ` David Howells
2017-01-11 15:27 ` David Howells
[not found] ` <7948.1484148443-S6HVgzuS8uM4Awkfq6JHfwNdhmdF6hFW@public.gmane.org>
2017-01-16 14:49 ` Matt Fleming
2017-01-16 14:49 ` Matt Fleming
2017-01-16 14:49 ` Matt Fleming
[not found] ` <20170116144954.GB27351-mF/unelCI9GS6iBeEJttW/XRex20P6io@public.gmane.org>
2017-01-16 15:39 ` David Howells [this message]
2017-01-16 15:39 ` David Howells
2017-01-16 15:39 ` David Howells
[not found] ` <794.1484581158-S6HVgzuS8uM4Awkfq6JHfwNdhmdF6hFW@public.gmane.org>
2017-01-23 10:52 ` David Howells
2017-01-23 10:52 ` David Howells
2017-01-23 10:52 ` David Howells
2017-01-23 21:26 ` Matt Fleming
2017-01-23 21:26 ` Matt Fleming
2017-01-23 21:26 ` Matt Fleming
2017-01-23 22:11 ` David Howells
2017-01-23 22:11 ` David Howells
2017-01-27 14:01 ` Matt Fleming
2017-01-27 14:01 ` Matt Fleming
2017-01-31 14:02 ` David Howells
2017-01-31 14:02 ` David Howells
2017-01-31 14:02 ` David Howells
2017-01-30 12:10 ` What should the default lockdown mode be if the bootloader sentinel triggers sanitization? David Howells
2017-01-30 12:10 ` David Howells
2017-01-30 13:50 ` Matt Fleming
2017-01-30 13:50 ` Matt Fleming
2017-01-30 13:50 ` Matt Fleming
2017-01-30 14:01 ` David Howells
2017-01-30 14:01 ` David Howells
2017-01-30 14:01 ` David Howells
2017-01-31 11:57 ` Matt Fleming
2017-01-31 11:57 ` Matt Fleming
2017-01-31 11:57 ` Matt Fleming
[not found] ` <148120020832.5854.5448601415491330495.stgit-S6HVgzuS8uM4Awkfq6JHfwNdhmdF6hFW@public.gmane.org>
2016-12-08 12:30 ` [PATCH 6/8] efi: Disable secure boot if shim is in insecure mode [ver #6] David Howells
2016-12-08 12:30 ` David Howells
2016-12-08 12:30 ` David Howells
2016-12-08 12:31 ` [PATCH 7/8] efi: Handle secure boot from UEFI-2.6 " David Howells
2016-12-08 12:31 ` David Howells
2016-12-08 12:31 ` [PATCH 8/8] efi: Add EFI_SECURE_BOOT bit " David Howells
2016-12-08 12:31 ` David Howells
2017-01-11 14:51 ` Matt Fleming
2017-01-11 14:51 ` Matt Fleming
2017-01-11 15:29 ` David Howells
2017-01-11 15:29 ` David Howells
2017-01-11 15:29 ` David Howells
2017-01-16 13:40 ` Matt Fleming
2017-01-16 13:40 ` Matt Fleming
[not found] ` <20170116134041.GA27351-mF/unelCI9GS6iBeEJttW/XRex20P6io@public.gmane.org>
2017-01-16 15:40 ` David Howells
2017-01-16 15:40 ` David Howells
2017-01-16 15:40 ` David Howells
2017-01-11 15:01 ` [PATCH 0/8] efi: Pass secure boot mode to kernel " Matt Fleming
2017-01-11 15:01 ` Matt Fleming
2017-01-11 15:05 ` Ard Biesheuvel
2017-01-11 15:05 ` Ard Biesheuvel
2017-01-11 15:05 ` Ard Biesheuvel
2017-01-24 17:15 ` Ard Biesheuvel
2017-01-24 17:15 ` Ard Biesheuvel
2017-01-27 18:03 ` Ard Biesheuvel
2017-01-27 18:03 ` Ard Biesheuvel
2017-01-27 18:03 ` Ard Biesheuvel
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=794.1484581158@warthog.procyon.org.uk \
--to=dhowells-h+wxahxf7alqt0dzr+alfa@public.gmane.org \
--cc=ard.biesheuvel-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
--cc=hpa-YMNOUZJC4hwAvxtiuMwx3w@public.gmane.org \
--cc=keyrings-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=linux-efi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-security-module-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=matt-mF/unelCI9GS6iBeEJttW/XRex20P6io@public.gmane.org \
--cc=pjones-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
/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.