• Martin Lau's avatar
    bpf, btf: fix a missing check bug in btf_parse · 54299e1c
    Martin Lau authored
    [ Upstream commit 4a6998af ]
    
    Wenwen Wang reported:
    
      In btf_parse(), the header of the user-space btf data 'btf_data'
      is firstly parsed and verified through btf_parse_hdr().
      In btf_parse_hdr(), the header is copied from user-space 'btf_data'
      to kernel-space 'btf->hdr' and then verified. If no error happens
      during the verification process, the whole data of 'btf_data',
      including the header, is then copied to 'data' in btf_parse(). It
      is obvious that the header is copied twice here. More importantly,
      no check is enforced after the second copy to make sure the headers
      obtained in these two copies are same. Given that 'btf_data' resides
      in the user space, a malicious user can race to modify the header
      between these two copies. By doing so, the user can inject
      inconsistent data, which can cause undefined behavior of the
      kernel and introduce potential security risk.
    
    This issue is similar to the one fixed in commit 8af03d1a ("bpf:
    btf: Fix a missing check bug"). To fix it, this patch copies the user
    'btf_data' *before* parsing / verifying the BTF header.
    
    Fixes: 69b693f0 ("bpf: btf: Introduce BPF Type Format (BTF)")
    Signed-off-by: default avatarMartin KaFai Lau <kafai@fb.com>
    Co-developed-by: default avatarWenwen Wang <wang6495@umn.edu>
    Acked-by: default avatarSong Liu <songliubraving@fb.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
    54299e1c
btf.c 57.8 KB