Thread (16 messages) 16 messages, 7 authors, 2021-06-10

Re: [PATCH v4] bpf: core: fix shift-out-of-bounds in ___bpf_prog_run

From: Kees Cook <hidden>
Date: 2021-06-10 17:07:05
Also in: bpf, lkml, netdev

On Wed, Jun 09, 2021 at 11:06:31PM -0700, Yonghong Song wrote:

On 6/9/21 10:32 PM, Dmitry Vyukov wrote:
quoted
On Thu, Jun 10, 2021 at 1:40 AM Yonghong Song [off-list ref] wrote:
quoted
On 6/9/21 11:20 AM, Kees Cook wrote:
quoted
On Mon, Jun 07, 2021 at 09:38:43AM +0200, 'Dmitry Vyukov' via Clang Built Linux wrote:
quoted
On Sat, Jun 5, 2021 at 9:10 PM Alexei Starovoitov
[off-list ref] wrote:
quoted
On Sat, Jun 5, 2021 at 10:55 AM Yonghong Song [off-list ref] wrote:
quoted
On 6/5/21 8:01 AM, Kurt Manucredo wrote:
quoted
Syzbot detects a shift-out-of-bounds in ___bpf_prog_run()
kernel/bpf/core.c:1414:2.
[...]

I think this is what happens. For the above case, we simply
marks the dst reg as unknown and didn't fail verification.
So later on at runtime, the shift optimization will have wrong
shift value (> 31/64). Please correct me if this is not right
analysis. As I mentioned in the early please write detailed
analysis in commit log.
The large shift is not wrong. It's just undefined.
syzbot has to ignore such cases.
Hi Alexei,

The report is produced by KUBSAN. I thought there was an agreement on
cleaning up KUBSAN reports from the kernel (the subset enabled on
syzbot at least).
What exactly cases should KUBSAN ignore?
+linux-hardening/kasan-dev for KUBSAN false positive
Can check_shl_overflow() be used at all? Best to just make things
readable and compiler-happy, whatever the implementation. :)
This is not a compile issue. If the shift amount is a constant,
compiler should have warned and user should fix the warning.

This is because user code has
something like
      a << s;
where s is a unknown variable and
verifier just marked the result of a << s as unknown value.
Verifier may not reject the code depending on how a << s result
is used.
Ah, gotcha: it's the BPF code itself that needs to catch it.
quoted
quoted
If bpf program writer uses check_shl_overflow() or some kind
of checking for shift value and won't do shifting if the
shifting may cause an undefined result, there should not
be any kubsan warning.
Right.
quoted
I guess the main question: what should happen if a bpf program writer
does _not_ use compiler nor check_shl_overflow()?
I think the BPF runtime needs to make such actions defined, instead of
doing a blind shift. It needs to check the size of the shift explicitly
when handling the shift instruction.
If kubsan is not enabled, everything should work as expected even with
shl overflow may cause undefined result.

if kubsan is enabled, the reported shift-out-of-bounds warning
should be ignored. You could disasm the insn to ensure that
there indeed exists a potential shl overflow.
Sure, but the point of UBSAN is to find and alert about undefined
behavior, so we still need to fix this.


-- 
Kees Cook
_______________________________________________
Linux-kernel-mentees mailing list
Linux-kernel-mentees@lists.linuxfoundation.org
https://lists.linuxfoundation.org/mailman/listinfo/linux-kernel-mentees
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help