Commit Graph

150 Commits

Author SHA1 Message Date
Steve McIntyre
fd2d9f032c New upstream version 15.8 2024-05-03 16:02:10 +01:00
Steve McIntyre
2dd2f7600d New upstream version 15.7 2023-01-22 13:05:10 +00:00
Steve McIntyre
e6ace38abd New upstream version 15.6 2022-06-23 00:16:56 +01:00
Steve McIntyre
8529e0f7f7 New upstream version 15.5 2022-04-27 22:41:59 +01:00
Steve McIntyre
8119f7183f New upstream version 15.4 2021-03-31 18:24:24 +01:00
Steve McIntyre
031e5cce38 New upstream version 15.3 2021-03-23 23:49:46 +00:00
Mathieu Trudel-Lapierre
7bf7a6d085 New upstream version 15+1533136590.3beb971 2018-08-21 14:22:44 -04:00
Mathieu Trudel-Lapierre
f892ac6608 New upstream version 15+1531942534.dd3230d 2018-07-24 16:24:23 -04:00
Mathieu Trudel-Lapierre
51d5bbcb24 New upstream version 13~git1505328971.0780644a 2017-09-14 17:48:49 -07:00
Mathieu Trudel-Lapierre
b6f94dbeac New upstream version 13~git1505328970.9c1c35c5 2017-09-13 12:09:40 -07:00
Mathieu Trudel-Lapierre
f4173af1ad New upstream version 12+1501864225.b586175 2017-08-07 17:34:45 -04:00
Mathieu Trudel-Lapierre
62f0afa2ec Import upstream version 0.9+1474479173.6c180c6 2016-09-21 20:29:42 -04:00
Mathieu Trudel-Lapierre
d3819813b8 Import upstream version 0.9+1465500757.14a5905 2016-07-26 12:02:18 -04:00
Gary Ching-Pang Lin
f852734c5a Don't verify images with the empty build key
We replaced the build key with an empty file while compiling shim
for our distro. Skip the verification with the empty build key
since this makes no sense.

Signed-off-by: Gary Ching-Pang Lin <glin@suse.com>
2014-10-02 00:08:50 -04:00
Peter Jones
ada75ade4c Don't append an empty cert list to MokListRT if vendor_cert_size is 0.
Signed-off-by: Peter Jones <pjones@redhat.com>
2014-10-02 00:02:43 -04:00
Peter Jones
a16340e3f7 Actually find the relocations correctly and process them that way.
Find the relocations based on the *file* address in the old binary,
because it's only the same as the virtual address some of the time.

Also perform some extra validation before processing it, and don't bail
out in /error/ if both ReloceBase and RelocEnd are null - that condition
is fine.

Signed-off-by: Peter Jones <pjones@redhat.com>
2014-09-30 22:51:32 -04:00
Peter Jones
631225fb33 Fix our "in_protocol" printing.
When I merged 4bfb13d and fixed the conflicts, I managed to make the
in_protocol test exactly backwards, so that's why we don't currently see
error messages.

Signed-off-by: Peter Jones <pjones@redhat.com>
2014-09-21 16:25:27 -04:00
Peter Jones
213e29e25b Don't call AuthenticodeVerify if vendor_cert_size is 0.
Actually check the size of our vendor cert quite early, so that there's
no confusion as to what's going on.

This isn't strictly necessary, in that in all cases if vendor_cert_size
is 0, then AuthenticodeVerify -> Pkcs7Verify() -> d2i_X509() will result
in a NULL "Cert", and it will return FALSE, and we'll reject the
signature, but better to avoid all that code in the first place.  Belt
and suspenders and whatnot.

Based on a patch from https://github.com/TBOpen .

Signed-off-by: Peter Jones <pjones@redhat.com>
2014-09-21 16:25:27 -04:00
Peter Jones
0dcd5a8e90 Validate computed hash bases/hash sizes more thoroughly.
I screwed one of these up when working on 750584c, and it's a real pain
to figure out, so that means we should be validating them.

Signed-off-by: Peter Jones <pjones@redhat.com>
2014-09-21 16:25:20 -04:00
Peter Jones
afec82ac7e Make 64-on-32 maybe work on x86_64.
This is mostly based on a patch (https://github.com/mjg59/shim/issues/30)
from https://github.com/TBOpen , which refactors our __LP64__
tests to be tests of the header magic instead.  I've simplified things
by using what we've pre-loaded into "context" and making some helper
functions so the conditionals in most of the code say what they do,
instead of how they work.

Note that we're only allowing that from in_protocol's loader - that is,
we'll let 64-bit grub load a 32-bit kernel or 32-bit grub load a 64-bit
kernel, but 32-bit shim isn't loading a 64-bit grub.

Signed-off-by: Peter Jones <pjones@redhat.com>
2014-09-21 13:12:03 -04:00
Peter Jones
486bf03e54 Actually refer to the base relocation table of our loaded image.
Currently when we process base relocations, we get the correct Data
Directory pointer from the headers (context->RelocDir), and that header
has been copied into our pristine allocated image when we copied up to
SizeOfHeaders.  But the data it points to has not been mirrored in to
the new image, so it is whatever data AllocPool() gave us.

This patch changes relocate_coff() to refer to the base relocation table
from the image we loaded from disk, but apply the fixups to the new
copy.

I have no idea how x86_64 worked without this, but I can't make aarch64
work without it.  I also don't know how Ard or Leif have seen aarch64
work.  Maybe they haven't?  Leif indicated on irc that they may have
only tested shim with simple "hello world" applications from gnu-efi;
they are certainly much less complex than grub.efi, and are generated
through a different linking process.

My only theory is that we're getting recycled data there pretty reliably
that just makes us /not/ process any relocations, but since our
ImageBase is 0, and I don't think we ever load grub with 0 as its base
virtual address, that doesn't follow.  I'm open to any other ideas
anybody has.

I do know that on x86_64 (and presumably aarch64 as well), we don't
actually start seeing *symptoms* of this bug until the first chunk[0] of
94c9a77f is applied[1].  Once that is applied, relocate_coff() starts
seeing zero[2] for both RelocBase->VirtualAddress and
RelocBase->SizeOfBlock, because RelocBase is a (generated, relative)
pointer that only makes sense in the context of the original binary, not
our partial copy.  Since RelocBase->SizeOfBlock is tested first,
relocate_base() gives us "Reloc block size is invalid"[3] and returns
EFI_UNSUPPORTED.  At that point shim exits with an error.

[0] The second chunk of 94c9a77f patch makes no difference on this
    issue.
[1] I don't see why at all.
[2] Which could really be any value since it's AllocatePool() and not
    AllocateZeroPool() results, but 0 is all I've observed; I think
    AllocatePool() has simply never recycled any memory in my test
    cases.
[3] which is silent because perror() tries to avoid talking because that
    has caused much crashing in the past; work needs to go in to 0.9 for
    this.

Signed-off-by: Peter Jones <pjones@redhat.com>
2014-09-19 09:30:26 -04:00
Peter Jones
00c8418866 Make sure we don't try to load a binary from a different arch.
Since in theory you could, for example, get an x86_64 binary signed that
also behaves as an ARM executable, we should be checking this before
people build on other architectures.

Signed-off-by: Peter Jones <pjones@redhat.com>
2014-08-27 16:40:57 -04:00
Ard Biesheuvel
4ca6087915 Handle empty .reloc section in PE/COFF loader
On archs where no EFI aware objcopy is available, the generated PE/COFF
header contains a .reloc section which is completely empty. Handle this by
- returning early from relocate_coff() with EFI_SUCCESS,
- ignoring discardable sections in the section loader.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
2014-08-27 11:49:39 -04:00
Gary Ching-Pang Lin
875eb1b9d5 Simplify the checking of SB and DB states
MokSBState and MokDBState are just 1 byte variables, so a UINT8
local variable is sufficient to include the content.

Signed-off-by: Gary Ching-Pang Lin <glin@suse.com>

Conflicts:
	shim.c
2014-06-25 10:58:23 -04:00
Peter Jones
9ea3d9b401 Make sure we default to assuming we're locked down.
If "SecureBoot" exists but "SetupMode" does not, assume "SetupMode" says
we're not in Setup Mode.

Signed-off-by: Peter Jones <pjones@redhat.com>
2014-06-25 10:55:56 -04:00
Gary Ching-Pang Lin
7a72592b75 Check the secure variables with the lib functions
There are functions defined in lib to check the secure variables.
Use the functions to shun the duplicate code.

Signed-off-by: Gary Ching-Pang Lin <glin@suse.com>

Conflicts:
	shim.c
2014-06-25 10:55:12 -04:00
Peter Jones
3b41442227 Explain the logic in secure_mode() better.
I was getting confused reading it, and I wrote it, so clearly it needs
more commentry.

Signed-off-by: Peter Jones <pjones@redhat.com>
2014-06-25 10:46:52 -04:00
Gary Ching-Pang Lin
fe8527aaa6 Free the string from DevicePathToStr
Signed-off-by: Gary Ching-Pang Lin <glin@suse.com>

Conflicts:
	shim.c
2014-06-25 10:33:25 -04:00
Gary Ching-Pang Lin
e50cfe371f Silence the functions of shim protocol
When grub2 invokes the functions of shim protocol in gfx mode,
OutputString in shim could distort the screen.

Signed-off-by: Gary Ching-Pang Lin <glin@suse.com>

Conflicts:
	shim.c

(modified by pjones to include some newer Prints that weren't there when
Gary did the initial work here.)
2014-06-25 10:30:38 -04:00
Gary Ching-Pang Lin
95c6743e4c No newline for console_notify
The newlines are for Print(), not console_notify().

Signed-off-by: Gary Ching-Pang Lin <glin@suse.com>

Conflicts:
	shim.c
2014-06-25 10:12:43 -04:00
Gary Ching-Pang Lin
c902256046 Remove grubpath in generate_path()
The variable is not used anymore.

Signed-off-by: Gary Ching-Pang Lin <glin@suse.com>
2014-06-25 09:56:27 -04:00
Gary Ching-Pang Lin
b8070380ee Check the first 4 bytes of the certificate
A non-DER encoding x509 certificate may be mistakenly enrolled into
db or MokList. This commit checks the first 4 bytes of the certificate
to ensure that it's DER encoding.

This commit also removes the iteration of the x509 signature list.
Per UEFI SPEC, each x509 signature list contains only one x509 certificate.
Besides, the size of certificate is incorrect. The size of the header must
be substracted from the signature size.

Signed-off-by: Gary Ching-Pang Lin <glin@suse.com>
2014-06-25 09:55:49 -04:00
Gary Ching-Pang Lin
da49ac6d69 Fetch the netboot image from the same device
The previous strategy is to locate the first available PXE_BASE_CODE
protocol and to fetch the second stage image from it, and this may
cause shim to fetch the wrong second stage image, i.e. grub.efi.

Consider the machine with the following boot order:
1. PXE Boot
2. Hard Drive

Assume that the EFI image, e.g. bootx64.efi, in the PXE server is
broken, then "PXE Boot" will fail and fallback to "Hard Drive". While
shim.efi in "Hard Drive" is loaded, it will find the PXE protocol is
available and fetch grub.efi from the PXE server, not grub.efi in the
disk.

This commit checks the DeviceHandle from Loaded Image. If the device
supports PXE, then shim fetches grub.efi with the PXE protocol. Otherwise,
shim loads grub.efi from the disk.

Signed-off-by: Gary Ching-Pang Lin <glin@suse.com>
2014-06-25 09:53:23 -04:00
Peter Jones
a63d665fb8 Get rid of SectionCache in generate_hash(), it is unused.
Signed-off-by: Peter Jones <pjones@redhat.com>
2014-04-11 15:07:45 -04:00
Peter Jones
16a8356350 Kees' patch missed the offset adjustment to PEHdr.
In read_header, we adjust context->PEHdr's address by doshdr->e_lfanew.
If we're going to recompute that address, we have to adjust it here
too.

Signed-off-by: Peter Jones <pjones@redhat.com>
2014-04-11 15:05:24 -04:00
Kees Cook
47a9d2c908 additional bounds-checking on section sizes
This adds additional bounds-checking on the section sizes. Also adds
-Wsign-compare to the Makefile and replaces some signed variables with
unsigned counteparts for robustness.

Signed-off-by: Kees Cook <kees@ubuntu.com>
2014-04-11 14:41:22 -04:00
Peter Jones
cf90edfff5 Allow fallback to use the system's LoadImage/StartImage .
Track use of the system's LoadImage(), and when the next StartImage()
call is for an image the system verified, allow that to count as
participating, since it has been verified by the system's db.

Signed-off-by: Peter Jones <pjones@redhat.com>
2014-02-14 17:48:01 -05:00
Matthew Garrett
7c1f49dacc Don't hook system services if shim has no built-in keys
Shim should only need to enforce its security policy when its launching
binaries signed with its built-in key. Binaries signed by keys in db or
Mokdb should be able to rely on their own security policy.

Signed-off-by: Matthew Garrett <matthew.garrett@nebula.com>
2013-11-19 10:20:34 -05:00
Matthew Garrett
e60f118155 Clarify meaning of insecure_mode
insecure_mode was intended to indicate that the user had explicity disabled
checks with mokutil, which means it wasn't the opposite of secure_mode().
Change the names to clarify this and don't show the insecure mode message
unless the user has explicitly enabled that mode.

Signed-off-by: Matthew Garrett <matthew.garrett@nebula.com>
2013-11-19 10:20:34 -05:00
Andrew Boie
acacfca319 shim: improve error messages
%r when used in Print() will show a string representation of
an EFI_STATUS code.

Change-Id: I6db47f5213454603bd66177aca378ad01e9f0bd4
Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
2013-11-12 10:32:48 -05:00
Mohanraj S
b6a12d99be shim.c: Add support for hashing/relocation of 32-bit binaries
Change-Id: Ib93305f7f1691d1b142567507df1058de62dde06
Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
2013-11-12 10:25:23 -05:00
Andrew Boie
42426e6eae fix verify_mok()
() Fix the return value semantics. If the MokList doesn't
exist, we are OK. If the MokList was compromised but we
were able to erase it, that is OK too. Only if the list
can't be nuked do we return an error.

() Fix use of potentially uninitialized attribute variable

() Actually use the return value when called from verify_buffer.

Change-Id: If16df21d79c52a1726928df96d133390cde4cb7e
Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
2013-11-12 10:24:01 -05:00
Peter Jones
0948ac0971 Fix check logic for SetupMode variable.
After going back and inspecting this further, the logic for "SetupMode"
being present at all was incorrect.  Also initialize our state earlier
so it's sure to always be set.

Signed-off-by: Peter Jones <pjones@redhat.com>
2013-11-06 13:59:02 -05:00
Peter Jones
6b1f8796ff Don't free GetVariable() return data without checking the status code.
This breaks every machine from before Secure Boot was a thing.

Signed-off-by: Peter Jones <pjones@redhat.com>
2013-10-30 16:36:01 -04:00
Peter Jones
321797142e We should be checking both mok and the system's SB settings
When we call hook_system_services(), we're currently only checking mok's
setting.  We should use secure_mode() instead so it'll check both.

Signed-off-by: Peter Jones <pjones@redhat.com>
2013-10-28 10:41:03 -04:00
Peter Jones
cf718e1940 Revert "additional bounds-checking on section sizes"
This reverts commit 21e40f0174.

In principle I like the idea of what's going on here, but
generate_hash() really does need to have the expected result.
2013-10-23 10:50:36 -04:00
Peter Jones
8044a321f9 Don't reject all binaries without a certificate database.
If a binary isn't signed, but its hash is enrolled in db, it won't have
a certificate database.  So in those cases, don't check it against
certificate databases in db/dbx/etc, but we don't need to reject it
outright.

Signed-off-by: Peter Jones <pjones@redhat.com>
2013-10-22 13:40:08 -04:00
Kees Cook
a0df78b73f additional bounds-checking on section sizes
This adds additional bounds-checking on the section sizes. Also adds
-Wsign-compare to the Makefile and replaces some signed variables with
unsigned counteparts for robustness.

Signed-off-by: Kees Cook <kees@ubuntu.com>
2013-10-22 11:23:51 -04:00
Peter Jones
98a9957866 Unhook system services as we exit.
If we never find a valid thing to boot, we need to undo the weird things
we've done.

Signed-off-by: Peter Jones <pjones@redhat.com>
2013-10-04 15:31:48 -04:00
Peter Jones
4ab978a369 Try to actually make debug printing look reasonable.
Signed-off-by: Peter Jones <pjones@redhat.com>
2013-10-04 11:51:09 -04:00