]> git.proxmox.com Git - efi-boot-shim.git/log
efi-boot-shim.git
10 years agoMake list_keys() index variables all be signed.
Peter Jones [Sun, 21 Sep 2014 17:19:30 +0000 (13:19 -0400)]
Make list_keys() index variables all be signed.

We build with -Werror=signed-compare in fedora/rhel rpms, and this
showed up.

Signed-off-by: Peter Jones <pjones@redhat.com>
10 years agoDo the same for ia32...
Peter Jones [Sun, 21 Sep 2014 17:11:11 +0000 (13:11 -0400)]
Do the same for ia32...

Once again, on ia32 this time, we see:

00000120  47 84 00 00 0a 00 00 00  00 00 00 00 00 00 00 00 |G...............|

Which is where the pointer on ia32 for the Base Relocation Table should
be.  It points to 0x8447, which isn't a particularly reasonable address as
numbers go, and happens to have this data there:

00008440  6f 00 6e 00 66 00 69 00  67 00 75 00 72 00 65 00 |o.n.f.i.g.u.r.e.|
00008450  00 00 49 00 50 00 76 00  36 00 28 00 00 00 2c 00 |..I.P.v.6.(...,.|
00008460  25 00 73 00 2c 00 00 00  29 00 00 00 25 00 64 00 |%.s.,...)...%.d.|
00008470  2e 00 25 00 64 00 2e 00  25 00 64 00 2e 00 25 00 |..%.d...%.d...%.|
00008480  64 00 00 00 44 00 48 00  43 00 50 00 00 00 49 00 |d...D.H.C.P...I.|
00008490  50 00 76 00 34 00 28 00  00 00 2c 00 25 00 73 00 |P.v.4.(...,.%.s.|

And so that table is, in theory, this part:

00008447                       00  67 00 75 00 72 00 65 00 |       .g.u.r.e.|
00008450  00                                               |.               |

Which is pretty clearly not a pointer table of any kind.

So give ia32 the same treatment as x86_64, and now all arches work basically
the same.

Signed-off-by: Peter Jones <pjones@redhat.com>
10 years agoGenerate a sane PE header on shim, fallback, and MokManager.
Peter Jones [Sat, 20 Sep 2014 18:03:03 +0000 (14:03 -0400)]
Generate a sane PE header on shim, fallback, and MokManager.

It turns out a7249a65 was masking a second problem - on some binaries,
when we actually don't have any base relocations at all, binutils'
"objcopy --target efi-app-x86_64" is generating a PE header with a base
relocations pointer that happily points into the middle of our text
section.  So with shim processing base relocations correctly, it refuses
to load those binaries.

For example, on one binary I just built:

00000130  00 a0 00 00 0a 00 00 00  00 00 00 00 00 00 00 00 |................|

which says there's a Base Relocation Table at 0xa000 that's 0xa bytes long.
That's here:

0000a000  58 00 29 00 00 00 00 00  48 00 44 00 28 00 50 00 |X.).....H.D.(.P.|
0000a010  61 00 72 00 74 00 25 00  64 00 2c 00 53 00 69 00 |a.r.t.%.d.,.S.i.|
0000a020  67 00 25 00 67 00 29 00  00 00 00 00 00 00 00 00 |g.%.g.).........|
0000a030  48 00 44 00 28 00 50 00  61 00 72 00 74 00 25 00 |H.D.(.P.a.r.t.%.|

So the table is:

0000a000  58 00 29 00 00 00 00 00  48 00                   |X.).....H.      |

That wouldn't be so bad, except those binaries are MokManager.efi,
fallback.efi, and shim.efi, and sometimes they're .reloc, which we're
actually trying to handle correctly now because grub builds with a real
and valid .reloc table.  So though I didn't think there was any hair
left on this yak, more shaving ensues.

With this change, instead of letting objcopy do whatever it likes, we
switch to "-O binary" and merely link in a header that's appropriate for
our binaries.  This is the same method Ard wrote for aarch64, and it
seems to work fine in either place (modulo some minor changes.)

At some point this should be merged into gnu-efi instead of carrying our
own crt0-efi-x86_64.S, but that's a less immediate problem.

I did not need this problem.

Signed-off-by: Peter Jones <pjones@redhat.com>
10 years agoFix our "in_protocol" printing.
Peter Jones [Fri, 19 Sep 2014 20:46:01 +0000 (16:46 -0400)]
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>
10 years agoDon't call AuthenticodeVerify if vendor_cert_size is 0.
Peter Jones [Fri, 19 Sep 2014 15:48:56 +0000 (11:48 -0400)]
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>
10 years agoValidate computed hash bases/hash sizes more thoroughly.
Peter Jones [Sat, 20 Sep 2014 20:47:08 +0000 (16:47 -0400)]
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>
10 years agoMake 64-on-32 maybe work on x86_64.
Peter Jones [Fri, 19 Sep 2014 15:37:35 +0000 (11:37 -0400)]
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>
10 years agoActually refer to the base relocation table of our loaded image.
Peter Jones [Thu, 18 Sep 2014 22:34:38 +0000 (18:34 -0400)]
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>
10 years agoMake sure we don't try to load a binary from a different arch.
Peter Jones [Wed, 27 Aug 2014 20:39:51 +0000 (16:39 -0400)]
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>
10 years agoDon't name something exit().
Peter Jones [Wed, 27 Aug 2014 17:26:23 +0000 (13:26 -0400)]
Don't name something exit().

On aarch64 due to some terrifying include chain we wind up with
Cryptlib's definition of exit here.  I'm not a glutton for punishment,
so I'm just changing the name so it's not coliding.

Signed-off-by: Peter Jones <pjones@redhat.com>
10 years agoHandle empty .reloc section in PE/COFF loader
Ard Biesheuvel [Wed, 13 Aug 2014 11:35:38 +0000 (13:35 +0200)]
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>
10 years agoFix typo from Ard's old tree 32-bit ARM patch.
Peter Jones [Wed, 27 Aug 2014 15:48:39 +0000 (11:48 -0400)]
Fix typo from Ard's old tree 32-bit ARM patch.

We don't need to .data entries; the second one should be .data*.  He's
since fixed this in his tree, but I'd already pulled it and pushed to
master.

Signed-off-by: Peter Jones <pjones@redhat.com>
10 years agoUpdate openssl to 0.9.8zb
Gary Ching-Pang Lin [Tue, 19 Aug 2014 04:15:00 +0000 (12:15 +0800)]
Update openssl to 0.9.8zb

Also update to Tiano Cryptlib r15802 and remove the execute mode
bits from the C and header files of openssl

10 years agoAdd support for 32-bit ARM
Ard Biesheuvel [Tue, 12 Aug 2014 13:33:22 +0000 (15:33 +0200)]
Add support for 32-bit ARM

This adds support for building the shim for a 32-bit ARM UEFI environment.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
10 years agoAdd support for 64-bit ARM (AArch64)
Ard Biesheuvel [Tue, 12 Aug 2014 13:33:21 +0000 (15:33 +0200)]
Add support for 64-bit ARM (AArch64)

This adds support for building the shim for a 64-bit ARM UEFI environment.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
10 years agoFactor out x86-isms and add cross compile support
Ard Biesheuvel [Tue, 12 Aug 2014 13:33:20 +0000 (15:33 +0200)]
Factor out x86-isms and add cross compile support

This patch cleans up and refactors the Makefiles to better allow new
architectures to be added:
- remove unused Makefile definitions
- import Makefile definitions from top level rather than redefining
- move x86 specific CFLAGS to inside ifeq() blocks
- remove x86 inline asm
- allow $(FORMAT) to be overridden: this is necessary as there exists no
  EFI or PE/COFF aware objcopy for ARM

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
10 years agounhook_system_services: bail on systab == NULL
Ard Biesheuvel [Tue, 12 Aug 2014 13:33:19 +0000 (15:33 +0200)]
unhook_system_services: bail on systab == NULL

Prevent unhook_system_services() from dereferencing a NULL systab, which
may occur if hook_system_services() has never been called.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
10 years agoCryptLib: undefine va_arg and friends before redefining them
Ard Biesheuvel [Tue, 12 Aug 2014 13:33:18 +0000 (15:33 +0200)]
CryptLib: undefine va_arg and friends before redefining them

Upstream GNU-EFI contains changes to efistdarg.h resulting in the va_start,
va_arg and va_end macros to be #defined unconditionally. Make sure we #undef
them before overriding the definitions.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
10 years agoReplace build instructions in README with something not completely wrong.
Peter Jones [Mon, 21 Jul 2014 20:15:07 +0000 (16:15 -0400)]
Replace build instructions in README with something not completely wrong.

These were really, really out of date.

10 years agoUpdate openssl to 0.9.8za
Gary Ching-Pang Lin [Wed, 9 Jul 2014 07:02:50 +0000 (15:02 +0800)]
Update openssl to 0.9.8za

Also update to Tiano Cryptlib r15638

10 years agoSimplify the checking of SB and DB states
Gary Ching-Pang Lin [Thu, 31 Oct 2013 09:32:13 +0000 (17:32 +0800)]
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

10 years agoMake sure we default to assuming we're locked down.
Peter Jones [Wed, 25 Jun 2014 14:55:56 +0000 (10:55 -0400)]
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>
10 years agoCheck the secure variables with the lib functions
Gary Ching-Pang Lin [Thu, 31 Oct 2013 08:08:32 +0000 (16:08 +0800)]
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

10 years agoExplain the logic in secure_mode() better.
Peter Jones [Wed, 25 Jun 2014 14:46:19 +0000 (10:46 -0400)]
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>
10 years agoFree the string from DevicePathToStr
Gary Ching-Pang Lin [Thu, 31 Oct 2013 09:54:46 +0000 (17:54 +0800)]
Free the string from DevicePathToStr

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

10 years agoSilence the functions of shim protocol
Gary Ching-Pang Lin [Tue, 1 Oct 2013 03:58:52 +0000 (11:58 +0800)]
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.)

10 years agoRemove the duplicate calls in lib/console.c
Gary Ching-Pang Lin [Thu, 31 Oct 2013 09:55:17 +0000 (17:55 +0800)]
Remove the duplicate calls in lib/console.c

Signed-off-by: Gary Ching-Pang Lin <glin@suse.com>
10 years agoNo newline for console_notify
Gary Ching-Pang Lin [Mon, 28 Oct 2013 08:36:34 +0000 (16:36 +0800)]
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

10 years agoExclude ca.crt while signing EFI images
Gary Ching-Pang Lin [Mon, 4 Nov 2013 09:51:55 +0000 (17:51 +0800)]
Exclude ca.crt while signing EFI images

If ca.crt was added into the certificate database, ca.crt would be the first
certificate in the signature. Because shim couldn't verify ca.crt with the
embedded shim.cer, it failed to load MokManager.efi.signed and
fallback.efi.signed.

Signed-off-by: Gary Ching-Pang Lin <glin@suse.com>
10 years agoMokManager: handle the error status from ReadKeyStroke
Gary Ching-Pang Lin [Tue, 3 Dec 2013 07:52:02 +0000 (15:52 +0800)]
MokManager: handle the error status from ReadKeyStroke

On some machines, even though the key event was signaled, ReadKeyStroke
still got EFI_NOT_READY. This commit handles the error status to avoid
console_get_keystroke from returning unexpected keys.

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

10 years agoMokManager: delete the BS+NV variables the right way
Gary Ching-Pang Lin [Fri, 7 Mar 2014 08:56:14 +0000 (16:56 +0800)]
MokManager: delete the BS+NV variables the right way

LibDeleteVariable assumes that the variable is RT+NV and it
won't work on a BS+NV variable.

Signed-off-by: Gary Ching-Pang Lin <glin@suse.com>
10 years agoRemove grubpath in generate_path()
Gary Ching-Pang Lin [Mon, 26 May 2014 08:49:10 +0000 (16:49 +0800)]
Remove grubpath in generate_path()

The variable is not used anymore.

Signed-off-by: Gary Ching-Pang Lin <glin@suse.com>
10 years agoCheck the first 4 bytes of the certificate
Gary Ching-Pang Lin [Tue, 27 May 2014 09:42:00 +0000 (17:42 +0800)]
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>
10 years agoFetch the netboot image from the same device
Gary Ching-Pang Lin [Tue, 27 May 2014 06:12:32 +0000 (14:12 +0800)]
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>
10 years ago[fallback] Try to boot the first boot option anyway
Gary Ching-Pang Lin [Wed, 5 Mar 2014 10:14:09 +0000 (18:14 +0800)]
[fallback] Try to boot the first boot option anyway

Some UEFI implementations never care the boot options, so the
restored boot options could be just ignored and this results in
endless reboot. To avoid this situation, this commit makes
fallback.efi to load the first matched boot option even if there
is no boot option to be restored. It may not be perfect, but at
least the bootloader is loaded...

Signed-off-by: Gary Ching-Pang Lin <glin@suse.com>
10 years ago[fallback] Fix the data size for boot option comparison
Gary Ching-Pang Lin [Thu, 6 Mar 2014 02:57:02 +0000 (10:57 +0800)]
[fallback] Fix the data size for boot option comparison

Signed-off-by: Gary Ching-Pang Lin <glin@suse.com>
10 years ago[fallback] Avoid duplicate old BootOrder
Gary Ching-Pang Lin [Thu, 6 Mar 2014 03:58:36 +0000 (11:58 +0800)]
[fallback] Avoid duplicate old BootOrder

set_boot_order() already copies the old BootOrder to the variable,
bootorder. Besides, we can adjust BootOrder when adding the newly
generated boot option. So, we don't have to copy the old one again
in update_boot_order(). This avoid the duplicate entries in BootOrder.

Signed-off-by: Gary Ching-Pang Lin <glin@suse.com>
10 years agoGet rid of SectionCache in generate_hash(), it is unused.
Peter Jones [Fri, 11 Apr 2014 19:07:45 +0000 (15:07 -0400)]
Get rid of SectionCache in generate_hash(), it is unused.

Signed-off-by: Peter Jones <pjones@redhat.com>
10 years agoKees' patch missed the offset adjustment to PEHdr.
Peter Jones [Fri, 11 Apr 2014 19:05:24 +0000 (15:05 -0400)]
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>
10 years agoadditional bounds-checking on section sizes
Kees Cook [Mon, 3 Dec 2012 23:52:48 +0000 (15:52 -0800)]
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>
10 years agoAllow fallback to use the system's LoadImage/StartImage .
Peter Jones [Fri, 14 Feb 2014 20:38:25 +0000 (15:38 -0500)]
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>
10 years agoAdd a failure case to the test plan and fix an ordering error.
Peter Jones [Fri, 14 Feb 2014 19:44:31 +0000 (14:44 -0500)]
Add a failure case to the test plan and fix an ordering error.

Signed-off-by: Peter Jones <pjones@redhat.com>
10 years agoAdd a preliminary test plan.
Peter Jones [Fri, 14 Feb 2014 19:06:45 +0000 (14:06 -0500)]
Add a preliminary test plan.

Because you know you wanted a test plan.  You feel it deeply inside.

Note that none of the /negative/ cases are tested yet.

Signed-off-by: Peter Jones <pjones@redhat.com>
10 years ago[fallback] Attempt to re-use existing entries when possible.
Peter Jones [Fri, 31 Jan 2014 15:31:10 +0000 (10:31 -0500)]
[fallback] Attempt to re-use existing entries when possible.

Some firmwares seem to ignore our boot entries and put their fallback
entries back on top.  Right now that results in a lot of boot entries
for our stuff, a la https://bugzilla.redhat.com/show_bug.cgi?id=995834 .

Instead of that happening, if we simply find existing entries that match
the entry we would create and move them to the top of the boot order,
the machine will continue to operate in failure mode (which we can't
avoid), but at least we won't create thousands of extra entries.

Signed-off-by: Peter Jones <pjones@redhat.com>
10 years ago[fallback] For HD() device paths, use just the media node and later.
Peter Jones [Fri, 31 Jan 2014 15:30:24 +0000 (10:30 -0500)]
[fallback] For HD() device paths, use just the media node and later.

UEFI 2.x section 3.1.2 provides for "short-form device path", where the
first element specified is a "hard drive media device path", so that you
can move a disk around on different buses without invalidating your
device path.  Fallback has not been using this option, though in most
cases efibootmgr has.

Note that we still keep the full device path, because LoadImage()
isn't necessarily the layer where HD() works - one some systems BDS is
responsible for resolving the full path and passes that to LoadImage()
instead.  So we have to do LoadImage() with the full path.

10 years agoError check the right thing in get_variable_attr() when allocating.
Peter Jones [Fri, 15 Nov 2013 15:55:37 +0000 (10:55 -0500)]
Error check the right thing in get_variable_attr() when allocating.

Signed-off-by: Peter Jones <pjones@redhat.com>
10 years agoRewrite directory traversal allocation path so coverity can grok it.
Peter Jones [Fri, 15 Nov 2013 14:38:41 +0000 (09:38 -0500)]
Rewrite directory traversal allocation path so coverity can grok it.

The things we do for our tools.  In this case, make the AllocatePool()
happen outside of a conditional, even though that conditional will
always bee satisfied.  This way coverity won't think we're setting fi
to NULL and passing it to StrCaseCmp.

Signed-off-by: Peter Jones <pjones@redhat.com>
10 years agoInitialize entries before we pass it to another function.
Peter Jones [Fri, 15 Nov 2013 14:24:01 +0000 (09:24 -0500)]
Initialize entries before we pass it to another function.

Coverity scan noticed that entries is uninitialized when we pass its
location to another function.

Signed-off-by: Peter Jones <pjones@redhat.com>
10 years agoFix wrong sizeof().
Peter Jones [Fri, 15 Nov 2013 14:21:53 +0000 (09:21 -0500)]
Fix wrong sizeof().

CHAR16* vs CHAR16**, so the result is the same on all platforms.

Detected by coverity.

Signed-off-by: Peter Jones <pjones@redhat.com>
10 years agoLengths that might be -1 can't be unsigned, Peter.
Peter Jones [Thu, 21 Nov 2013 16:26:08 +0000 (11:26 -0500)]
Lengths that might be -1 can't be unsigned, Peter.

Signed-off-by: Peter Jones <pjones@redhat.com>
10 years agoFix path generation for Dhcpv4 bootloader.
Peter Jones [Wed, 20 Nov 2013 17:20:23 +0000 (12:20 -0500)]
Fix path generation for Dhcpv4 bootloader.

Right now we always look for e.g. "\grubx64.efi", which is completely
wrong.  This makes it look for the path shim was loaded from and modify
that to end in a sanitized version of our default loader name.

Resolves: rhbz#1032583

Signed-off-by: Peter Jones <pjones@redhat.com>
10 years agoDon't hook system services if shim has no built-in keys
Matthew Garrett [Tue, 19 Nov 2013 15:15:55 +0000 (10:15 -0500)]
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>
10 years agoClarify meaning of insecure_mode
Matthew Garrett [Tue, 19 Nov 2013 15:09:13 +0000 (10:09 -0500)]
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>
10 years agoshim: improve error messages
Andrew Boie [Tue, 12 Nov 2013 01:29:06 +0000 (17:29 -0800)]
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>
10 years agoallow 32-bit compilation with 64-bit compiler
Andrew Boie [Tue, 12 Nov 2013 00:17:20 +0000 (16:17 -0800)]
allow 32-bit compilation with 64-bit compiler

Also removed unused LIB_PATH from some Makefiles.

Change-Id: I7d28d18f7531b51b6121a2ffb88bcaedec57c467
Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
10 years agopropagate some path variables
Andrew Boie [Tue, 12 Nov 2013 00:15:39 +0000 (16:15 -0800)]
propagate some path variables

If these are overridden on the command line, pass them along to
the sub-makes.

Change-Id: I531ccb5d2f5e4be8e99d4892cdcfffffc1ad9877
Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
10 years agofix fallback.so build dependency
Andrew Boie [Tue, 12 Nov 2013 00:14:22 +0000 (16:14 -0800)]
fix fallback.so build dependency

Exposed during parallel builds

Change-Id: I9867858166dcafd69438f37ee5da14a267ace8f4
Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
10 years agofallback.c: fix 32-bit compilation
Andrew Boie [Tue, 12 Nov 2013 00:12:23 +0000 (16:12 -0800)]
fallback.c: fix 32-bit compilation

fh->Read expects pointer to 32-bit int, use UINTN

Change-Id: If1a728efd51a9a24dfcd8123e84bf4c0713491fe
Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
10 years agoproperly compile OpenSSL in 32-bit mode
Andrey Petrov [Mon, 11 Nov 2013 21:46:42 +0000 (13:46 -0800)]
properly compile OpenSSL in 32-bit mode

Change-Id: Iff3ee5ae0f0b95b282b99a23e465723b4e9f6104
Signed-off-by: Andrey Petrov <andrey.petrov@intel.com>
Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
10 years agonetboot.h: fix build error on 32-bit systems
Andrew Boie [Thu, 31 Oct 2013 20:56:56 +0000 (13:56 -0700)]
netboot.h: fix build error on 32-bit systems

Function prototype/implementation mismatch.

Change-Id: I89aaae1b49d0372d3aed76fc21c194e0ae55f72e
Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
10 years agoshim.c: Add support for hashing/relocation of 32-bit binaries
Mohanraj S [Tue, 27 Aug 2013 16:27:00 +0000 (09:27 -0700)]
shim.c: Add support for hashing/relocation of 32-bit binaries

Change-Id: Ib93305f7f1691d1b142567507df1058de62dde06
Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
10 years agofix verify_mok()
Andrew Boie [Mon, 15 Apr 2013 21:11:17 +0000 (14:11 -0700)]
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>
10 years agoBump version to 0.7.
Peter Jones [Wed, 6 Nov 2013 19:07:05 +0000 (14:07 -0500)]
Bump version to 0.7.

Do not use 0.6; on some machines it misunderstands the SetupMode
variable.

Signed-off-by: Peter Jones <pjones@redhat.com>
10 years agoFix check logic for SetupMode variable.
Peter Jones [Wed, 6 Nov 2013 18:59:02 +0000 (13:59 -0500)]
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>
10 years agoMake tag its own make target, and make it sign tags.
Peter Jones [Thu, 31 Oct 2013 15:16:32 +0000 (11:16 -0400)]
Make tag its own make target, and make it sign tags.

Signed-off-by: Peter Jones <pjones@redhat.com>
10 years agoBump version to 0.6
Peter Jones [Thu, 31 Oct 2013 15:12:24 +0000 (11:12 -0400)]
Bump version to 0.6

Signed-off-by: Peter Jones <pjones@redhat.com>
10 years agoDon't free GetVariable() return data without checking the status code.
Peter Jones [Wed, 30 Oct 2013 20:36:01 +0000 (16:36 -0400)]
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>
10 years agoWe should be checking both mok and the system's SB settings
Peter Jones [Mon, 28 Oct 2013 14:41:03 +0000 (10:41 -0400)]
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>
10 years agoRevert "additional bounds-checking on section sizes"
Peter Jones [Wed, 23 Oct 2013 14:50:36 +0000 (10:50 -0400)]
Revert "additional bounds-checking on section sizes"

This reverts commit 21e40f0174814b3d91836e38c7cf95c8f2f1f3a4.

In principle I like the idea of what's going on here, but
generate_hash() really does need to have the expected result.

11 years agoDon't reject all binaries without a certificate database.
Peter Jones [Tue, 22 Oct 2013 17:36:54 +0000 (13:36 -0400)]
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>
11 years agoadditional bounds-checking on section sizes
Kees Cook [Mon, 3 Dec 2012 23:52:48 +0000 (15:52 -0800)]
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>
11 years agoBump version to 0.5
Peter Jones [Fri, 4 Oct 2013 21:04:12 +0000 (17:04 -0400)]
Bump version to 0.5

Signed-off-by: Peter Jones <pjones@redhat.com>
11 years agoUnhook system services as we exit.
Peter Jones [Fri, 4 Oct 2013 19:29:29 +0000 (15:29 -0400)]
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>
11 years agoPut SHIM_VERBOSE under shim's guid, not global.
Peter Jones [Fri, 4 Oct 2013 17:54:35 +0000 (13:54 -0400)]
Put SHIM_VERBOSE under shim's guid, not global.

Signed-off-by: Peter Jones <pjones@redhat.com>
11 years agoTry to actually make debug printing look reasonable.
Peter Jones [Fri, 4 Oct 2013 14:22:46 +0000 (10:22 -0400)]
Try to actually make debug printing look reasonable.

Signed-off-by: Peter Jones <pjones@redhat.com>
11 years agoDo more strict checking on PE Headers.
Peter Jones [Fri, 4 Oct 2013 14:05:43 +0000 (10:05 -0400)]
Do more strict checking on PE Headers.

Signed-off-by: Peter Jones <pjones@redhat.com>
11 years agoReapply patches lost in the update
Matthew Garrett [Thu, 3 Oct 2013 17:24:43 +0000 (13:24 -0400)]
Reapply patches lost in the update

11 years agoUpdate to current Tiano Cryptlib
Matthew Garrett [Thu, 3 Oct 2013 17:19:32 +0000 (13:19 -0400)]
Update to current Tiano Cryptlib

11 years agoAdd Tiano patch e98e59c237e17f064a4ecffb39d45499f89720a1
Matthew Garrett [Thu, 3 Oct 2013 16:56:27 +0000 (12:56 -0400)]
Add Tiano patch e98e59c237e17f064a4ecffb39d45499f89720a1

This is:
    Fix a bug in OpensslLib that PKCS7_verify will use over 8k stack space.

Signed-off-by: Fu Siyuan <siyuan.fu@intel.com>
Reviewed-by: Ye Ting <ting.ye@intel.com>
Reviewed-by: Dong Guo <guo.dong@intel.com>
from upstream.

11 years agoImprove PE image bounds checking.
Peter Jones [Thu, 3 Oct 2013 21:04:30 +0000 (17:04 -0400)]
Improve PE image bounds checking.

Signed-off-by: Peter Jones <pjones@redhat.com>
11 years agoAdd ident-like blobs to shim.efi for version checking.
Peter Jones [Thu, 3 Oct 2013 15:01:36 +0000 (11:01 -0400)]
Add ident-like blobs to shim.efi for version checking.

I feel dirty.

11 years agoUpdate for Josh's changes.
Peter Jones [Wed, 2 Oct 2013 17:32:35 +0000 (13:32 -0400)]
Update for Josh's changes.

Signed-off-by: Peter Jones <pjones@redhat.com>
11 years agoAdd support for disabling db for verification
Josh Boyer [Tue, 1 Oct 2013 15:49:22 +0000 (11:49 -0400)]
Add support for disabling db for verification

Provide a mechanism for a physically present end user to disable the use
of db when doing signature verification.  This is handled by the OS passing
down a variable that contains a UINT32 and a SHA256 hash.  If this variable
is present, MokManager prompts the user to choose whether to enable or
disable the use of db for verification purposes (depending on the value of
the UINT32).  They are then asked to type the passphrase that matches the
hash.  This then saves a boot services variable which is checked by shim,
and if set will cause shim to not use db for verification purposes.  If
db is to be ignored, shim will export a runtime variable called
'MokIgnoreDB' for the OS to query at runtime.

Signed-off-by: Josh Boyer <jwboyer@fedoraproject.org>
11 years agoRemove "shim.cer" on "make clean".
Peter Jones [Wed, 2 Oct 2013 14:48:41 +0000 (10:48 -0400)]
Remove "shim.cer" on "make clean".

If we don't do this, an old key winds up being reused and
MokManager.efi.signed is signed with a different key than shim_cert
reflects.

Signed-off-by: Peter Jones <pjones@redhat.com>
11 years agoUse CHAR8 not UINT8 for character work.
Peter Jones [Wed, 2 Oct 2013 14:38:08 +0000 (10:38 -0400)]
Use CHAR8 not UINT8 for character work.

This gets rid of a lot of type casting that we don't need, and helps
reduce warnings when I switch a bunch of gnu-efi stuff to taking const
arguments.

Signed-off-by: Peter Jones <pjones@redhat.com>
11 years agoCompareMem expects void * and gcc complains.
Peter Jones [Wed, 2 Oct 2013 14:02:01 +0000 (10:02 -0400)]
CompareMem expects void * and gcc complains.

Sorry about that.

Signed-off-by: Peter Jones <pjones@redhat.com>
11 years agoFix wrong type on console_error() call.
Peter Jones [Wed, 2 Oct 2013 13:52:42 +0000 (09:52 -0400)]
Fix wrong type on console_error() call.

Stupid L"".

Signed-off-by: Peter Jones <pjones@redhat.com>
11 years agoIf we fail to install our protocol, don't continue.
Peter Jones [Tue, 1 Oct 2013 20:32:54 +0000 (16:32 -0400)]
If we fail to install our protocol, don't continue.

This shouldn't be exploitable unless you've got a way to make
InstallProtocol fail and still, for example, have memory free to
actually load and run something.

Signed-off-by: Peter Jones <pjones@redhat.com>
11 years agoClean up warnings.
Peter Jones [Tue, 1 Oct 2013 18:35:18 +0000 (14:35 -0400)]
Clean up warnings.

Signed-off-by: Peter Jones <pjones@redhat.com>
11 years agoConditionalize overriding the security policy.
Peter Jones [Tue, 1 Oct 2013 17:55:27 +0000 (13:55 -0400)]
Conditionalize overriding the security policy.

Make OVERRIDE_SECURITY_POLICY a build option.

Signed-off-by: Peter Jones <pjones@redhat.com>
11 years agoMerge console_control.h and console.h
Peter Jones [Tue, 1 Oct 2013 17:43:25 +0000 (13:43 -0400)]
Merge console_control.h and console.h

Since these are topically the same thing, they can live together.

Signed-off-by: Peter Jones <pjones@redhat.com>
11 years agoMake verbose stuff use console_notify
Peter Jones [Fri, 27 Sep 2013 15:32:49 +0000 (11:32 -0400)]
Make verbose stuff use console_notify

Signed-off-by: Peter Jones <pjones@redhat.com>
11 years agoMokManager needs to disable the graphics console.
Peter Jones [Thu, 26 Sep 2013 13:44:50 +0000 (09:44 -0400)]
MokManager needs to disable the graphics console.

Without this patch, on some machines we never see MokManager's UI.  This
protocol has never (I think?) been officially published, and yet I still
have new hardware that needs it.

If you're looking for a reference, look at:

EdkCompatibilityPkg/Foundation/Protocol/ConsoleControl/ConsoleControl.c

in the edk2 tree from Tiano.

Signed-off-by: Peter Jones <pjones@redhat.com>
11 years agoInclude shim's vendor_cert in MokListRT
Peter Jones [Thu, 5 Sep 2013 20:56:03 +0000 (16:56 -0400)]
Include shim's vendor_cert in MokListRT

There needs to be some way to communicate to the kernel that it's a
trusted key, and since this mechanism already exists, it's by far the
easiest.

11 years agoHarden shim against non-participating bootloaders.
Peter Jones [Mon, 9 Sep 2013 16:37:50 +0000 (12:37 -0400)]
Harden shim against non-participating bootloaders.

It works like this: during startup of shim, we hook into the system's
ExitBootServices() and StartImage().  If the system's StartImage() is
called, we automatically unhook, because we're chainloading to something
the system can verify.

When shim's verify is called, we record what kind of certificate the
image was verified against.  If the call /succeeds/, we remove our
hooks.

If ExitBootServices() is called, we check how the bootloader verified
whatever it is loading.  If it was verified by its hash, we unhook
everything and call the system's EBS().  If it was verified by
certificate, we check if it has called shim_verify().  If it has, we
unhook everything and call the system's EBS()

If the bootloader has not verified anything, and is itself verified by
a certificate, we display a security violation warning and halt the
machine.

11 years agoMake vendor_cert/vendor_dbx actually replaceable by an external tool.
Peter Jones [Mon, 9 Sep 2013 18:43:04 +0000 (14:43 -0400)]
Make vendor_cert/vendor_dbx actually replaceable by an external tool.

This moves them both to be computed at runtime from a pointer+offset
rather than just a pointer, so that their real address can be entirely
derived from the section they're in.

This means you can replace the whole .vendor_cert section with a new one
with certs that don't have the same size.

11 years agoRemove TODO items fixed by merging lf_merge and lcp/lf-security-override.
Peter Jones [Tue, 1 Oct 2013 18:01:52 +0000 (14:01 -0400)]
Remove TODO items fixed by merging lf_merge and lcp/lf-security-override.

Signed-off-by: Peter Jones <pjones@redhat.com>
11 years agoDon't use LibGetVariable(), since it doesn't give us real error codes.
Peter Jones [Thu, 26 Sep 2013 15:42:34 +0000 (11:42 -0400)]
Don't use LibGetVariable(), since it doesn't give us real error codes.

11 years agointegrate security override
Gary Ching-Pang Lin [Thu, 1 Aug 2013 10:21:53 +0000 (18:21 +0800)]
integrate security override

11 years agoClean up tarballs in "make clean"
Peter Jones [Thu, 26 Sep 2013 15:01:42 +0000 (11:01 -0400)]
Clean up tarballs in "make clean"

Signed-off-by: Peter Jones <pjones@redhat.com>