• Rick Edgecombe's avatar
    binfmt_elf: Don't write past end of notes for regset gap · dd664099
    Rick Edgecombe authored
    In fill_thread_core_info() the ptrace accessible registers are collected
    to be written out as notes in a core file. The note array is allocated
    from a size calculated by iterating the user regset view, and counting the
    regsets that have a non-zero core_note_type. However, this only allows for
    there to be non-zero core_note_type at the end of the regset view. If
    there are any gaps in the middle, fill_thread_core_info() will overflow the
    note allocation, as it iterates over the size of the view and the
    allocation would be smaller than that.
    
    There doesn't appear to be any arch that has gaps such that they exceed
    the notes allocation, but the code is brittle and tries to support
    something it doesn't. It could be fixed by increasing the allocation size,
    but instead just have the note collecting code utilize the array better.
    This way the allocation can stay smaller.
    
    Even in the case of no arch's that have gaps in their regset views, this
    introduces a change in the resulting indicies of t->notes. It does not
    introduce any changes to the core file itself, because any blank notes are
    skipped in write_note_info().
    
    In case, the allocation logic between fill_note_info() and
    fill_thread_core_info() ever diverges from the usage logic, warn and skip
    writing any notes that would overflow the array.
    
    This fix is derrived from an earlier one[0] by Yu-cheng Yu.
    
    [0] https://lore.kernel.org/lkml/20180717162502.32274-1-yu-cheng.yu@intel.com/Co-developed-by: default avatarYu-cheng Yu <yu-cheng.yu@intel.com>
    Signed-off-by: default avatarYu-cheng Yu <yu-cheng.yu@intel.com>
    Signed-off-by: default avatarRick Edgecombe <rick.p.edgecombe@intel.com>
    Signed-off-by: default avatarKees Cook <keescook@chromium.org>
    Link: https://lore.kernel.org/r/20220317192013.13655-4-rick.p.edgecombe@intel.com
    dd664099
binfmt_elf.c 61.6 KB