On Mon, 13 Nov 2023 17:18:50 +0100
Daniel Kiper <dki...@net-space.pl> wrote:

> On Sun, Nov 12, 2023 at 08:22:42AM +0100, Heinrich Schuchardt wrote:
> > On 11/12/23 04:23, Glenn Washburn wrote:
> > > The canary, __stack_chk_guard, is in the BSS and so will get initialized 
> > > to
> > > zero if it is not explicitly initialized. If the UEFI firmware does not
> > > support the RNG protocol, then the canary will not be randomized and will
> > > be used as zero. This seems like a possibly easier value to write by an
> > > attacker. Initialize canary to static random bytes, so that it is still
> > > random when there is not RNG protocol.
> > >
> > > Signed-off-by: Glenn Washburn <developm...@efficientek.com>
> >
> > Reviewed-by: Heinrich Schuchardt <xypron.g...@gmx.de>
> 
> Reviewed-by: Daniel Kiper <daniel.ki...@oracle.com>
> 
> > > ---
> > >   grub-core/kern/efi/init.c | 2 +-
> > >   1 file changed, 1 insertion(+), 1 deletion(-)
> > >
> > > diff --git a/grub-core/kern/efi/init.c b/grub-core/kern/efi/init.c
> > > index 0e28bea17a76..b85d98ca47fd 100644
> > > --- a/grub-core/kern/efi/init.c
> > > +++ b/grub-core/kern/efi/init.c
> > > @@ -41,7 +41,7 @@ static grub_guid_t rng_protocol_guid = 
> > > GRUB_EFI_RNG_PROTOCOL_GUID;
> > >
> > >   static grub_efi_uint8_t stack_chk_guard_buf[32];
> > >
> > > -grub_addr_t __stack_chk_guard;
> > > +grub_addr_t __stack_chk_guard = (grub_addr_t) 0x92f2b7e2f193b25c;

I've come across more information[1] on this subject that leads me to
believe that at least the byte with the lowest memory address should be
a NULL byte (eg. grub_cpu_to_be64_compile_time(0x00f2b7e2f193b25c)) to
make the common case of string buffer overflows non-bypassable. And in
the absence of random bytes at runtime, it might be a good idea to xor
with the current time and perhaps the EFI app base load address. So I
suggest not merging this yet and I'll have a v2 coming soon.

Glenn

[1]
https://www.sans.org/blog/stack-canaries-gingerly-sidestepping-the-cage/

> 
> I would add last sentence from the commit message before this line.
> I can do it for you before push...
> 
> > >
> > >   void __attribute__ ((noreturn))
> > >   __stack_chk_fail (void)
> 
> Daniel

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to