]> git.baikalelectronics.ru Git - kernel.git/commit
bpf: Reject indirect var_off stack access in unpriv mode
authorAndrey Ignatov <rdna@fb.com>
Thu, 4 Apr 2019 06:22:39 +0000 (23:22 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Fri, 5 Apr 2019 14:50:07 +0000 (16:50 +0200)
commit04cf427e76b4602198c88c8cb29a556eca0c9091
treec7965d3ac5707279af5d842e99d37e474a4e8d73
parent7c5bf7431a6e5aff8da119b32cc95140329c092e
bpf: Reject indirect var_off stack access in unpriv mode

Proper support of indirect stack access with variable offset in
unprivileged mode (!root) requires corresponding support in Spectre
masking for stack ALU in retrieve_ptr_limit().

There are no use-case for variable offset in unprivileged mode though so
make verifier reject such accesses for simplicity.

Pointer arithmetics is one (and only?) way to cause variable offset and
it's already rejected in unpriv mode so that verifier won't even get to
helper function whose argument contains variable offset, e.g.:

  0: (7a) *(u64 *)(r10 -16) = 0
  1: (7a) *(u64 *)(r10 -8) = 0
  2: (61) r2 = *(u32 *)(r1 +0)
  3: (57) r2 &= 4
  4: (17) r2 -= 16
  5: (0f) r2 += r10
  variable stack access var_off=(0xfffffffffffffff0; 0x4) off=-16 size=1R2
  stack pointer arithmetic goes out of range, prohibited for !root

Still it looks like a good idea to reject variable offset indirect stack
access for unprivileged mode in check_stack_boundary() explicitly.

Fixes: 3ab4b87eea91 ("bpf: Support variable offset stack access from helpers")
Reported-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: Andrey Ignatov <rdna@fb.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
kernel/bpf/verifier.c