Skip to content

Commit 82bbe13

Browse files
borkmannAlexei Starovoitov
authored andcommitted
selftests/bpf: Add test for passing in uninit mtu_len
Add a small test to pass an uninitialized mtu_len to the bpf_check_mtu() helper to probe whether the verifier rejects it under !CAP_PERFMON. # ./vmtest.sh -- ./test_progs -t verifier_mtu [...] ./test_progs -t verifier_mtu [ 1.414712] tsc: Refined TSC clocksource calibration: 3407.993 MHz [ 1.415327] clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x311fcd52370, max_idle_ns: 440795242006 ns [ 1.416463] clocksource: Switched to clocksource tsc [ 1.429842] bpf_testmod: loading out-of-tree module taints kernel. [ 1.430283] bpf_testmod: module verification failed: signature and/or required key missing - tainting kernel #510/1 verifier_mtu/uninit/mtu: write rejected:OK #510 verifier_mtu:OK Summary: 1/1 PASSED, 0 SKIPPED, 0 FAILED Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Kumar Kartikeya Dwivedi <memxor@gmail.com> Link: https://lore.kernel.org/r/20241021152809.33343-5-daniel@iogearbox.net Signed-off-by: Alexei Starovoitov <ast@kernel.org>
1 parent baa802d commit 82bbe13

2 files changed

Lines changed: 37 additions & 0 deletions

File tree

tools/testing/selftests/bpf/prog_tests/verifier.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
#include "verifier_masking.skel.h"
5555
#include "verifier_meta_access.skel.h"
5656
#include "verifier_movsx.skel.h"
57+
#include "verifier_mtu.skel.h"
5758
#include "verifier_netfilter_ctx.skel.h"
5859
#include "verifier_netfilter_retcode.skel.h"
5960
#include "verifier_bpf_fastcall.skel.h"
@@ -223,6 +224,24 @@ void test_verifier_xdp_direct_packet_access(void) { RUN(verifier_xdp_direct_pack
223224
void test_verifier_bits_iter(void) { RUN(verifier_bits_iter); }
224225
void test_verifier_lsm(void) { RUN(verifier_lsm); }
225226

227+
void test_verifier_mtu(void)
228+
{
229+
__u64 caps = 0;
230+
int ret;
231+
232+
/* In case CAP_BPF and CAP_PERFMON is not set */
233+
ret = cap_enable_effective(1ULL << CAP_BPF | 1ULL << CAP_NET_ADMIN, &caps);
234+
if (!ASSERT_OK(ret, "set_cap_bpf_cap_net_admin"))
235+
return;
236+
ret = cap_disable_effective(1ULL << CAP_SYS_ADMIN | 1ULL << CAP_PERFMON, NULL);
237+
if (!ASSERT_OK(ret, "disable_cap_sys_admin"))
238+
goto restore_cap;
239+
RUN(verifier_mtu);
240+
restore_cap:
241+
if (caps)
242+
cap_enable_effective(caps, NULL);
243+
}
244+
226245
static int init_test_val_map(struct bpf_object *obj, char *map_name)
227246
{
228247
struct test_val value = {
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
3+
#include "vmlinux.h"
4+
#include <bpf/bpf_helpers.h>
5+
#include "bpf_misc.h"
6+
7+
SEC("tc/ingress")
8+
__description("uninit/mtu: write rejected")
9+
__failure __msg("invalid indirect read from stack")
10+
int tc_uninit_mtu(struct __sk_buff *ctx)
11+
{
12+
__u32 mtu;
13+
14+
bpf_check_mtu(ctx, 0, &mtu, 0, 0);
15+
return TCX_PASS;
16+
}
17+
18+
char LICENSE[] SEC("license") = "GPL";

0 commit comments

Comments
 (0)