Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.13.7.
  1{
  2	"valid map access into an array with a constant",
  3	.insns = {
  4	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
  5	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  6	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
  7	BPF_LD_MAP_FD(BPF_REG_1, 0),
  8	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
  9	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
 10	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, offsetof(struct test_val, foo)),
 11	BPF_EXIT_INSN(),
 12	},
 13	.fixup_map_hash_48b = { 3 },
 14	.errstr_unpriv = "R0 leaks addr",
 15	.result_unpriv = REJECT,
 16	.result = ACCEPT,
 17},
 18{
 19	"valid map access into an array with a register",
 20	.insns = {
 21	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
 22	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
 23	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
 24	BPF_LD_MAP_FD(BPF_REG_1, 0),
 25	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
 26	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
 27	BPF_MOV64_IMM(BPF_REG_1, 4),
 28	BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2),
 29	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
 30	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, offsetof(struct test_val, foo)),
 31	BPF_EXIT_INSN(),
 32	},
 33	.fixup_map_hash_48b = { 3 },
 34	.errstr_unpriv = "R0 leaks addr",
 35	.result_unpriv = REJECT,
 36	.result = ACCEPT,
 37	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 38},
 39{
 40	"valid map access into an array with a variable",
 41	.insns = {
 42	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
 43	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
 44	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
 45	BPF_LD_MAP_FD(BPF_REG_1, 0),
 46	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
 47	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
 48	BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
 49	BPF_JMP_IMM(BPF_JGE, BPF_REG_1, MAX_ENTRIES, 3),
 50	BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2),
 51	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
 52	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, offsetof(struct test_val, foo)),
 53	BPF_EXIT_INSN(),
 54	},
 55	.fixup_map_hash_48b = { 3 },
 56	.errstr_unpriv = "R0 leaks addr",
 57	.result_unpriv = REJECT,
 58	.result = ACCEPT,
 59	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 60},
 61{
 62	"valid map access into an array with a signed variable",
 63	.insns = {
 64	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
 65	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
 66	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
 67	BPF_LD_MAP_FD(BPF_REG_1, 0),
 68	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
 69	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9),
 70	BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
 71	BPF_JMP32_IMM(BPF_JSGT, BPF_REG_1, 0xffffffff, 1),
 72	BPF_MOV32_IMM(BPF_REG_1, 0),
 73	BPF_MOV32_IMM(BPF_REG_2, MAX_ENTRIES),
 74	BPF_JMP_REG(BPF_JSGT, BPF_REG_2, BPF_REG_1, 1),
 75	BPF_MOV32_IMM(BPF_REG_1, 0),
 76	BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 2),
 77	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
 78	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, offsetof(struct test_val, foo)),
 79	BPF_EXIT_INSN(),
 80	},
 81	.fixup_map_hash_48b = { 3 },
 82	.errstr_unpriv = "R0 leaks addr",
 83	.result_unpriv = REJECT,
 84	.result = ACCEPT,
 85	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 86},
 87{
 88	"invalid map access into an array with a constant",
 89	.insns = {
 90	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
 91	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
 92	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
 93	BPF_LD_MAP_FD(BPF_REG_1, 0),
 94	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
 95	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
 96	BPF_ST_MEM(BPF_DW, BPF_REG_0, (MAX_ENTRIES + 1) << 2,
 97		   offsetof(struct test_val, foo)),
 98	BPF_EXIT_INSN(),
 99	},
100	.fixup_map_hash_48b = { 3 },
101	.errstr = "invalid access to map value, value_size=48 off=48 size=8",
102	.result = REJECT,
103},
104{
105	"invalid map access into an array with a register",
106	.insns = {
107	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
108	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
109	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
110	BPF_LD_MAP_FD(BPF_REG_1, 0),
111	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
112	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
113	BPF_MOV64_IMM(BPF_REG_1, MAX_ENTRIES + 1),
114	BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2),
115	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
116	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, offsetof(struct test_val, foo)),
117	BPF_EXIT_INSN(),
118	},
119	.fixup_map_hash_48b = { 3 },
120	.errstr = "R0 min value is outside of the allowed memory range",
121	.result = REJECT,
122	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
123},
124{
125	"invalid map access into an array with a variable",
126	.insns = {
127	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
128	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
129	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
130	BPF_LD_MAP_FD(BPF_REG_1, 0),
131	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
132	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
133	BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
134	BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2),
135	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
136	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, offsetof(struct test_val, foo)),
137	BPF_EXIT_INSN(),
138	},
139	.fixup_map_hash_48b = { 3 },
140	.errstr = "R0 unbounded memory access, make sure to bounds check any such access",
141	.result = REJECT,
142	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
143},
144{
145	"invalid map access into an array with no floor check",
146	.insns = {
147	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
148	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
149	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
150	BPF_LD_MAP_FD(BPF_REG_1, 0),
151	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
152	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
153	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0),
154	BPF_MOV32_IMM(BPF_REG_2, MAX_ENTRIES),
155	BPF_JMP_REG(BPF_JSGT, BPF_REG_2, BPF_REG_1, 1),
156	BPF_MOV32_IMM(BPF_REG_1, 0),
157	BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 2),
158	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
159	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, offsetof(struct test_val, foo)),
160	BPF_EXIT_INSN(),
161	},
162	.fixup_map_hash_48b = { 3 },
163	.errstr_unpriv = "R0 leaks addr",
164	.errstr = "R0 unbounded memory access",
165	.result_unpriv = REJECT,
166	.result = REJECT,
167	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
168},
169{
170	"invalid map access into an array with a invalid max check",
171	.insns = {
172	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
173	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
174	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
175	BPF_LD_MAP_FD(BPF_REG_1, 0),
176	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
177	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
178	BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
179	BPF_MOV32_IMM(BPF_REG_2, MAX_ENTRIES + 1),
180	BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1),
181	BPF_MOV32_IMM(BPF_REG_1, 0),
182	BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 2),
183	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
184	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, offsetof(struct test_val, foo)),
185	BPF_EXIT_INSN(),
186	},
187	.fixup_map_hash_48b = { 3 },
188	.errstr_unpriv = "R0 leaks addr",
189	.errstr = "invalid access to map value, value_size=48 off=44 size=8",
190	.result_unpriv = REJECT,
191	.result = REJECT,
192	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
193},
194{
195	"invalid map access into an array with a invalid max check",
196	.insns = {
197	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
198	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
199	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
200	BPF_LD_MAP_FD(BPF_REG_1, 0),
201	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
202	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10),
203	BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
204	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
205	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
206	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
207	BPF_LD_MAP_FD(BPF_REG_1, 0),
208	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
209	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
210	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_8),
211	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0,
212		    offsetof(struct test_val, foo)),
213	BPF_EXIT_INSN(),
214	},
215	.fixup_map_hash_48b = { 3, 11 },
216	.errstr = "R0 pointer += pointer",
217	.result = REJECT,
218	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
219},
220{
221	"valid read map access into a read-only array 1",
222	.insns = {
223	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
224	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
225	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
226	BPF_LD_MAP_FD(BPF_REG_1, 0),
227	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
228	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
229	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 0),
230	BPF_EXIT_INSN(),
231	},
232	.fixup_map_array_ro = { 3 },
233	.result = ACCEPT,
234	.retval = 28,
235},
236{
237	"valid read map access into a read-only array 2",
238	.insns = {
239	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
240	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
241	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
242	BPF_LD_MAP_FD(BPF_REG_1, 0),
243	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
244	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
245
246	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
247	BPF_MOV64_IMM(BPF_REG_2, 4),
248	BPF_MOV64_IMM(BPF_REG_3, 0),
249	BPF_MOV64_IMM(BPF_REG_4, 0),
250	BPF_MOV64_IMM(BPF_REG_5, 0),
251	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
252		     BPF_FUNC_csum_diff),
253	BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0xffff),
254	BPF_EXIT_INSN(),
255	},
256	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
257	.fixup_map_array_ro = { 3 },
258	.result = ACCEPT,
259	.retval = 65507,
260},
261{
262	"invalid write map access into a read-only array 1",
263	.insns = {
264	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
265	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
266	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
267	BPF_LD_MAP_FD(BPF_REG_1, 0),
268	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
269	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
270	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42),
271	BPF_EXIT_INSN(),
272	},
273	.fixup_map_array_ro = { 3 },
274	.result = REJECT,
275	.errstr = "write into map forbidden",
276},
277{
278	"invalid write map access into a read-only array 2",
279	.insns = {
280	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
281	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
282	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
283	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
284	BPF_LD_MAP_FD(BPF_REG_1, 0),
285	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
286	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
287	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
288	BPF_MOV64_IMM(BPF_REG_2, 0),
289	BPF_MOV64_REG(BPF_REG_3, BPF_REG_0),
290	BPF_MOV64_IMM(BPF_REG_4, 8),
291	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
292		     BPF_FUNC_skb_load_bytes),
293	BPF_EXIT_INSN(),
294	},
295	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
296	.fixup_map_array_ro = { 4 },
297	.result = REJECT,
298	.errstr = "write into map forbidden",
299},
300{
301	"valid write map access into a write-only array 1",
302	.insns = {
303	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
304	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
305	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
306	BPF_LD_MAP_FD(BPF_REG_1, 0),
307	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
308	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
309	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42),
310	BPF_MOV64_IMM(BPF_REG_0, 1),
311	BPF_EXIT_INSN(),
312	},
313	.fixup_map_array_wo = { 3 },
314	.result = ACCEPT,
315	.retval = 1,
316},
317{
318	"valid write map access into a write-only array 2",
319	.insns = {
320	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
321	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
322	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
323	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
324	BPF_LD_MAP_FD(BPF_REG_1, 0),
325	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
326	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
327	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
328	BPF_MOV64_IMM(BPF_REG_2, 0),
329	BPF_MOV64_REG(BPF_REG_3, BPF_REG_0),
330	BPF_MOV64_IMM(BPF_REG_4, 8),
331	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
332		     BPF_FUNC_skb_load_bytes),
333	BPF_EXIT_INSN(),
334	},
335	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
336	.fixup_map_array_wo = { 4 },
337	.result = ACCEPT,
338	.retval = 0,
339},
340{
341	"invalid read map access into a write-only array 1",
342	.insns = {
343	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
344	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
345	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
346	BPF_LD_MAP_FD(BPF_REG_1, 0),
347	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
348	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
349	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
350	BPF_EXIT_INSN(),
351	},
352	.fixup_map_array_wo = { 3 },
353	.result = REJECT,
354	.errstr = "read from map forbidden",
355},
356{
357	"invalid read map access into a write-only array 2",
358	.insns = {
359	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
360	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
361	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
362	BPF_LD_MAP_FD(BPF_REG_1, 0),
363	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
364	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
365
366	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
367	BPF_MOV64_IMM(BPF_REG_2, 4),
368	BPF_MOV64_IMM(BPF_REG_3, 0),
369	BPF_MOV64_IMM(BPF_REG_4, 0),
370	BPF_MOV64_IMM(BPF_REG_5, 0),
371	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
372		     BPF_FUNC_csum_diff),
373	BPF_EXIT_INSN(),
374	},
375	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
376	.fixup_map_array_wo = { 3 },
377	.result = REJECT,
378	.errstr = "read from map forbidden",
379},