On Wed, Oct 23, 2024 at 4:29 PM Hou Tao <houtao@xxxxxxxxxxxxxxx> wrote: > > > > On 10/23/2024 11:17 AM, Yafang Shao wrote: > > On Mon, Oct 21, 2024 at 9:28 AM Hou Tao <houtao@xxxxxxxxxxxxxxx> wrote: > >> From: Hou Tao <houtao1@xxxxxxxxxx> > >> > >> Check the validity of nr_words in bpf_iter_bits_new(). Without this > >> check, when multiplication overflow occurs for nr_bits (e.g., when > >> nr_words = 0x0400-0001, nr_bits becomes 64), stack corruption may occur > >> due to bpf_probe_read_kernel_common(..., nr_bytes = 0x2000-0008). > >> > >> Fix it by limiting the max value of nr_words to 512. > >> > >> Fixes: 4665415975b0 ("bpf: Add bits iterator") > >> Signed-off-by: Hou Tao <houtao1@xxxxxxxxxx> > >> --- > >> kernel/bpf/helpers.c | 4 ++++ > >> 1 file changed, 4 insertions(+) > >> > >> diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c > >> index 62349e206a29..c147f75e1b48 100644 > >> --- a/kernel/bpf/helpers.c > >> +++ b/kernel/bpf/helpers.c > >> @@ -2851,6 +2851,8 @@ struct bpf_iter_bits { > >> __u64 __opaque[2]; > >> } __aligned(8); > >> > >> +#define BITS_ITER_NR_WORDS_MAX 512 > >> + > >> struct bpf_iter_bits_kern { > >> union { > >> unsigned long *bits; > >> @@ -2892,6 +2894,8 @@ bpf_iter_bits_new(struct bpf_iter_bits *it, const u64 *unsafe_ptr__ign, u32 nr_w > >> > >> if (!unsafe_ptr__ign || !nr_words) > >> return -EINVAL; > >> + if (nr_words > BITS_ITER_NR_WORDS_MAX) > >> + return -E2BIG; > > It is documented that nr_words cannot exceed 512, not due to overflow > > concerns, but because of memory allocation limits. It might be better > > to use 512 directly instead of BITS_ITER_NR_WORDS_MAX. Alternatively, > > if we decide to keep using the macro, the documentation should be > > updated accordingly. > > Thanks for the explanation. Actually according to the limitation of bpf > memory allocator, the limitation should be (4096 - 8) / 8 = 511 due to > the overhead of llist_head in the returned pointer. If that's the case, we should make the following code change, right ? diff --git a/kernel/bpf/memalloc.c b/kernel/bpf/memalloc.c index 1a1b4458114c..64e73579c7d6 100644 --- a/kernel/bpf/memalloc.c +++ b/kernel/bpf/memalloc.c @@ -65,7 +65,7 @@ static u8 size_index[24] __ro_after_init = { static int bpf_mem_cache_idx(size_t size) { - if (!size || size > 4096) + if (!size || size > (4096 - 8)) return -1; if (size <= 192) -- Regards Yafang