• Martin KaFai Lau's avatar
    bpf: Fix out-of-bound access on interpreters[] · 8007e40a
    Martin KaFai Lau authored
    The index is off-by-one when fp->aux->stack_depth
    has already been rounded up to 32.  In particular,
    if stack_depth is 512, the index will be 16.
    
    The fix is to round_up and then takes -1 instead of round_down.
    
    [   22.318680] ==================================================================
    [   22.319745] BUG: KASAN: global-out-of-bounds in bpf_prog_select_runtime+0x48a/0x670
    [   22.320737] Read of size 8 at addr ffffffff82aadae0 by task sockex3/1946
    [   22.321646]
    [   22.321858] CPU: 1 PID: 1946 Comm: sockex3 Tainted: G        W       4.12.0-rc6-01680-g2ee87db3 #22
    [   22.323061] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.9.3-1.el7.centos 04/01/2014
    [   22.324260] Call Trace:
    [   22.324612]  dump_stack+0x67/0x99
    [   22.325081]  print_address_description+0x1e8/0x290
    [   22.325734]  ? bpf_prog_select_runtime+0x48a/0x670
    [   22.326360]  kasan_report+0x265/0x350
    [   22.326860]  __asan_report_load8_noabort+0x19/0x20
    [   22.327484]  bpf_prog_select_runtime+0x48a/0x670
    [   22.328109]  bpf_prog_load+0x626/0xd40
    [   22.328637]  ? __bpf_prog_charge+0xc0/0xc0
    [   22.329222]  ? check_nnp_nosuid.isra.61+0x100/0x100
    [   22.329890]  ? __might_fault+0xf6/0x1b0
    [   22.330446]  ? lock_acquire+0x360/0x360
    [   22.331013]  SyS_bpf+0x67c/0x24d0
    [   22.331491]  ? trace_hardirqs_on+0xd/0x10
    [   22.332049]  ? __getnstimeofday64+0xaf/0x1c0
    [   22.332635]  ? bpf_prog_get+0x20/0x20
    [   22.333135]  ? __audit_syscall_entry+0x300/0x600
    [   22.333770]  ? syscall_trace_enter+0x540/0xdd0
    [   22.334339]  ? exit_to_usermode_loop+0xe0/0xe0
    [   22.334950]  ? do_syscall_64+0x48/0x410
    [   22.335446]  ? bpf_prog_get+0x20/0x20
    [   22.335954]  do_syscall_64+0x181/0x410
    [   22.336454]  entry_SYSCALL64_slow_path+0x25/0x25
    [   22.337121] RIP: 0033:0x7f263fe81f19
    [   22.337618] RSP: 002b:00007ffd9a3440c8 EFLAGS: 00000202 ORIG_RAX: 0000000000000141
    [   22.338619] RAX: ffffffffffffffda RBX: 0000000000aac5fb RCX: 00007f263fe81f19
    [   22.339600] RDX: 0000000000000030 RSI: 00007ffd9a3440d0 RDI: 0000000000000005
    [   22.340470] RBP: 0000000000a9a1e0 R08: 0000000000a9a1e0 R09: 0000009d00000001
    [   22.341430] R10: 0000000000000000 R11: 0000000000000202 R12: 0000000000010000
    [   22.342411] R13: 0000000000a9a023 R14: 0000000000000001 R15: 0000000000000003
    [   22.343369]
    [   22.343593] The buggy address belongs to the variable:
    [   22.344241]  interpreters+0x80/0x980
    [   22.344708]
    [   22.344908] Memory state around the buggy address:
    [   22.345556]  ffffffff82aad980: 00 00 00 04 fa fa fa fa 04 fa fa fa fa fa fa fa
    [   22.346449]  ffffffff82aada00: 00 00 00 00 00 fa fa fa fa fa fa fa 00 00 00 00
    [   22.347361] >ffffffff82aada80: 00 00 00 00 00 00 00 00 00 00 00 00 fa fa fa fa
    [   22.348301]                                                        ^
    [   22.349142]  ffffffff82aadb00: 00 01 fa fa fa fa fa fa 00 00 00 00 00 00 00 00
    [   22.350058]  ffffffff82aadb80: 00 00 07 fa fa fa fa fa 00 00 05 fa fa fa fa fa
    [   22.350984] ==================================================================
    
    Fixes: b870aa90 ("bpf: use different interpreter depending on required stack size")
    Signed-off-by: default avatarMartin KaFai Lau <kafai@fb.com>
    Acked-by: default avatarAlexei Starovoitov <ast@fb.com>
    Acked-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    8007e40a
core.c 37.2 KB