]> git.baikalelectronics.ru Git - kernel.git/commitdiff
bpf, ringbuf: Deny reserve of buffers larger than ringbuf
authorThadeu Lima de Souza Cascardo <cascardo@canonical.com>
Tue, 27 Apr 2021 13:12:12 +0000 (10:12 -0300)
committerDaniel Borkmann <daniel@iogearbox.net>
Tue, 11 May 2021 11:30:45 +0000 (13:30 +0200)
A BPF program might try to reserve a buffer larger than the ringbuf size.
If the consumer pointer is way ahead of the producer, that would be
successfully reserved, allowing the BPF program to read or write out of
the ringbuf allocated area.

Reported-by: Ryota Shiga (Flatt Security)
Fixes: 457f44363a88 ("bpf: Implement BPF ring buffer and verifier support for it")
Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/ringbuf.c

index f25b719ac786811c8d1f06b849e42422ccfba70e..b86d80c9cd59b0009b14c456a32d4d950ec418a5 100644 (file)
@@ -315,6 +315,9 @@ static void *__bpf_ringbuf_reserve(struct bpf_ringbuf *rb, u64 size)
                return NULL;
 
        len = round_up(size + BPF_RINGBUF_HDR_SZ, 8);
+       if (len > rb->mask + 1)
+               return NULL;
+
        cons_pos = smp_load_acquire(&rb->consumer_pos);
 
        if (in_nmi()) {