2 "context stores via ST",
4 BPF_MOV64_IMM(BPF_REG_0, 0),
5 BPF_ST_MEM(BPF_DW, BPF_REG_1, offsetof(struct __sk_buff, mark), 0),
8 .errstr = "BPF_ST stores into R1 ctx is not allowed",
10 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
13 "context stores via BPF_ATOMIC",
15 BPF_MOV64_IMM(BPF_REG_0, 0),
16 BPF_ATOMIC_OP(BPF_W, BPF_ADD, BPF_REG_1, BPF_REG_0, offsetof(struct __sk_buff, mark)),
19 .errstr = "BPF_ATOMIC stores into R1 ctx is not allowed",
21 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
24 "arithmetic ops make PTR_TO_CTX unusable",
26 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1,
27 offsetof(struct __sk_buff, data) -
28 offsetof(struct __sk_buff, mark)),
29 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
30 offsetof(struct __sk_buff, mark)),
33 .errstr = "dereference of modified ctx ptr",
35 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
38 "pass unmodified ctx pointer to helper",
40 BPF_MOV64_IMM(BPF_REG_2, 0),
41 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
42 BPF_FUNC_csum_update),
43 BPF_MOV64_IMM(BPF_REG_0, 0),
46 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
50 "pass modified ctx pointer to helper, 1",
52 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -612),
53 BPF_MOV64_IMM(BPF_REG_2, 0),
54 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
55 BPF_FUNC_csum_update),
56 BPF_MOV64_IMM(BPF_REG_0, 0),
59 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
61 .errstr = "dereference of modified ctx ptr",
64 "pass modified ctx pointer to helper, 2",
66 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -612),
67 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
68 BPF_FUNC_get_socket_cookie),
69 BPF_MOV64_IMM(BPF_REG_0, 0),
72 .result_unpriv = REJECT,
74 .errstr_unpriv = "dereference of modified ctx ptr",
75 .errstr = "dereference of modified ctx ptr",
78 "pass modified ctx pointer to helper, 3",
80 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 0),
81 BPF_ALU64_IMM(BPF_AND, BPF_REG_3, 4),
82 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
83 BPF_MOV64_IMM(BPF_REG_2, 0),
84 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
85 BPF_FUNC_csum_update),
86 BPF_MOV64_IMM(BPF_REG_0, 0),
89 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
91 .errstr = "variable ctx access var_off=(0x0; 0x4)",
94 "pass ctx or null check, 1: ctx",
96 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
97 BPF_FUNC_get_netns_cookie),
98 BPF_MOV64_IMM(BPF_REG_0, 0),
101 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK_ADDR,
102 .expected_attach_type = BPF_CGROUP_UDP6_SENDMSG,
106 "pass ctx or null check, 2: null",
108 BPF_MOV64_IMM(BPF_REG_1, 0),
109 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
110 BPF_FUNC_get_netns_cookie),
111 BPF_MOV64_IMM(BPF_REG_0, 0),
114 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK_ADDR,
115 .expected_attach_type = BPF_CGROUP_UDP6_SENDMSG,
119 "pass ctx or null check, 3: 1",
121 BPF_MOV64_IMM(BPF_REG_1, 1),
122 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
123 BPF_FUNC_get_netns_cookie),
124 BPF_MOV64_IMM(BPF_REG_0, 0),
127 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK_ADDR,
128 .expected_attach_type = BPF_CGROUP_UDP6_SENDMSG,
130 .errstr = "R1 type=inv expected=ctx",
133 "pass ctx or null check, 4: ctx - const",
135 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -612),
136 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
137 BPF_FUNC_get_netns_cookie),
138 BPF_MOV64_IMM(BPF_REG_0, 0),
141 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK_ADDR,
142 .expected_attach_type = BPF_CGROUP_UDP6_SENDMSG,
144 .errstr = "dereference of modified ctx ptr",
147 "pass ctx or null check, 5: null (connect)",
149 BPF_MOV64_IMM(BPF_REG_1, 0),
150 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
151 BPF_FUNC_get_netns_cookie),
152 BPF_MOV64_IMM(BPF_REG_0, 0),
155 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK_ADDR,
156 .expected_attach_type = BPF_CGROUP_INET4_CONNECT,
160 "pass ctx or null check, 6: null (bind)",
162 BPF_MOV64_IMM(BPF_REG_1, 0),
163 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
164 BPF_FUNC_get_netns_cookie),
165 BPF_MOV64_IMM(BPF_REG_0, 0),
168 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK,
169 .expected_attach_type = BPF_CGROUP_INET4_POST_BIND,
173 "pass ctx or null check, 7: ctx (bind)",
175 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
176 BPF_FUNC_get_socket_cookie),
177 BPF_MOV64_IMM(BPF_REG_0, 0),
180 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK,
181 .expected_attach_type = BPF_CGROUP_INET4_POST_BIND,
185 "pass ctx or null check, 8: null (bind)",
187 BPF_MOV64_IMM(BPF_REG_1, 0),
188 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
189 BPF_FUNC_get_socket_cookie),
190 BPF_MOV64_IMM(BPF_REG_0, 0),
193 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK,
194 .expected_attach_type = BPF_CGROUP_INET4_POST_BIND,
196 .errstr = "R1 type=inv expected=ctx",