On Aug 4, 2014, at 8:50 AM, Olivier Martin <olivier.mar...@arm.com> wrote:

> The benefit of the FixedPcd was to be an easy alternative between the 
> recommended constant value and the random number.
> A Firmware vendor might want to use a different canary value as the open 
> source project.
>  

I guess the PCD could be useful for debugging a specific issue as well. 

As long as the reasoning behind the default value for the “canary” is 
documented in the PCD default I don’t see an issue using a FixedAtBuildPcd.

Thanks,

Andrew Fish

> Olivier
>  
> From: Andrew Fish [mailto:af...@apple.com] 
> Sent: 04 August 2014 16:44
> To: Olivier Martin
> Cc: Gao, Liming; Mike Kinney; edk2-buildtools-de...@lists.sourceforge.net; 
> edk2-devel@lists.sourceforge.net
> Subject: Re: [edk2-buildtools] [PATCH 2/3] MdePkg: Introduced 
> BaseStackCheckLib
>  
>  
> On Aug 4, 2014, at 8:30 AM, Olivier Martin <olivier.mar...@arm.com> wrote:
> 
> 
> Recommended value does not mean unique value. Anyway, no one has commented 
> whether this value should be kept in the code or be replaced by a PCD. So, I 
> will keep the original code.
> I will send a new patchset in the next couple of minutes to define this class 
> instance as NULL instead of BASE.
>  
>  
> The recommendation is to use a constant like the one in the code, or a random 
> number per boot.  So if there was a PCD it would be to use the constant vs. a 
> random number per boot. I don’t think we have a BaseLib compatible way to get 
> a random number?
>  
> The per boot random number makes it harder for attacking code to figure out 
> where the “canary” is so it can be defeated. It is like ASLR, and a constant 
> PCD value is not going to help with that. 
>  
> Thanks,
>  
> Andrew Fish
> 
> 
> Olivier
>  
> From: Gao, Liming [mailto:liming....@intel.com] 
> Sent: 09 July 2014 03:42
> To: Olivier Martin; 'Andrew Fish'
> Cc: Kinney, Michael D; edk2-buildtools-de...@lists.sourceforge.net; 
> edk2-devel@lists.sourceforge.net
> Subject: RE: [edk2-buildtools] [PATCH 2/3] MdePkg: Introduced 
> BaseStackCheckLib
>  
> Martin:
>   Per Andrew comment, this value is the recommended constant. If so, we don’t 
> need to  add one PCD for it unless someone has the strong request to 
> configure it.
>  
> Thanks
> Liming
> From: Olivier Martin [mailto:olivier.mar...@arm.com] 
> Sent: Tuesday, July 08, 2014 9:26 PM
> To: 'Andrew Fish'; Gao, Liming
> Cc: Kinney, Michael D; edk2-buildtools-de...@lists.sourceforge.net; 
> edk2-devel@lists.sourceforge.net
> Subject: RE: [edk2-buildtools] [PATCH 2/3] MdePkg: Introduced 
> BaseStackCheckLib
>  
> Actually, I was thinking to replace this canary value by a FixedPcd but I do 
> not remember why I have not done it. I might have just forgot it.
> Olivier
>  
> From: Andrew Fish [mailto:af...@apple.com] 
> Sent: 08 July 2014 02:14
> To: Gao, Liming
> Cc: Olivier Martin; Mike Kinney; edk2-buildtools-de...@lists.sourceforge.net; 
> edk2-devel@lists.sourceforge.net
> Subject: Re: [edk2-buildtools] [PATCH 2/3] MdePkg: Introduced 
> BaseStackCheckLib
>  
>  
> On Jul 7, 2014, at 5:40 PM, Gao, Liming <liming....@intel.com> wrote:
>  
> 
> Martin:
>  What is 0x0AFF for? Is it an address or a value?
>  
> This value is the recommended constant if you can not generate a real random 
> number for the “canary” value. 
>  
> It has NULL (will terminate strings), LF, and -1. 
> http://wiki.osdev.org/GCC_Stack_Smashing_Protector. So it helps contains read 
> based overruns. 
>  
> __stack_chk_guard is the “canary” placed on the stack by the compiler. 
> __stack_check_fail() is called if the “canary” has been over written. These 
> are both compiler intrinsics.
>  
> Thanks,
>  
> Andrew Fish
>  
> ~/work/Compiler>cat stack.c
>  
> void
> test (int i, char v)
> {
>   char test[0x100];
>  
>   test[i] = v;
>   return; 
> }
>  
> ~/work/Compiler>clang -S stack.c
> ~/work/Compiler>cat stack.S
>               .section    __TEXT,__text,regular,pure_instructions
>               .globl       _test
>               .align        4, 0x90
> _test:                                  ## @test
>               .cfi_startproc
> ## BB#0:
>               pushq      %rbp
> Ltmp2:
>               .cfi_def_cfa_offset 16
> Ltmp3:
>               .cfi_offset %rbp, -16
>               movq       %rsp, %rbp
> Ltmp4:
>               .cfi_def_cfa_register %rbp
>               subq        $272, %rsp              ## imm = 0x110
>               movb       %sil, %al
>               movq       ___stack_chk_guard@GOTPCREL(%rip), %rcx
>               movq       (%rcx), %rcx
>               movq       %rcx, -8(%rbp)
>               movq       ___stack_chk_guard@GOTPCREL(%rip), %rcx
>               movl        %edi, -12(%rbp)
>               movb       %al, -13(%rbp)
>               movb       -13(%rbp), %al
>               movslq    -12(%rbp), %rdx
>               movb       %al, -272(%rbp,%rdx)
>               movq       (%rcx), %rcx
>               movq       -8(%rbp), %rdx
>               cmpq       %rdx, %rcx
>               jne           LBB0_2
> ## BB#1:                                ## %SP_return
>               addq        $272, %rsp              ## imm = 0x110
>               popq        %rbp
>               ret
> LBB0_2:                                 ## %CallStackCheckFailBlk
>               callq         ___stack_chk_fail
>               .cfi_endproc
>  
>  
> .subsections_via_symbols
>  
>  
> 
> +/// "canary" value that is inserted by the compiler into the stack frame.
> +VOID *__stack_chk_guard = (VOID*)0x0AFF;
> 
>  And, this library instance is used as NULL class instance. Its library class 
> should be NULL. 
> 
> Thanks
> Liming
> -----Original Message-----
> From: Olivier Martin [mailto:olivier.mar...@arm.com] 
> Sent: Monday, July 07, 2014 11:44 PM
> To: Kinney, Michael D; edk2-buildtools-de...@lists.sourceforge.net
> Cc: andrew.f...@apple.com; edk2-devel@lists.sourceforge.net
> Subject: [edk2-buildtools] [PATCH 2/3] MdePkg: Introduced BaseStackCheckLib
> 
> This library only support GCC and XCode for now.
> 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Andrew Fish <andrew.f...@apple.com>
> Signed-off-by: Olivier Martin <olivier.mar...@arm.com
> 
> Change-Id: Ib51239b7d315637fd22c34a9a78a7a830f2ffdc7
> ---
> .../Library/BaseStackCheckLib/BaseStackCheckGcc.c  | 62 ++++++++++++++++++++++
> .../BaseStackCheckLib/BaseStackCheckLib.inf        | 41 ++++++++++++++
> 2 files changed, 103 insertions(+)
> create mode 100644 MdePkg/Library/BaseStackCheckLib/BaseStackCheckGcc.c
> create mode 100644 MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf
> 
> diff --git a/MdePkg/Library/BaseStackCheckLib/BaseStackCheckGcc.c 
> b/MdePkg/Library/BaseStackCheckLib/BaseStackCheckGcc.c
> new file mode 100644
> index 0000000..9ec76d8
> --- /dev/null
> +++ b/MdePkg/Library/BaseStackCheckLib/BaseStackCheckGcc.c
> @@ -0,0 +1,62 @@
> +/** @file
> + Base Stack Check library for GCC/clang.
> +
> + Use -fstack-protector-all compiler flag to make the compiler insert 
> + the __stack_chk_guard "canary" value into the stack and check the 
> + value prior to exiting the function. If the "canary" is overwritten 
> + __stack_chk_fail() is called. This is GCC specific code.
> +
> + Copyright (c) 2012, Apple Inc. All rights reserved.<BR> This program 
> + and the accompanying materials are licensed and made available under 
> + the terms and conditions of the BSD License which accompanies this 
> + distribution.  The full text of the license may be found at 
> + http://opensource.org/licenses/bsd-license.php.
> +
> + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 
> + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
> IMPLIED.
> +
> +**/
> +
> +#include <Base.h>
> +#include <Library/BaseLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/PcdLib.h>
> +
> +VOID
> +__stack_chk_fail (
> + VOID
> + );
> +
> +
> +/// "canary" value that is inserted by the compiler into the stack frame.
> +VOID *__stack_chk_guard = (VOID*)0x0AFF;
> +
> +// If ASLR was enabled we could use
> +//void (*__stack_chk_guard)(void) = __stack_chk_fail;
> +
> +/**
> + Error path for compiler generated stack "canary" value check code. If 
> +the  stack canary has been overwritten this function gets called on 
> +exit of the  function.
> +**/
> +VOID
> +__stack_chk_fail (
> + VOID
> + )
> +{
> +  UINT8 DebugPropertyMask;
> +
> +  DEBUG ((DEBUG_ERROR, "STACK FAULT: Buffer Overflow in function 
> + %a.\n", __builtin_return_address(0)));
> +
> +  //
> +  // Generate a Breakpoint, DeadLoop, or NOP based on PCD settings even 
> +if
> +  // BaseDebugLibNull is in use.
> +  //
> +  DebugPropertyMask = PcdGet8 (PcdDebugPropertyMask);
> +  if ((DebugPropertyMask & DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED) != 0) {
> +    CpuBreakpoint ();
> +  } else if ((DebugPropertyMask & DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED) != 
> 0) {
> +   CpuDeadLoop ();
> +  }
> +}
> +
> diff --git a/MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf 
> b/MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf
> new file mode 100644
> index 0000000..4e2285d
> --- /dev/null
> +++ b/MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf
> @@ -0,0 +1,41 @@
> +## @file
> +#  Stack Check Library
> +#
> +#  Copyright (c) 2014, ARM Ltd. All rights reserved.<BR> # #  This 
> +program and the accompanying materials #  are licensed and made 
> +available under the terms and conditions of the BSD License #  which 
> +accompanies this distribution. The full text of the license may be 
> +found at #  http://opensource.org/licenses/bsd-license.php.
> +#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" 
> +BASIS, #  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS 
> OR IMPLIED.
> +#
> +#
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010005
> +  BASE_NAME                      = BaseStackCheckLib
> +  FILE_GUID                      = 5f6579f7-b648-4fdb-9f19-4c17e27e8eff
> +  MODULE_TYPE                    = BASE
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = BaseStackCheckLib
> +
> +
> +#
> +#  VALID_ARCHITECTURES           = ARM AARCH64
> +#
> +
> +[Sources]
> +  BaseStackCheckGcc.c | GCC
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +
> +[LibraryClasses]
> +  BaseLib
> +  DebugLib
> +
> +[Pcd]
> +  gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask
> +
> --
> 1.8.5
> 
> 
> ------------------------------------------------------------------------------
> Open source business process management suite built on Java and Eclipse
> Turn processes into business applications with Bonita BPM Community Edition
> Quickly connect people, data, and systems into organized workflows
> Winner of BOSSIE, CODIE, OW2 and Gartner awards
> http://p.sf.net/sfu/Bonitasoft
> _______________________________________________
> edk2-buildtools-devel mailing list
> edk2-buildtools-de...@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/edk2-buildtools-devel
> 
> ------------------------------------------------------------------------------
> Open source business process management suite built on Java and Eclipse
> Turn processes into business applications with Bonita BPM Community Edition
> Quickly connect people, data, and systems into organized workflows
> Winner of BOSSIE, CODIE, OW2 and Gartner awards
> http://p.sf.net/sfu/Bonitasoft
> _______________________________________________
> edk2-buildtools-devel mailing list
> edk2-buildtools-de...@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/edk2-buildtools-devel

------------------------------------------------------------------------------
Infragistics Professional
Build stunning WinForms apps today!
Reboot your WinForms applications with our WinForms controls. 
Build a bridge from your legacy apps to the future.
http://pubads.g.doubleclick.net/gampad/clk?id=153845071&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to