mirror of
https://git.savannah.gnu.org/git/grub.git
synced 2026-10-26 09:10:53 +00:00
efi: Generate stack protector canary at build time if urandom is available
Generating the canary at build time allows the canary to be different for every build which could limit the effectiveness of certain exploits. Fallback to the statically generated random bytes if /dev/urandom is not readable, e.g. Windows. On 32-bit architectures, which use a 32-bit canary, reduce the canary to 4 bytes with one byte being NUL to filter out string buffer overflow attacks. Signed-off-by: Glenn Washburn <development@efficientek.com> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
1 parent
e424e945c9
commit
dcc1af5d68
3 files changed
+23
-1
No files matched your search
@@ -1438,6 +1438,26 @@ else
|
||||
AC_MSG_ERROR([invalid value $enable_stack_protector for --enable-stack-protector])
|
||||
fi
|
||||
TARGET_CPPFLAGS="$TARGET_CPPFLAGS -DGRUB_STACK_PROTECTOR=1"
|
||||
|
||||
if test -r /dev/urandom; then
|
||||
# Generate the 8 byte stack protector canary at build time if /dev/urandom
|
||||
# is able to be read. The first byte should be NUL to filter out string
|
||||
# buffer overflow attacks.
|
||||
GRUB_STACK_PROTECTOR_INIT="$($PYTHON -c 'import codecs; rf=open("/dev/urandom", "rb"); print("0x00"+codecs.encode(rf.read(7), "hex").decode("ascii"))')"
|
||||
else
|
||||
# Some hosts may not have a urandom, e.g. Windows, so use statically
|
||||
# generated random bytes
|
||||
GRUB_STACK_PROTECTOR_INIT="0x00f2b7e2f193b25c"
|
||||
fi
|
||||
|
||||
if test x"$target_m32" = x1 ; then
|
||||
# Make sure that the canary default value is 24-bits by only using the
|
||||
# lower 3 bytes on 32 bit systems. This allows the upper byte to be NUL
|
||||
# to filter out string buffer overflow attacks.
|
||||
GRUB_STACK_PROTECTOR_INIT="0x00$(echo "$GRUB_STACK_PROTECTOR_INIT" | sed 's/.*\(......\)$/\1/')"
|
||||
fi
|
||||
|
||||
AC_SUBST([GRUB_STACK_PROTECTOR_INIT])
|
||||
fi
|
||||
|
||||
CFLAGS="$TARGET_CFLAGS"
|
||||
|
||||
Reference in new issue
Block a user