• Shung-Hsi Yu's avatar
    libbpf: Use elf_getshdrnum() instead of e_shnum · 51deedc9
    Shung-Hsi Yu authored
    This commit replace e_shnum with the elf_getshdrnum() helper to fix two
    oss-fuzz-reported heap-buffer overflow in __bpf_object__open. Both
    reports are incorrectly marked as fixed and while still being
    reproducible in the latest libbpf.
    
      # clusterfuzz-testcase-minimized-bpf-object-fuzzer-5747922482888704
      libbpf: loading object 'fuzz-object' from buffer
      libbpf: sec_cnt is 0
      libbpf: elf: section(1) .data, size 0, link 538976288, flags 2020202020202020, type=2
      libbpf: elf: section(2) .data, size 32, link 538976288, flags 202020202020ff20, type=1
      =================================================================
      ==13==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6020000000c0 at pc 0x0000005a7b46 bp 0x7ffd12214af0 sp 0x7ffd12214ae8
      WRITE of size 4 at 0x6020000000c0 thread T0
      SCARINESS: 46 (4-byte-write-heap-buffer-overflow-far-from-bounds)
          #0 0x5a7b45 in bpf_object__elf_collect /src/libbpf/src/libbpf.c:3414:24
          #1 0x5733c0 in bpf_object_open /src/libbpf/src/libbpf.c:7223:16
          #2 0x5739fd in bpf_object__open_mem /src/libbpf/src/libbpf.c:7263:20
          ...
    
    The issue lie in libbpf's direct use of e_shnum field in ELF header as
    the section header count. Where as libelf implemented an extra logic
    that, when e_shnum == 0 && e_shoff != 0, will use sh_size member of the
    initial section header as the real section header count (part of ELF
    spec to accommodate situation where section header counter is larger
    than SHN_LORESERVE).
    
    The above inconsistency lead to libbpf writing into a zero-entry calloc
    area. So intead of using e_shnum directly, use the elf_getshdrnum()
    helper provided by libelf to retrieve the section header counter into
    sec_cnt.
    
    Fixes: 0d6988e1 ("libbpf: Fix section counting logic")
    Fixes: 25bbbd7a ("libbpf: Remove assumptions about uniqueness of .rodata/.data/.bss maps")
    Signed-off-by: default avatarShung-Hsi Yu <shung-hsi.yu@suse.com>
    Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Link: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=40868
    Link: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=40957
    Link: https://lore.kernel.org/bpf/20221012022353.7350-2-shung-hsi.yu@suse.com
    51deedc9
libbpf.c 326 KB