grub/grub-core/loader
Daniel Kiper b53a2f2c66 loader/i386/linux: Fix an underflow in the setup_header length calculation
Recent work around x86 Linux kernel loader revealed an underflow in the
setup_header length calculation and another related issue. Both lead to
the memory overwrite and later machine crash.

Currently when the GRUB copies the setup_header into the linux_params
(struct boot_params, traditionally known as "zero page") it assumes the
setup_header size as sizeof(linux_i386_kernel_header/lh). This is
incorrect. It should use the value calculated accordingly to the Linux
kernel boot protocol. Otherwise in case of pretty old kernel, to be
exact Linux kernel boot protocol, the GRUB may write more into
linux_params than it was expected to. Fortunately this is not very big
issue. Though it has to be fixed. However, there is also an underflow
which is grave. It happens when

  sizeof(linux_i386_kernel_header/lh) > "real size of the setup_header".

Then len value wraps around and grub_file_read() reads whole kernel into
the linux_params overwriting memory past it. This leads to the GRUB
memory allocator breakage and finally to its crash during boot.

The patch fixes both issues. Additionally, it moves the code not related to
grub_memset(linux_params)/grub_memcpy(linux_params)/grub_file_read(linux_params)
section outside of it to not confuse the reader.

Fixes: e683cfb0cf (loader/i386/linux: Calculate the setup_header length)

Signed-off-by: Daniel Kiper <daniel.kiper@oracle.com>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Reviewed-by: Ross Philipson <ross.philipson@oracle.com>
Reviewed-by: Krystian Hebel <krystian.hebel@3mdeb.com>
2019-12-20 20:35:21 +01:00
..
arm arm: Move initrd upper to leave more space for kernel 2019-02-06 11:34:07 +01:00
arm64 efi: Rename armxx to arch 2019-02-25 11:28:44 +01:00
efi chainloader: Fix gcc9 error -Waddress-of-packed-member 2019-04-23 11:37:08 +02:00
i386 loader/i386/linux: Fix an underflow in the setup_header length calculation 2019-12-20 20:35:21 +01:00
ia64/efi verifiers: IA-64 fallout cleanup 2019-03-20 11:38:28 +01:00
mips verifiers: MIPS fallout cleanup 2019-03-20 11:38:28 +01:00
powerpc/ieee1275 verifiers: PowerPC fallout cleanup 2019-03-20 11:38:28 +01:00
riscv RISC-V: Add Linux load logic 2019-02-25 11:33:06 +01:00
sparc64/ieee1275 arm-uboot, ia64, sparc64: Fix up grub_file_open() calls 2018-11-16 14:42:51 +01:00
aout.c Implement automatic module license checking according to new GNU 2011-04-11 23:01:51 +02:00
linux.c verifiers: File type for fine-grained signature-verification controlling 2018-11-09 13:25:31 +01:00
lzss.c Add LZSS Mach-O support (needed for new xnu kernelcache). 2012-02-29 13:26:13 +01:00
macho.c verifiers: File type for fine-grained signature-verification controlling 2018-11-09 13:25:31 +01:00
macho32.c * grub-core/loader/machoXX.c: Fix compilation on non-i386. 2013-12-17 22:44:46 +01:00
macho64.c * grub-core/loader/machoXX.c: Fix compilation on non-i386. 2013-12-17 22:44:46 +01:00
machoXX.c Simplify few strings. 2013-05-07 11:44:15 +02:00
multiboot.c verifiers: File type for fine-grained signature-verification controlling 2018-11-09 13:25:31 +01:00
multiboot_elfxx.c multiboot_elfxx.c: Fix compilation by fixing undeclared variable 2018-07-02 14:16:14 +02:00
multiboot_mbi2.c verifiers: Add possibility to verify kernel and modules command lines 2018-11-09 13:25:31 +01:00
xnu.c Change fs functions to add fs_ prefix 2019-04-09 10:03:29 +10:00
xnu_resume.c verifiers: File type for fine-grained signature-verification controlling 2018-11-09 13:25:31 +01:00