Commit Graph

1438 Commits

Author SHA1 Message Date
Steve McIntyre
57e2a32bef Fix up some of the options we're using at build time
Definitely don't want to be setting EFI_PATH, as that over-rides the
vendored gnu-efi. Argh
2021-03-23 23:33:13 +00:00
Steve McIntyre
de3def7f53 Improve how the dbx hashes are handled
Only include the hashes for the architecture we're building for - no
point in adding bloat and delay here.

Add a script "block_signed_deb" to scan a set of .deb files, extract
the hashes for .efi binaries and list them in the format wanted for
the dbx hashes file.

Split out the code to use that file from the rules file into a
separate helper.
2021-03-23 23:33:04 +00:00
Steve McIntyre
3139bb3585 Tweak the gnu-efi tarball code 2021-03-23 23:32:57 +00:00
Steve McIntyre
9b014236c8 Add an extra rule to generate the extra gnu-efi tarball
Thanks to Dmitri John Ledkov for help
2021-03-23 23:32:52 +00:00
Steve McIntyre
2e0a83e1f2 Add Debian SBAT data to the shim build
Add a Debian SBAT template, and rules to use it
Adds a build-dep on dos2unix
2021-03-23 23:32:45 +00:00
Steve McIntyre
58195ca37e Add dbx entries for all our existing grub binaries
They're insecure, let's break the chainloading hole
2021-03-23 23:32:38 +00:00
Steve McIntyre
3dbe6c0c26 Change changelog to shut lintian up 2021-02-21 17:06:12 +00:00
Steve McIntyre
bcc26d6dfb Remove artifacts that upstream installs that we don't use
... to keep debhelper from complaining
2021-02-21 16:34:28 +00:00
Steve McIntyre
aacee4356e Add new patch cast-CHAR8-string-handling.patch
Cast CHAR8 strings to use (const char *) when using string functions

Looks like gnu-efi definitions of CHAR8 are problematic
2021-02-21 16:34:28 +00:00
Steve McIntyre
168d42d09d Trivial change to remove bashisms in Make.coverity 2021-02-21 16:34:28 +00:00
Steve McIntyre
e105392d54 Remove all our old patches, no longer needed:
- avoid_null_vsprint.patch
 - check_null_sn_ln.patch
 - fixup_git.patch
 - uname.patch
 - use_compare_mem_gcc9.patch
2021-02-21 16:33:31 +00:00
Steve McIntyre
334e9afa91 Switch to using gcc-10 rather than gcc-9. Closes: #978521 2021-02-21 13:53:17 +00:00
Steve McIntyre
371ed906c5 Switch to newer upstream "release" 15+1613861442.888f5b5
Many many updates, but caring mainly about SBAT support
2021-02-21 13:50:33 +00:00
Steve McIntyre
2a55644555 Update upstream source from tag 'upstream/15+1613861442.888f5b5'
Update to upstream version '15+1613861442.888f5b5'
with Debian dir 15b0853a73
2021-02-21 13:46:16 +00:00
Jan Setje-Eilers
888f5b544b Add --set-section-alignment '.sbat=512' to objcopy command line 2021-02-20 17:50:42 -05:00
Chris Coulson
d74eb44aac Include missing .text sections in PE/COFF binary
At the default -Os optimization level, gcc emits ".text.startup"
and ".text.unlikely" sections for static initializers and noreturn
functions which end up in the intermediate ELF binary:

$ objdump -h build-x64/shimx64.efi.so

build-x64/shimx64.efi.so:     file format elf64-x86-64

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .text         00046e7b  0000000000001000  0000000000001000  00001000  2**10
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .text.startup 00000118  0000000000047e7b  0000000000047e7b  00047e7b  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  2 .text.unlikely 00000046  0000000000047f93  0000000000047f93  00047f93  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  3 .data         000315e8  0000000000048000  0000000000048000  00048000  2**9

These additional .text.* sections are omitted from the final PE/COFF
binary, resulting in a crash when processing the ctors. Taking a look at
_init_array in gdb:

(gdb) p/x &_init_array
$1 = 0x78510
(gdb) p/x &_init_array_end
$2 = 0x7851c
(gdb) x/x (void*)&_init_array
0x78510 <_init_array>:  0x00047e7b
(gdb) x/x (void*)(&_init_array)+8
0x78518 <_init_array+8>:  0x00000000

See that 0x00047e7b falls inside the padding between the .text and .data
sections:

$ objdump -h build-x64/shimx64.efi

build-x64/shimx64.efi:     file format pei-x86-64

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .text         00046e7b  0000000000001000  0000000000001000  00000400  2**10
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         000315e8  0000000000048000  0000000000048000  00047400  2**9

Adjust the linker script to merge the .text.startup and .text.unlikely
sections in to the .text section.

[edited by pjones to use .text.* instead of naming the sections
individually, and to sync up with what other arches have in .text]
2021-02-20 17:48:22 -05:00
Chris Coulson
aaa7b427a5 build: Pass the correct paths to sbsign
Signed-off-by: Chris Coulson <chris.coulson@canonical.com>
2021-02-19 16:06:40 -05:00
Peter Jones
9bef30f529 sbat: Fix two NULL derefs found with "gcc -fanalyzer"
"gcc -fanalyzer" found two NULL pointer checks we're missing in sbat.c:

include/str.h: In function ‘get_sbat_field.part.0’:
sbat.c:20:14: error: dereference of NULL ‘offset’ [CWE-476] [-Werror=analyzer-null-dereference]
   20 |         if (!*offset)

and

include/str.h: In function ‘parse_sbat’:
sbat.c:140:27: error: dereference of NULL ‘current’ [CWE-476] [-Werror=analyzer-null-dereference]
  140 |         } while (entry && *current != '\0');

Both are simple, and this patch fixes them.

Signed-off-by: Peter Jones <pjones@redhat.com>
2021-02-19 14:28:10 -05:00
Javier Martinez Canillas
8e34030ba5 sbat: make shim to parse it's own .sbat section on init
This is needed for shim to verify itself when booting, to make sure that
shim binaries can't be executed anymore after been revoked by SBAT.

Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
2021-02-19 14:28:10 -05:00
Javier Martinez Canillas
1919b566b0 shim: initialize OpenSSL after parsing SBAT data
A following patch will make shim to verify its .sbat section and it
should be done before doing the OpenSSL initialization. But having
the debugger attached may be useful at this point.

Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
2021-02-19 14:28:10 -05:00
Javier Martinez Canillas
4c9654fb68 sbat: include NULL terminator when calculating buffer end in parse_sbat()
The parse_sbat() function is currently removing the last character of the
passed buffer, which will usually be a null-terminated string to parse.

There's no reason to do this and just take the whole size as specified by
the caller.

Reported-by: Chris Coulson <chris.coulson@canonical.com>
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
2021-02-19 14:28:10 -05:00
Peter Jones
496ca920ec pe.c: move sbat verification to its own function.
handle_image() is quite huge and complex.

This patch moves the SBAT validation code from handle_image() to a new
function, handle_sbat().

Signed-off-by: Peter Jones <pjones@redhat.com>
2021-02-19 14:28:10 -05:00
Javier Martinez Canillas
ea1c872418 Don't re-parse the SBAT EFI variable for each binary we load.
On a typical boot we validate at least two binaries; parsing the SBAT
EFI variable each time, when it should not be changing, is not worth the
effort.

This patch moves the parsing out to some setup code, instead of doing it
during the verification stage.

Signed-off-by: Peter Jones <pjones@redhat.com>
2021-02-19 14:28:10 -05:00
Peter Jones
1e78d701ac parse_sbat: handle the realloc failure leak and batch allocations.
Signed-off-by: Peter Jones <pjones@redhat.com>
2021-02-19 14:28:10 -05:00
Alex Burmashev
31e1aa7aca pe.c: parse SBAT variable and perform basic verification
Per Peter Jones suggestion, we will be flexible in what data we expect
while parsing the variable. Three fields are mandatory:
component_generation, component_name_size, component_name
However we also support adding comments and additional information to be
added after component name, with ',' as a separator. Those information
will be ignored and not used for verification purposes.
So:
grub,1
and
grub,1,wow,this,is,my,comment
will provide exactly same set of data for verification.

[0]: https://github.com/rhboot/shim/blob/main/SBAT.md

Signed-off-by: Alex Burmashev <alexander.burmashev@oracle.com>
Signed-off-by: Peter Jones <pjones@redhat.com>
2021-02-19 14:28:10 -05:00
Peter Jones
f1feb3ac04 sbat: drop the struct sbat and just use two variables instead
The struct sbat isn't doing anything and only has two fields so let's pass
pass those two to the functions directly instead of storing it in a struct.

Signed-off-by: Peter Jones <pjones@redhat.com>
2021-02-19 14:28:10 -05:00
Peter Jones
146f9d8e8d shim: use an enum for efi_main's error messages.
Numbering the error messages in efi_main directly was a mistake, and the
following patches just make it more apparent.

This makes it an enum so we don't have to re-number at more than one
place when we add or remove them.

Signed-off-by: Peter Jones <pjones@redhat.com>
2021-02-19 14:28:10 -05:00
Hai Huang
e3325f8100 Fix EV_EFI_VARIABLE_AUTHORITY event in eventlog
Currently, for an EV_EFI_VARIABLE_AUTHORITY event, the shim puts only
EFI_SIGNATURE_DATA.SignatureData in the VariableData field, but omits
EFI_SIGNATURE_DATA.SignatureOwner. According to reference implementation
in EDK2, the entire EFI_SIGNATURE_DATA is put into the VariableData
field, shown here:
https://github.com/tianocore/edk2/blob/master/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c#L1032
2021-02-19 11:11:31 -05:00
Paul Moore
e5f7b252d8 build: add some basic $EFI_PATH checking
Not all distributions put the crt0-efi-$(ARCH).o file under
$LIB_DIR/gnuefi, some stash it directly in $LIB_DIR.  In an effort
to make the build a bit more user friendly, check if $LIB_DIR/gnuefi
exits before setting $EFI_PATH to that value; if $LIB_DIR/gnuefi does
not exist, fallback to $LIB_DIR for $EFI_PATH.

Signed-off-by: Paul Moore <pmoore2@cisco.com>
2021-02-19 11:09:36 -05:00
Alex Burmashev
e6a7fc11a4 add list_empty to linked list primitives
Signed-off-by: Alex Burmashev <alexander.burmashev@oracle.com>
2021-02-17 19:33:57 -05:00
Alex Burmashev
0287b5a864 strndupa: allocate len + 1, so that \0 is not lost
Signed-off-by: Alex Burmashev <alexander.burmashev@oracle.com>
2021-02-17 19:30:19 -05:00
Peter Jones
07724ab645 Fix an off by one in strnlena()
I wrote a test case for strnlena() and strndupa() and of course both
were off by one in the opposite directions...

... but the next patch obviates the need for them, hopefully, so this
will wind up getting dropped.
2021-02-17 16:27:18 -08:00
Steve McIntyre
066a11164e Fixups after Peter's review 2021-02-17 16:25:44 -08:00
Steve McIntyre
8d189efc03 Second attempt at SBAT doc tweaks 2021-02-17 16:25:44 -08:00
Jan Setje-Eilers
21203630a3 fix nit
Co-authored-by: Christopher Co <christopher.co@microsoft.com>
2021-02-17 16:25:02 -08:00
Jan Setje-Eilers
63d76f2e28 fix nit
Co-authored-by: Christopher Co <christopher.co@microsoft.com>
2021-02-17 16:25:02 -08:00
Jan Setje-Eilers
966d5e6116 fix nit
Co-authored-by: Christopher Co <christopher.co@microsoft.com>
2021-02-17 16:25:02 -08:00
Jan Setje-Eilers
450f49367d fix not
Co-authored-by: Christopher Co <christopher.co@microsoft.com>
2021-02-17 16:25:02 -08:00
Peter Jones
05f8c34e3a SBAT: Fix all the docs examples to start with version 1
Since we have atol() but not strtoul(), we need to make all versions
positive integers.

Signed-off-by: Peter Jones <pjones@redhat.com>
2021-02-17 16:25:02 -08:00
Peter Jones
c26174026b SBAT: make the variable be CSV in our spec.
We noticed that we'd originally specified the SBAT variable as binary
records, but talked as if they're CSV.  Woops.  Anyway, this makes them
CSV, which also means they don't need the size field.

Signed-off-by: Peter Jones <pjones@redhat.com>
2021-02-17 16:25:02 -08:00
Chris Co
a18d80ff98 sbat: add minor fixes to parse_sbat
Add parameter checking to parse_sbat().

Set end pointer to be sbat_base + sbat_size - 1. We directly
dereference the end pointer but this is technically outside of
our sbat_base buffer range.

Remove current and end while loops that account for extra CRLF
or LF characters before and after the .sbat section. We will
rely on automated tooling to verify the .sbat section is sane.

Remove the overwriting of *(end - 1) with '\0'. This behavior
causes a segfault in the unit test. parse_sbat_entry() expects
a very specific pattern "_,_,_,_,_,_\n" for every entry and uses
strchrnul() to process each individual field. When *(end - 1)='\0'
is present, it short-circuits the final \n and causes the final
get_sbat_field() to return NULL, thereby setting current = NULL.

Eventually parse_sbat attempts to access current in the do-while
condition and the segfault happens.

Signed-off-by: Chris Co <chrco@microsoft.com>
2021-02-16 16:42:27 +01:00
Javier Martinez Canillas
038891bb83 sbat: use correct type for parse_sbat_var() return value
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
2021-02-16 16:42:27 +01:00
Javier Martinez Canillas
d1eb757feb sbat: remove unused buffer parameter in parse_sbat() function
It's a left over from an early implementation that was never cleaned.

Reported-by: Christopher Co <christopher.co@microsoft.com>
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
2021-02-16 16:42:27 +01:00
Peter Jones
0bc2aa4ca8 sbat: clang-format the whole thing.
Signed-off-by: Peter Jones <pjones@redhat.com>
2021-02-16 16:42:27 +01:00
Peter Jones
4edb31fcfc Use gcc -Os instead of -O0.
Signed-off-by: Peter Jones <pjones@redhat.com>
2021-02-16 09:12:48 +01:00
Chris Coulson
25c8324637 Rename check_{white,black}list to check_{allow,deny}list
v2 - updated for conflicts and to include documentation (pjones)
2021-02-16 09:12:48 +01:00
Peter Jones
2bdf0dd3a2 Add ENABLE_SHIM_DEVEL config to change what our debug variable name is
Currently, if you have two boot entries, say one for
\EFI\fedora\shimx64.efi and one for \EFI\devel\shimx64.efi, and you set
the efi variable SHIM_DEBUG=1, both of these will trigger, and you need
to write your debugging scripts to allow each of the builds to continue.

This is a pain.

This patch makes it so on your development build, it will instead check
SHIM_DEVEL_DEBUG, thus meaning you can have it pause for a debugger only
on the development branch and not the OS you need to boot to scp in a
new development build.

Signed-off-by: Peter Jones <pjones@redhat.com>
2021-02-16 09:12:48 +01:00
Peter Jones
b54d1df1c1 Make the variable name and pointer const in all of our efi vars functions
Signed-off-by: Peter Jones <pjones@redhat.com>
2021-02-16 09:12:48 +01:00
Peter Jones
9b0c281db4 Make httpboot.c always get built.
This is a backport from devel of:

  commit 634fd72ac6a6c6c9010c32506d524586826a8637
  Author: Peter Jones <pjones@redhat.com>
  Date:   Fri Nov 22 15:14:22 2019 -0500

      Make httpboot.c always get built.

Signed-off-by: Peter Jones <pjones@redhat.com>
2021-02-16 09:12:48 +01:00
Peter Jones
a6c726fc81 Fix a bunch of trivial trailing whitespace issues.
Signed-off-by: Peter Jones <pjones@redhat.com>
2021-02-16 09:12:48 +01:00