• Mark Rutland's avatar
    stackleak: rework poison scanning · 77cf2b6d
    Mark Rutland authored
    
    
    Currently we over-estimate the region of stack which must be erased.
    
    To determine the region to be erased, we scan downwards for a contiguous
    block of poison values (or the low bound of the stack). There are a few
    minor problems with this today:
    
    * When we find a block of poison values, we include this block within
      the region to erase.
    
      As this is included within the region to erase, this causes us to
      redundantly overwrite 'STACKLEAK_SEARCH_DEPTH' (128) bytes with
      poison.
    
    * As the loop condition checks 'poison_count <= depth', it will run an
      additional iteration after finding the contiguous block of poison,
      decrementing 'erase_low' once more than necessary.
    
      As this is included within the region to erase, this causes us to
      redundantly overwrite an additional unsigned long with poison.
    
    * As we always decrement 'erase_low' after checking an element on the
      stack, we always include the element below this within the region to
      erase.
    
      As this is included within the region to erase, this causes us to
      redundantly overwrite an additional unsigned long with poison.
    
      Note that this is not a functional problem. As the loop condition
      checks 'erase_low > task_stack_low', we'll never clobber the
      STACK_END_MAGIC. As we always decrement 'erase_low' after this, we'll
      never fail to erase the element immediately above the STACK_END_MAGIC.
    
    In total, this can cause us to erase `128 + 2 * sizeof(unsigned long)`
    bytes more than necessary, which is unfortunate.
    
    This patch reworks the logic to find the address immediately above the
    poisoned region, by finding the lowest non-poisoned address. This is
    factored into a stackleak_find_top_of_poison() helper both for clarity
    and so that this can be shared with the LKDTM test in subsequent
    patches.
    Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
    Cc: Alexander Popov <alex.popov@linux.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Kees Cook <keescook@chromium.org>
    Signed-off-by: default avatarKees Cook <keescook@chromium.org>
    Link: https://lore.kernel.org/r/20220427173128.2603085-8-mark.rutland@arm.com
    77cf2b6d
stackleak.c 3.77 KB