1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2024 Isovalent */
5 #include <bpf/bpf_helpers.h>
6 #include <bpf/bpf_tracing.h>
9 const volatile long foo = 42;
14 __description("rodata/strtol: write rejected")
15 __failure __msg("write into map forbidden")
16 int tcx1(struct __sk_buff *skb)
18 char buff[] = { '8', '4', '\0' };
19 bpf_strtol(buff, sizeof(buff), 0, (long *)&foo);
24 __description("bss/strtol: write accepted")
26 int tcx2(struct __sk_buff *skb)
28 char buff[] = { '8', '4', '\0' };
29 bpf_strtol(buff, sizeof(buff), 0, &bar);
34 __description("data/strtol: write accepted")
36 int tcx3(struct __sk_buff *skb)
38 char buff[] = { '8', '4', '\0' };
39 bpf_strtol(buff, sizeof(buff), 0, &bart);
44 __description("rodata/mtu: write rejected")
45 __failure __msg("write into map forbidden")
46 int tcx4(struct __sk_buff *skb)
48 bpf_check_mtu(skb, skb->ifindex, (__u32 *)&foo, 0, 0);
53 __description("bss/mtu: write accepted")
55 int tcx5(struct __sk_buff *skb)
57 bpf_check_mtu(skb, skb->ifindex, (__u32 *)&bar, 0, 0);
62 __description("data/mtu: write accepted")
64 int tcx6(struct __sk_buff *skb)
66 bpf_check_mtu(skb, skb->ifindex, (__u32 *)&bart, 0, 0);
70 static inline void write_fixed(volatile void *p, __u32 val)
72 *(volatile __u32 *)p = val;
75 static inline void write_dyn(void *p, void *val, int len)
77 bpf_copy_from_user(p, len, val);
81 __description("rodata/mark: write with unknown reg rejected")
82 __failure __msg("write into map forbidden")
83 int tcx7(struct __sk_buff *skb)
85 write_fixed((void *)&foo, skb->mark);
89 SEC("lsm.s/bprm_committed_creds")
90 __description("rodata/mark: write with unknown reg rejected")
91 __failure __msg("write into map forbidden")
92 int BPF_PROG(bprm, struct linux_binprm *bprm)
94 write_dyn((void *)&foo, &bart, bpf_get_prandom_u32() & 3);
98 char LICENSE[] SEC("license") = "GPL";