11 Dec, 2018

1 commit

  • Daniel Borkmann says:

    ====================
    pull-request: bpf-next 2018-12-11

    The following pull-request contains BPF updates for your *net-next* tree.

    It has three minor merge conflicts, resolutions:

    1) tools/testing/selftests/bpf/test_verifier.c

    Take first chunk with alignment_prevented_execution.

    2) net/core/filter.c

    [...]
    case bpf_ctx_range_ptr(struct __sk_buff, flow_keys):
    case bpf_ctx_range(struct __sk_buff, wire_len):
    return false;
    [...]

    3) include/uapi/linux/bpf.h

    Take the second chunk for the two cases each.

    The main changes are:

    1) Add support for BPF line info via BTF and extend libbpf as well
    as bpftool's program dump to annotate output with BPF C code to
    facilitate debugging and introspection, from Martin.

    2) Add support for BPF_ALU | BPF_ARSH | BPF_{K,X} in interpreter
    and all JIT backends, from Jiong.

    3) Improve BPF test coverage on archs with no efficient unaligned
    access by adding an "any alignment" flag to the BPF program load
    to forcefully disable verifier alignment checks, from David.

    4) Add a new bpf_prog_test_run_xattr() API to libbpf which allows for
    proper use of BPF_PROG_TEST_RUN with data_out, from Lorenz.

    5) Extend tc BPF programs to use a new __sk_buff field called wire_len
    for more accurate accounting of packets going to wire, from Petar.

    6) Improve bpftool to allow dumping the trace pipe from it and add
    several improvements in bash completion and map/prog dump,
    from Quentin.

    7) Optimize arm64 BPF JIT to always emit movn/movk/movk sequence for
    kernel addresses and add a dedicated BPF JIT backend allocator,
    from Ard.

    8) Add a BPF helper function for IR remotes to report mouse movements,
    from Sean.

    9) Various cleanups in BPF prog dump e.g. to make UAPI bpf_prog_info
    member naming consistent with existing conventions, from Yonghong
    and Song.

    10) Misc cleanups and improvements in allowing to pass interface name
    via cmdline for xdp1 BPF example, from Matteo.

    11) Fix a potential segfault in BPF sample loader's kprobes handling,
    from Daniel T.

    12) Fix SPDX license in libbpf's README.rst, from Andrey.
    ====================

    Signed-off-by: David S. Miller

    David S. Miller
     

05 Dec, 2018

1 commit


02 Dec, 2018

1 commit

  • After commit f42ee093be29 ("bpf/test_run: support cgroup local
    storage") the bpf_test_run() function may fail with -ENOMEM, if
    it's not possible to allocate memory for a cgroup local storage.

    This error shouldn't be mixed with the return value of the testing
    program. Let's add an additional argument with a pointer where to
    store the testing program's result; and make bpf_test_run()
    return either 0 or -ENOMEM.

    Fixes: f42ee093be29 ("bpf/test_run: support cgroup local storage")
    Reported-by: Dan Carpenter
    Suggested-by: Alexei Starovoitov
    Signed-off-by: Roman Gushchin
    Cc: Daniel Borkmann
    Cc: Alexei Starovoitov
    Signed-off-by: Alexei Starovoitov

    Roman Gushchin
     

20 Oct, 2018

1 commit

  • Tests are added to make sure CGROUP_SKB cannot access:
    tc_classid, data_meta, flow_keys

    and can read and write:
    mark, prority, and cb[0-4]

    and can read other fields.

    To make selftest with skb->sk work, a dummy sk is added in
    bpf_prog_test_run_skb().

    Signed-off-by: Song Liu
    Signed-off-by: Alexei Starovoitov

    Song Liu
     

01 Oct, 2018

1 commit

  • In order to introduce per-cpu cgroup storage, let's generalize
    bpf cgroup core to support multiple cgroup storage types.
    Potentially, per-node cgroup storage can be added later.

    This commit is mostly a formal change that replaces
    cgroup_storage pointer with a array of cgroup_storage pointers.
    It doesn't actually introduce a new storage type,
    it will be done later.

    Each bpf program is now able to have one cgroup storage of each type.

    Signed-off-by: Roman Gushchin
    Acked-by: Song Liu
    Cc: Daniel Borkmann
    Cc: Alexei Starovoitov
    Signed-off-by: Daniel Borkmann

    Roman Gushchin
     

03 Aug, 2018

1 commit

  • Allocate a temporary cgroup storage to use for bpf program test runs.

    Because the test program is not actually attached to a cgroup,
    the storage is allocated manually just for the execution
    of the bpf program.

    If the program is executed multiple times, the storage is not zeroed
    on each run, emulating multiple runs of the program, attached to
    a real cgroup.

    Signed-off-by: Roman Gushchin
    Cc: Alexei Starovoitov
    Cc: Daniel Borkmann
    Acked-by: Martin KaFai Lau
    Signed-off-by: Daniel Borkmann

    Roman Gushchin
     

12 Jul, 2018

1 commit

  • sykzaller triggered several panics similar to the below:

    [...]
    [ 248.851531] BUG: KASAN: use-after-free in _copy_to_user+0x5c/0x90
    [ 248.857656] Read of size 985 at addr ffff8808017ffff2 by task a.out/1425
    [...]
    [ 248.865902] CPU: 1 PID: 1425 Comm: a.out Not tainted 4.18.0-rc4+ #13
    [ 248.865903] Hardware name: Supermicro SYS-5039MS-H12TRF/X11SSE-F, BIOS 2.1a 03/08/2018
    [ 248.865905] Call Trace:
    [ 248.865910] dump_stack+0xd6/0x185
    [ 248.865911] ? show_regs_print_info+0xb/0xb
    [ 248.865913] ? printk+0x9c/0xc3
    [ 248.865915] ? kmsg_dump_rewind_nolock+0xe4/0xe4
    [ 248.865919] print_address_description+0x6f/0x270
    [ 248.865920] kasan_report+0x25b/0x380
    [ 248.865922] ? _copy_to_user+0x5c/0x90
    [ 248.865924] check_memory_region+0x137/0x190
    [ 248.865925] kasan_check_read+0x11/0x20
    [ 248.865927] _copy_to_user+0x5c/0x90
    [ 248.865930] bpf_test_finish.isra.8+0x4f/0xc0
    [ 248.865932] bpf_prog_test_run_skb+0x6a0/0xba0
    [...]

    After scrubbing the BPF prog a bit from the noise, turns out it called
    bpf_skb_change_head() for the lwt_xmit prog with headroom of 2. Nothing
    wrong in that, however, this was run with repeat >> 0 in bpf_prog_test_run_skb()
    and the same skb thus keeps changing until the pskb_expand_head() called
    from skb_cow() keeps bailing out in atomic alloc context with -ENOMEM.
    So upon return we'll basically have 0 headroom left yet blindly do the
    __skb_push() of 14 bytes and keep copying data from there in bpf_test_finish()
    out of bounds. Fix to check if we have enough headroom and if pskb_expand_head()
    fails, bail out with error.

    Another bug independent of this fix (but related in triggering above) is
    that BPF_PROG_TEST_RUN should be reworked to reset the skb/xdp buffer to
    it's original state from input as otherwise repeating the same test in a
    loop won't work for benchmarking when underlying input buffer is getting
    changed by the prog each time and reused for the next run leading to
    unexpected results.

    Fixes: 1cf1cae963c2 ("bpf: introduce BPF_PROG_TEST_RUN command")
    Reported-by: syzbot+709412e651e55ed96498@syzkaller.appspotmail.com
    Reported-by: syzbot+54f39d6ab58f39720a55@syzkaller.appspotmail.com
    Signed-off-by: Daniel Borkmann
    Signed-off-by: Alexei Starovoitov

    Daniel Borkmann
     

19 Apr, 2018

1 commit


01 Feb, 2018

1 commit

  • syzkaller was able to generate the following XDP program ...

    (18) r0 = 0x0
    (61) r5 = *(u32 *)(r1 +12)
    (04) (u32) r0 += (u32) 0
    (95) exit

    ... and trigger a NULL pointer dereference in ___bpf_prog_run()
    via bpf_prog_test_run_xdp() where this was attempted to run.

    Reason is that recent xdp_rxq_info addition to XDP programs
    updated all drivers, but not bpf_prog_test_run_xdp(), where
    xdp_buff is set up. Thus when context rewriter does the deref
    on the netdev it's NULL at runtime. Fix it by using xdp_rxq
    from loopback dev. __netif_get_rx_queue() helper can also be
    reused in various other locations later on.

    Fixes: 02dd3291b2f0 ("bpf: finally expose xdp_rxq_info to XDP bpf-programs")
    Reported-by: syzbot+1eb094057b338eb1fc00@syzkaller.appspotmail.com
    Signed-off-by: Daniel Borkmann
    Cc: Jesper Dangaard Brouer
    Acked-by: Jesper Dangaard Brouer
    Signed-off-by: Alexei Starovoitov

    Daniel Borkmann
     

27 Sep, 2017

2 commits

  • This work enables generic transfer of metadata from XDP into skb. The
    basic idea is that we can make use of the fact that the resulting skb
    must be linear and already comes with a larger headroom for supporting
    bpf_xdp_adjust_head(), which mangles xdp->data. Here, we base our work
    on a similar principle and introduce a small helper bpf_xdp_adjust_meta()
    for adjusting a new pointer called xdp->data_meta. Thus, the packet has
    a flexible and programmable room for meta data, followed by the actual
    packet data. struct xdp_buff is therefore laid out that we first point
    to data_hard_start, then data_meta directly prepended to data followed
    by data_end marking the end of packet. bpf_xdp_adjust_head() takes into
    account whether we have meta data already prepended and if so, memmove()s
    this along with the given offset provided there's enough room.

    xdp->data_meta is optional and programs are not required to use it. The
    rationale is that when we process the packet in XDP (e.g. as DoS filter),
    we can push further meta data along with it for the XDP_PASS case, and
    give the guarantee that a clsact ingress BPF program on the same device
    can pick this up for further post-processing. Since we work with skb
    there, we can also set skb->mark, skb->priority or other skb meta data
    out of BPF, thus having this scratch space generic and programmable
    allows for more flexibility than defining a direct 1:1 transfer of
    potentially new XDP members into skb (it's also more efficient as we
    don't need to initialize/handle each of such new members). The facility
    also works together with GRO aggregation. The scratch space at the head
    of the packet can be multiple of 4 byte up to 32 byte large. Drivers not
    yet supporting xdp->data_meta can simply be set up with xdp->data_meta
    as xdp->data + 1 as bpf_xdp_adjust_meta() will detect this and bail out,
    such that the subsequent match against xdp->data for later access is
    guaranteed to fail.

    The verifier treats xdp->data_meta/xdp->data the same way as we treat
    xdp->data/xdp->data_end pointer comparisons. The requirement for doing
    the compare against xdp->data is that it hasn't been modified from it's
    original address we got from ctx access. It may have a range marking
    already from prior successful xdp->data/xdp->data_end pointer comparisons
    though.

    Signed-off-by: Daniel Borkmann
    Acked-by: Alexei Starovoitov
    Acked-by: John Fastabend
    Signed-off-by: David S. Miller

    Daniel Borkmann
     
  • Just do the rename into bpf_compute_data_pointers() as we'll add
    one more pointer here to recompute.

    Signed-off-by: Daniel Borkmann
    Acked-by: Alexei Starovoitov
    Acked-by: John Fastabend
    Signed-off-by: David S. Miller

    Daniel Borkmann
     

02 May, 2017

2 commits


02 Apr, 2017

1 commit

  • development and testing of networking bpf programs is quite cumbersome.
    Despite availability of user space bpf interpreters the kernel is
    the ultimate authority and execution environment.
    Current test frameworks for TC include creation of netns, veth,
    qdiscs and use of various packet generators just to test functionality
    of a bpf program. XDP testing is even more complicated, since
    qemu needs to be started with gro/gso disabled and precise queue
    configuration, transferring of xdp program from host into guest,
    attaching to virtio/eth0 and generating traffic from the host
    while capturing the results from the guest.

    Moreover analyzing performance bottlenecks in XDP program is
    impossible in virtio environment, since cost of running the program
    is tiny comparing to the overhead of virtio packet processing,
    so performance testing can only be done on physical nic
    with another server generating traffic.

    Furthermore ongoing changes to user space control plane of production
    applications cannot be run on the test servers leaving bpf programs
    stubbed out for testing.

    Last but not least, the upstream llvm changes are validated by the bpf
    backend testsuite which has no ability to test the code generated.

    To improve this situation introduce BPF_PROG_TEST_RUN command
    to test and performance benchmark bpf programs.

    Joint work with Daniel Borkmann.

    Signed-off-by: Alexei Starovoitov
    Acked-by: Daniel Borkmann
    Acked-by: Martin KaFai Lau
    Signed-off-by: David S. Miller

    Alexei Starovoitov