linux-stable/kernel/bpf
Maxim Mikityanskiy e0d837ac05 bpf: Fix the off-by-two error in range markings
commit 2fa7d94afc upstream.

The first commit cited below attempts to fix the off-by-one error that
appeared in some comparisons with an open range. Due to this error,
arithmetically equivalent pieces of code could get different verdicts
from the verifier, for example (pseudocode):

  // 1. Passes the verifier:
  if (data + 8 > data_end)
      return early
  read *(u64 *)data, i.e. [data; data+7]

  // 2. Rejected by the verifier (should still pass):
  if (data + 7 >= data_end)
      return early
  read *(u64 *)data, i.e. [data; data+7]

The attempted fix, however, shifts the range by one in a wrong
direction, so the bug not only remains, but also such piece of code
starts failing in the verifier:

  // 3. Rejected by the verifier, but the check is stricter than in #1.
  if (data + 8 >= data_end)
      return early
  read *(u64 *)data, i.e. [data; data+7]

The change performed by that fix converted an off-by-one bug into
off-by-two. The second commit cited below added the BPF selftests
written to ensure than code chunks like #3 are rejected, however,
they should be accepted.

This commit fixes the off-by-two error by adjusting new_range in the
right direction and fixes the tests by changing the range into the
one that should actually fail.

Fixes: fb2a311a31 ("bpf: fix off by one for range markings with L{T, E} patterns")
Fixes: b37242c773 ("bpf: add test cases to bpf selftests to cover all access tests")
Signed-off-by: Maxim Mikityanskiy <maximmi@nvidia.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20211130181607.593149-1-maximmi@nvidia.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2021-12-14 10:16:53 +01:00
..
arraymap.c bpf: sockmap, map_release does not hold refcnt for pinned maps 2018-11-04 14:52:44 +01:00
bpf_lru_list.c bpf_lru_list: Read double-checked variable once without lock 2021-03-03 18:22:39 +01:00
bpf_lru_list.h
cgroup.c
core.c bpf: Prevent increasing bpf_jit_limit above max 2021-11-26 11:40:22 +01:00
devmap.c bpf: devmap: fix wrong interface selection in notifier_call 2019-12-01 09:13:47 +01:00
hashtab.c bpf: Remove recursion prevention from rcu free callback 2020-10-01 13:12:35 +02:00
helpers.c
inode.c bpf: fix use after free in bpf_evict_inode 2019-04-20 09:15:07 +02:00
lpm_trie.c
Makefile bpf: silence warning messages in core 2019-07-31 07:28:25 +02:00
map_in_map.c bpf: fix inner map masking to prevent oob under speculation 2019-04-20 09:15:09 +02:00
map_in_map.h
percpu_freelist.c bpf: fix lockdep false positive in percpu_freelist 2019-03-13 14:03:20 -07:00
percpu_freelist.h bpf: fix lockdep false positive in percpu_freelist 2019-03-13 14:03:20 -07:00
sockmap.c bpf: sockmap, map_release does not hold refcnt for pinned maps 2018-11-04 14:52:44 +01:00
stackmap.c bpf: Fix integer overflow in prealloc_elems_and_freelist() 2021-10-17 10:08:32 +02:00
syscall.c bpf: Explicitly memset some bpf info structures declared on the stack 2020-04-02 16:34:37 +02:00
tnum.c
verifier.c bpf: Fix the off-by-two error in range markings 2021-12-14 10:16:53 +01:00