• Marco Elver's avatar
    stack: Constrain and fix stack offset randomization with Clang builds · 8550c9b8
    Marco Elver authored
    [ Upstream commit efa90c11 ]
    
    All supported versions of Clang perform auto-init of __builtin_alloca()
    when stack auto-init is on (CONFIG_INIT_STACK_ALL_{ZERO,PATTERN}).
    
    add_random_kstack_offset() uses __builtin_alloca() to add a stack
    offset. This means, when CONFIG_INIT_STACK_ALL_{ZERO,PATTERN} is
    enabled, add_random_kstack_offset() will auto-init that unused portion
    of the stack used to add an offset.
    
    There are several problems with this:
    
    	1. These offsets can be as large as 1023 bytes. Performing
    	   memset() on them isn't exactly cheap, and this is done on
    	   every syscall entry.
    
    	2. Architectures adding add_random_kstack_offset() to syscall
    	   entry implemented in C require them to be 'noinstr' (e.g. see
    	   x86 and s390). The potential problem here is that a call to
    	   memset may occur, which is not noinstr.
    
    A x86_64 defconfig kernel with Clang 11 and CONFIG_VMLINUX_VALIDATION shows:
    
     | vml...
    8550c9b8
Kconfig 39.2 KB