1 /* 2 * Testsuite for eBPF verifier 3 * 4 * Copyright (c) 2014 PLUMgrid, http://plumgrid.com 5 * Copyright (c) 2017 Facebook 6 * Copyright (c) 2018 Covalent IO, Inc. http://covalent.io 7 * 8 * This program is free software; you can redistribute it and/or 9 * modify it under the terms of version 2 of the GNU General Public 10 * License as published by the Free Software Foundation. 11 */ 12 13 #include <endian.h> 14 #include <asm/types.h> 15 #include <linux/types.h> 16 #include <stdint.h> 17 #include <stdio.h> 18 #include <stdlib.h> 19 #include <unistd.h> 20 #include <errno.h> 21 #include <string.h> 22 #include <stddef.h> 23 #include <stdbool.h> 24 #include <sched.h> 25 #include <limits.h> 26 #include <assert.h> 27 28 #include <sys/capability.h> 29 30 #include <linux/unistd.h> 31 #include <linux/filter.h> 32 #include <linux/bpf_perf_event.h> 33 #include <linux/bpf.h> 34 #include <linux/if_ether.h> 35 36 #include <bpf/bpf.h> 37 38 #ifdef HAVE_GENHDR 39 # include "autoconf.h" 40 #else 41 # if defined(__i386) || defined(__x86_64) || defined(__s390x__) || defined(__aarch64__) 42 # define CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS 1 43 # endif 44 #endif 45 #include "bpf_rlimit.h" 46 #include "bpf_rand.h" 47 #include "bpf_util.h" 48 #include "../../../include/linux/filter.h" 49 50 #define MAX_INSNS BPF_MAXINSNS 51 #define MAX_FIXUPS 8 52 #define MAX_NR_MAPS 13 53 #define MAX_TEST_RUNS 8 54 #define POINTER_VALUE 0xcafe4all 55 #define TEST_DATA_LEN 64 56 57 #define F_NEEDS_EFFICIENT_UNALIGNED_ACCESS (1 << 0) 58 #define F_LOAD_WITH_STRICT_ALIGNMENT (1 << 1) 59 60 #define UNPRIV_SYSCTL "kernel/unprivileged_bpf_disabled" 61 static bool unpriv_disabled = false; 62 63 struct bpf_test { 64 const char *descr; 65 struct bpf_insn insns[MAX_INSNS]; 66 int fixup_map_hash_8b[MAX_FIXUPS]; 67 int fixup_map_hash_48b[MAX_FIXUPS]; 68 int fixup_map_hash_16b[MAX_FIXUPS]; 69 int fixup_map_array_48b[MAX_FIXUPS]; 70 int fixup_map_sockmap[MAX_FIXUPS]; 71 int fixup_map_sockhash[MAX_FIXUPS]; 72 int fixup_map_xskmap[MAX_FIXUPS]; 73 int fixup_map_stacktrace[MAX_FIXUPS]; 74 int fixup_prog1[MAX_FIXUPS]; 75 int fixup_prog2[MAX_FIXUPS]; 76 int fixup_map_in_map[MAX_FIXUPS]; 77 int fixup_cgroup_storage[MAX_FIXUPS]; 78 int fixup_percpu_cgroup_storage[MAX_FIXUPS]; 79 const char *errstr; 80 const char *errstr_unpriv; 81 uint32_t retval, retval_unpriv, insn_processed; 82 enum { 83 UNDEF, 84 ACCEPT, 85 REJECT 86 } result, result_unpriv; 87 enum bpf_prog_type prog_type; 88 uint8_t flags; 89 __u8 data[TEST_DATA_LEN]; 90 void (*fill_helper)(struct bpf_test *self); 91 uint8_t runs; 92 struct { 93 uint32_t retval, retval_unpriv; 94 union { 95 __u8 data[TEST_DATA_LEN]; 96 __u64 data64[TEST_DATA_LEN / 8]; 97 }; 98 } retvals[MAX_TEST_RUNS]; 99 }; 100 101 /* Note we want this to be 64 bit aligned so that the end of our array is 102 * actually the end of the structure. 103 */ 104 #define MAX_ENTRIES 11 105 106 struct test_val { 107 unsigned int index; 108 int foo[MAX_ENTRIES]; 109 }; 110 111 struct other_val { 112 long long foo; 113 long long bar; 114 }; 115 116 static void bpf_fill_ld_abs_vlan_push_pop(struct bpf_test *self) 117 { 118 /* test: {skb->data[0], vlan_push} x 68 + {skb->data[0], vlan_pop} x 68 */ 119 #define PUSH_CNT 51 120 unsigned int len = BPF_MAXINSNS; 121 struct bpf_insn *insn = self->insns; 122 int i = 0, j, k = 0; 123 124 insn[i++] = BPF_MOV64_REG(BPF_REG_6, BPF_REG_1); 125 loop: 126 for (j = 0; j < PUSH_CNT; j++) { 127 insn[i++] = BPF_LD_ABS(BPF_B, 0); 128 insn[i] = BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x34, len - i - 2); 129 i++; 130 insn[i++] = BPF_MOV64_REG(BPF_REG_1, BPF_REG_6); 131 insn[i++] = BPF_MOV64_IMM(BPF_REG_2, 1); 132 insn[i++] = BPF_MOV64_IMM(BPF_REG_3, 2); 133 insn[i++] = BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 134 BPF_FUNC_skb_vlan_push), 135 insn[i] = BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, len - i - 2); 136 i++; 137 } 138 139 for (j = 0; j < PUSH_CNT; j++) { 140 insn[i++] = BPF_LD_ABS(BPF_B, 0); 141 insn[i] = BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x34, len - i - 2); 142 i++; 143 insn[i++] = BPF_MOV64_REG(BPF_REG_1, BPF_REG_6); 144 insn[i++] = BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 145 BPF_FUNC_skb_vlan_pop), 146 insn[i] = BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, len - i - 2); 147 i++; 148 } 149 if (++k < 5) 150 goto loop; 151 152 for (; i < len - 1; i++) 153 insn[i] = BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 0xbef); 154 insn[len - 1] = BPF_EXIT_INSN(); 155 } 156 157 static void bpf_fill_jump_around_ld_abs(struct bpf_test *self) 158 { 159 struct bpf_insn *insn = self->insns; 160 unsigned int len = BPF_MAXINSNS; 161 int i = 0; 162 163 insn[i++] = BPF_MOV64_REG(BPF_REG_6, BPF_REG_1); 164 insn[i++] = BPF_LD_ABS(BPF_B, 0); 165 insn[i] = BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 10, len - i - 2); 166 i++; 167 while (i < len - 1) 168 insn[i++] = BPF_LD_ABS(BPF_B, 1); 169 insn[i] = BPF_EXIT_INSN(); 170 } 171 172 static void bpf_fill_rand_ld_dw(struct bpf_test *self) 173 { 174 struct bpf_insn *insn = self->insns; 175 uint64_t res = 0; 176 int i = 0; 177 178 insn[i++] = BPF_MOV32_IMM(BPF_REG_0, 0); 179 while (i < self->retval) { 180 uint64_t val = bpf_semi_rand_get(); 181 struct bpf_insn tmp[2] = { BPF_LD_IMM64(BPF_REG_1, val) }; 182 183 res ^= val; 184 insn[i++] = tmp[0]; 185 insn[i++] = tmp[1]; 186 insn[i++] = BPF_ALU64_REG(BPF_XOR, BPF_REG_0, BPF_REG_1); 187 } 188 insn[i++] = BPF_MOV64_REG(BPF_REG_1, BPF_REG_0); 189 insn[i++] = BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 32); 190 insn[i++] = BPF_ALU64_REG(BPF_XOR, BPF_REG_0, BPF_REG_1); 191 insn[i] = BPF_EXIT_INSN(); 192 res ^= (res >> 32); 193 self->retval = (uint32_t)res; 194 } 195 196 /* BPF_SK_LOOKUP contains 13 instructions, if you need to fix up maps */ 197 #define BPF_SK_LOOKUP \ 198 /* struct bpf_sock_tuple tuple = {} */ \ 199 BPF_MOV64_IMM(BPF_REG_2, 0), \ 200 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_2, -8), \ 201 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -16), \ 202 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -24), \ 203 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -32), \ 204 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -40), \ 205 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -48), \ 206 /* sk = sk_lookup_tcp(ctx, &tuple, sizeof tuple, 0, 0) */ \ 207 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), \ 208 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -48), \ 209 BPF_MOV64_IMM(BPF_REG_3, sizeof(struct bpf_sock_tuple)), \ 210 BPF_MOV64_IMM(BPF_REG_4, 0), \ 211 BPF_MOV64_IMM(BPF_REG_5, 0), \ 212 BPF_EMIT_CALL(BPF_FUNC_sk_lookup_tcp) 213 214 static struct bpf_test tests[] = { 215 { 216 "add+sub+mul", 217 .insns = { 218 BPF_MOV64_IMM(BPF_REG_1, 1), 219 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 2), 220 BPF_MOV64_IMM(BPF_REG_2, 3), 221 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_2), 222 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -1), 223 BPF_ALU64_IMM(BPF_MUL, BPF_REG_1, 3), 224 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 225 BPF_EXIT_INSN(), 226 }, 227 .result = ACCEPT, 228 .retval = -3, 229 }, 230 { 231 "DIV32 by 0, zero check 1", 232 .insns = { 233 BPF_MOV32_IMM(BPF_REG_0, 42), 234 BPF_MOV32_IMM(BPF_REG_1, 0), 235 BPF_MOV32_IMM(BPF_REG_2, 1), 236 BPF_ALU32_REG(BPF_DIV, BPF_REG_2, BPF_REG_1), 237 BPF_EXIT_INSN(), 238 }, 239 .result = ACCEPT, 240 .retval = 42, 241 }, 242 { 243 "DIV32 by 0, zero check 2", 244 .insns = { 245 BPF_MOV32_IMM(BPF_REG_0, 42), 246 BPF_LD_IMM64(BPF_REG_1, 0xffffffff00000000LL), 247 BPF_MOV32_IMM(BPF_REG_2, 1), 248 BPF_ALU32_REG(BPF_DIV, BPF_REG_2, BPF_REG_1), 249 BPF_EXIT_INSN(), 250 }, 251 .result = ACCEPT, 252 .retval = 42, 253 }, 254 { 255 "DIV64 by 0, zero check", 256 .insns = { 257 BPF_MOV32_IMM(BPF_REG_0, 42), 258 BPF_MOV32_IMM(BPF_REG_1, 0), 259 BPF_MOV32_IMM(BPF_REG_2, 1), 260 BPF_ALU64_REG(BPF_DIV, BPF_REG_2, BPF_REG_1), 261 BPF_EXIT_INSN(), 262 }, 263 .result = ACCEPT, 264 .retval = 42, 265 }, 266 { 267 "MOD32 by 0, zero check 1", 268 .insns = { 269 BPF_MOV32_IMM(BPF_REG_0, 42), 270 BPF_MOV32_IMM(BPF_REG_1, 0), 271 BPF_MOV32_IMM(BPF_REG_2, 1), 272 BPF_ALU32_REG(BPF_MOD, BPF_REG_2, BPF_REG_1), 273 BPF_EXIT_INSN(), 274 }, 275 .result = ACCEPT, 276 .retval = 42, 277 }, 278 { 279 "MOD32 by 0, zero check 2", 280 .insns = { 281 BPF_MOV32_IMM(BPF_REG_0, 42), 282 BPF_LD_IMM64(BPF_REG_1, 0xffffffff00000000LL), 283 BPF_MOV32_IMM(BPF_REG_2, 1), 284 BPF_ALU32_REG(BPF_MOD, BPF_REG_2, BPF_REG_1), 285 BPF_EXIT_INSN(), 286 }, 287 .result = ACCEPT, 288 .retval = 42, 289 }, 290 { 291 "MOD64 by 0, zero check", 292 .insns = { 293 BPF_MOV32_IMM(BPF_REG_0, 42), 294 BPF_MOV32_IMM(BPF_REG_1, 0), 295 BPF_MOV32_IMM(BPF_REG_2, 1), 296 BPF_ALU64_REG(BPF_MOD, BPF_REG_2, BPF_REG_1), 297 BPF_EXIT_INSN(), 298 }, 299 .result = ACCEPT, 300 .retval = 42, 301 }, 302 { 303 "DIV32 by 0, zero check ok, cls", 304 .insns = { 305 BPF_MOV32_IMM(BPF_REG_0, 42), 306 BPF_MOV32_IMM(BPF_REG_1, 2), 307 BPF_MOV32_IMM(BPF_REG_2, 16), 308 BPF_ALU32_REG(BPF_DIV, BPF_REG_2, BPF_REG_1), 309 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 310 BPF_EXIT_INSN(), 311 }, 312 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 313 .result = ACCEPT, 314 .retval = 8, 315 }, 316 { 317 "DIV32 by 0, zero check 1, cls", 318 .insns = { 319 BPF_MOV32_IMM(BPF_REG_1, 0), 320 BPF_MOV32_IMM(BPF_REG_0, 1), 321 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_1), 322 BPF_EXIT_INSN(), 323 }, 324 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 325 .result = ACCEPT, 326 .retval = 0, 327 }, 328 { 329 "DIV32 by 0, zero check 2, cls", 330 .insns = { 331 BPF_LD_IMM64(BPF_REG_1, 0xffffffff00000000LL), 332 BPF_MOV32_IMM(BPF_REG_0, 1), 333 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_1), 334 BPF_EXIT_INSN(), 335 }, 336 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 337 .result = ACCEPT, 338 .retval = 0, 339 }, 340 { 341 "DIV64 by 0, zero check, cls", 342 .insns = { 343 BPF_MOV32_IMM(BPF_REG_1, 0), 344 BPF_MOV32_IMM(BPF_REG_0, 1), 345 BPF_ALU64_REG(BPF_DIV, BPF_REG_0, BPF_REG_1), 346 BPF_EXIT_INSN(), 347 }, 348 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 349 .result = ACCEPT, 350 .retval = 0, 351 }, 352 { 353 "MOD32 by 0, zero check ok, cls", 354 .insns = { 355 BPF_MOV32_IMM(BPF_REG_0, 42), 356 BPF_MOV32_IMM(BPF_REG_1, 3), 357 BPF_MOV32_IMM(BPF_REG_2, 5), 358 BPF_ALU32_REG(BPF_MOD, BPF_REG_2, BPF_REG_1), 359 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 360 BPF_EXIT_INSN(), 361 }, 362 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 363 .result = ACCEPT, 364 .retval = 2, 365 }, 366 { 367 "MOD32 by 0, zero check 1, cls", 368 .insns = { 369 BPF_MOV32_IMM(BPF_REG_1, 0), 370 BPF_MOV32_IMM(BPF_REG_0, 1), 371 BPF_ALU32_REG(BPF_MOD, BPF_REG_0, BPF_REG_1), 372 BPF_EXIT_INSN(), 373 }, 374 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 375 .result = ACCEPT, 376 .retval = 1, 377 }, 378 { 379 "MOD32 by 0, zero check 2, cls", 380 .insns = { 381 BPF_LD_IMM64(BPF_REG_1, 0xffffffff00000000LL), 382 BPF_MOV32_IMM(BPF_REG_0, 1), 383 BPF_ALU32_REG(BPF_MOD, BPF_REG_0, BPF_REG_1), 384 BPF_EXIT_INSN(), 385 }, 386 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 387 .result = ACCEPT, 388 .retval = 1, 389 }, 390 { 391 "MOD64 by 0, zero check 1, cls", 392 .insns = { 393 BPF_MOV32_IMM(BPF_REG_1, 0), 394 BPF_MOV32_IMM(BPF_REG_0, 2), 395 BPF_ALU64_REG(BPF_MOD, BPF_REG_0, BPF_REG_1), 396 BPF_EXIT_INSN(), 397 }, 398 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 399 .result = ACCEPT, 400 .retval = 2, 401 }, 402 { 403 "MOD64 by 0, zero check 2, cls", 404 .insns = { 405 BPF_MOV32_IMM(BPF_REG_1, 0), 406 BPF_MOV32_IMM(BPF_REG_0, -1), 407 BPF_ALU64_REG(BPF_MOD, BPF_REG_0, BPF_REG_1), 408 BPF_EXIT_INSN(), 409 }, 410 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 411 .result = ACCEPT, 412 .retval = -1, 413 }, 414 /* Just make sure that JITs used udiv/umod as otherwise we get 415 * an exception from INT_MIN/-1 overflow similarly as with div 416 * by zero. 417 */ 418 { 419 "DIV32 overflow, check 1", 420 .insns = { 421 BPF_MOV32_IMM(BPF_REG_1, -1), 422 BPF_MOV32_IMM(BPF_REG_0, INT_MIN), 423 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_1), 424 BPF_EXIT_INSN(), 425 }, 426 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 427 .result = ACCEPT, 428 .retval = 0, 429 }, 430 { 431 "DIV32 overflow, check 2", 432 .insns = { 433 BPF_MOV32_IMM(BPF_REG_0, INT_MIN), 434 BPF_ALU32_IMM(BPF_DIV, BPF_REG_0, -1), 435 BPF_EXIT_INSN(), 436 }, 437 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 438 .result = ACCEPT, 439 .retval = 0, 440 }, 441 { 442 "DIV64 overflow, check 1", 443 .insns = { 444 BPF_MOV64_IMM(BPF_REG_1, -1), 445 BPF_LD_IMM64(BPF_REG_0, LLONG_MIN), 446 BPF_ALU64_REG(BPF_DIV, BPF_REG_0, BPF_REG_1), 447 BPF_EXIT_INSN(), 448 }, 449 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 450 .result = ACCEPT, 451 .retval = 0, 452 }, 453 { 454 "DIV64 overflow, check 2", 455 .insns = { 456 BPF_LD_IMM64(BPF_REG_0, LLONG_MIN), 457 BPF_ALU64_IMM(BPF_DIV, BPF_REG_0, -1), 458 BPF_EXIT_INSN(), 459 }, 460 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 461 .result = ACCEPT, 462 .retval = 0, 463 }, 464 { 465 "MOD32 overflow, check 1", 466 .insns = { 467 BPF_MOV32_IMM(BPF_REG_1, -1), 468 BPF_MOV32_IMM(BPF_REG_0, INT_MIN), 469 BPF_ALU32_REG(BPF_MOD, BPF_REG_0, BPF_REG_1), 470 BPF_EXIT_INSN(), 471 }, 472 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 473 .result = ACCEPT, 474 .retval = INT_MIN, 475 }, 476 { 477 "MOD32 overflow, check 2", 478 .insns = { 479 BPF_MOV32_IMM(BPF_REG_0, INT_MIN), 480 BPF_ALU32_IMM(BPF_MOD, BPF_REG_0, -1), 481 BPF_EXIT_INSN(), 482 }, 483 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 484 .result = ACCEPT, 485 .retval = INT_MIN, 486 }, 487 { 488 "MOD64 overflow, check 1", 489 .insns = { 490 BPF_MOV64_IMM(BPF_REG_1, -1), 491 BPF_LD_IMM64(BPF_REG_2, LLONG_MIN), 492 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 493 BPF_ALU64_REG(BPF_MOD, BPF_REG_2, BPF_REG_1), 494 BPF_MOV32_IMM(BPF_REG_0, 0), 495 BPF_JMP_REG(BPF_JNE, BPF_REG_3, BPF_REG_2, 1), 496 BPF_MOV32_IMM(BPF_REG_0, 1), 497 BPF_EXIT_INSN(), 498 }, 499 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 500 .result = ACCEPT, 501 .retval = 1, 502 }, 503 { 504 "MOD64 overflow, check 2", 505 .insns = { 506 BPF_LD_IMM64(BPF_REG_2, LLONG_MIN), 507 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 508 BPF_ALU64_IMM(BPF_MOD, BPF_REG_2, -1), 509 BPF_MOV32_IMM(BPF_REG_0, 0), 510 BPF_JMP_REG(BPF_JNE, BPF_REG_3, BPF_REG_2, 1), 511 BPF_MOV32_IMM(BPF_REG_0, 1), 512 BPF_EXIT_INSN(), 513 }, 514 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 515 .result = ACCEPT, 516 .retval = 1, 517 }, 518 { 519 "xor32 zero extend check", 520 .insns = { 521 BPF_MOV32_IMM(BPF_REG_2, -1), 522 BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 32), 523 BPF_ALU64_IMM(BPF_OR, BPF_REG_2, 0xffff), 524 BPF_ALU32_REG(BPF_XOR, BPF_REG_2, BPF_REG_2), 525 BPF_MOV32_IMM(BPF_REG_0, 2), 526 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0, 1), 527 BPF_MOV32_IMM(BPF_REG_0, 1), 528 BPF_EXIT_INSN(), 529 }, 530 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 531 .result = ACCEPT, 532 .retval = 1, 533 }, 534 { 535 "empty prog", 536 .insns = { 537 }, 538 .errstr = "unknown opcode 00", 539 .result = REJECT, 540 }, 541 { 542 "only exit insn", 543 .insns = { 544 BPF_EXIT_INSN(), 545 }, 546 .errstr = "R0 !read_ok", 547 .result = REJECT, 548 }, 549 { 550 "unreachable", 551 .insns = { 552 BPF_EXIT_INSN(), 553 BPF_EXIT_INSN(), 554 }, 555 .errstr = "unreachable", 556 .result = REJECT, 557 }, 558 { 559 "unreachable2", 560 .insns = { 561 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 562 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 563 BPF_EXIT_INSN(), 564 }, 565 .errstr = "unreachable", 566 .result = REJECT, 567 }, 568 { 569 "out of range jump", 570 .insns = { 571 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 572 BPF_EXIT_INSN(), 573 }, 574 .errstr = "jump out of range", 575 .result = REJECT, 576 }, 577 { 578 "out of range jump2", 579 .insns = { 580 BPF_JMP_IMM(BPF_JA, 0, 0, -2), 581 BPF_EXIT_INSN(), 582 }, 583 .errstr = "jump out of range", 584 .result = REJECT, 585 }, 586 { 587 "test1 ld_imm64", 588 .insns = { 589 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 590 BPF_LD_IMM64(BPF_REG_0, 0), 591 BPF_LD_IMM64(BPF_REG_0, 0), 592 BPF_LD_IMM64(BPF_REG_0, 1), 593 BPF_LD_IMM64(BPF_REG_0, 1), 594 BPF_MOV64_IMM(BPF_REG_0, 2), 595 BPF_EXIT_INSN(), 596 }, 597 .errstr = "invalid BPF_LD_IMM insn", 598 .errstr_unpriv = "R1 pointer comparison", 599 .result = REJECT, 600 }, 601 { 602 "test2 ld_imm64", 603 .insns = { 604 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 605 BPF_LD_IMM64(BPF_REG_0, 0), 606 BPF_LD_IMM64(BPF_REG_0, 0), 607 BPF_LD_IMM64(BPF_REG_0, 1), 608 BPF_LD_IMM64(BPF_REG_0, 1), 609 BPF_EXIT_INSN(), 610 }, 611 .errstr = "invalid BPF_LD_IMM insn", 612 .errstr_unpriv = "R1 pointer comparison", 613 .result = REJECT, 614 }, 615 { 616 "test3 ld_imm64", 617 .insns = { 618 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 619 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0), 620 BPF_LD_IMM64(BPF_REG_0, 0), 621 BPF_LD_IMM64(BPF_REG_0, 0), 622 BPF_LD_IMM64(BPF_REG_0, 1), 623 BPF_LD_IMM64(BPF_REG_0, 1), 624 BPF_EXIT_INSN(), 625 }, 626 .errstr = "invalid bpf_ld_imm64 insn", 627 .result = REJECT, 628 }, 629 { 630 "test4 ld_imm64", 631 .insns = { 632 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0), 633 BPF_EXIT_INSN(), 634 }, 635 .errstr = "invalid bpf_ld_imm64 insn", 636 .result = REJECT, 637 }, 638 { 639 "test5 ld_imm64", 640 .insns = { 641 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0), 642 }, 643 .errstr = "invalid bpf_ld_imm64 insn", 644 .result = REJECT, 645 }, 646 { 647 "test6 ld_imm64", 648 .insns = { 649 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0), 650 BPF_RAW_INSN(0, 0, 0, 0, 0), 651 BPF_EXIT_INSN(), 652 }, 653 .result = ACCEPT, 654 }, 655 { 656 "test7 ld_imm64", 657 .insns = { 658 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 1), 659 BPF_RAW_INSN(0, 0, 0, 0, 1), 660 BPF_EXIT_INSN(), 661 }, 662 .result = ACCEPT, 663 .retval = 1, 664 }, 665 { 666 "test8 ld_imm64", 667 .insns = { 668 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 1, 1), 669 BPF_RAW_INSN(0, 0, 0, 0, 1), 670 BPF_EXIT_INSN(), 671 }, 672 .errstr = "uses reserved fields", 673 .result = REJECT, 674 }, 675 { 676 "test9 ld_imm64", 677 .insns = { 678 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 1), 679 BPF_RAW_INSN(0, 0, 0, 1, 1), 680 BPF_EXIT_INSN(), 681 }, 682 .errstr = "invalid bpf_ld_imm64 insn", 683 .result = REJECT, 684 }, 685 { 686 "test10 ld_imm64", 687 .insns = { 688 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 1), 689 BPF_RAW_INSN(0, BPF_REG_1, 0, 0, 1), 690 BPF_EXIT_INSN(), 691 }, 692 .errstr = "invalid bpf_ld_imm64 insn", 693 .result = REJECT, 694 }, 695 { 696 "test11 ld_imm64", 697 .insns = { 698 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 1), 699 BPF_RAW_INSN(0, 0, BPF_REG_1, 0, 1), 700 BPF_EXIT_INSN(), 701 }, 702 .errstr = "invalid bpf_ld_imm64 insn", 703 .result = REJECT, 704 }, 705 { 706 "test12 ld_imm64", 707 .insns = { 708 BPF_MOV64_IMM(BPF_REG_1, 0), 709 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, BPF_REG_1, 0, 1), 710 BPF_RAW_INSN(0, 0, 0, 0, 1), 711 BPF_EXIT_INSN(), 712 }, 713 .errstr = "not pointing to valid bpf_map", 714 .result = REJECT, 715 }, 716 { 717 "test13 ld_imm64", 718 .insns = { 719 BPF_MOV64_IMM(BPF_REG_1, 0), 720 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, BPF_REG_1, 0, 1), 721 BPF_RAW_INSN(0, 0, BPF_REG_1, 0, 1), 722 BPF_EXIT_INSN(), 723 }, 724 .errstr = "invalid bpf_ld_imm64 insn", 725 .result = REJECT, 726 }, 727 { 728 "arsh32 on imm", 729 .insns = { 730 BPF_MOV64_IMM(BPF_REG_0, 1), 731 BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 5), 732 BPF_EXIT_INSN(), 733 }, 734 .result = ACCEPT, 735 .retval = 0, 736 }, 737 { 738 "arsh32 on imm 2", 739 .insns = { 740 BPF_LD_IMM64(BPF_REG_0, 0x1122334485667788), 741 BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 7), 742 BPF_EXIT_INSN(), 743 }, 744 .result = ACCEPT, 745 .retval = -16069393, 746 }, 747 { 748 "arsh32 on reg", 749 .insns = { 750 BPF_MOV64_IMM(BPF_REG_0, 1), 751 BPF_MOV64_IMM(BPF_REG_1, 5), 752 BPF_ALU32_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1), 753 BPF_EXIT_INSN(), 754 }, 755 .result = ACCEPT, 756 .retval = 0, 757 }, 758 { 759 "arsh32 on reg 2", 760 .insns = { 761 BPF_LD_IMM64(BPF_REG_0, 0xffff55667788), 762 BPF_MOV64_IMM(BPF_REG_1, 15), 763 BPF_ALU32_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1), 764 BPF_EXIT_INSN(), 765 }, 766 .result = ACCEPT, 767 .retval = 43724, 768 }, 769 { 770 "arsh64 on imm", 771 .insns = { 772 BPF_MOV64_IMM(BPF_REG_0, 1), 773 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_0, 5), 774 BPF_EXIT_INSN(), 775 }, 776 .result = ACCEPT, 777 }, 778 { 779 "arsh64 on reg", 780 .insns = { 781 BPF_MOV64_IMM(BPF_REG_0, 1), 782 BPF_MOV64_IMM(BPF_REG_1, 5), 783 BPF_ALU64_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1), 784 BPF_EXIT_INSN(), 785 }, 786 .result = ACCEPT, 787 }, 788 { 789 "no bpf_exit", 790 .insns = { 791 BPF_ALU64_REG(BPF_MOV, BPF_REG_0, BPF_REG_2), 792 }, 793 .errstr = "not an exit", 794 .result = REJECT, 795 }, 796 { 797 "loop (back-edge)", 798 .insns = { 799 BPF_JMP_IMM(BPF_JA, 0, 0, -1), 800 BPF_EXIT_INSN(), 801 }, 802 .errstr = "back-edge", 803 .result = REJECT, 804 }, 805 { 806 "loop2 (back-edge)", 807 .insns = { 808 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 809 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 810 BPF_MOV64_REG(BPF_REG_3, BPF_REG_0), 811 BPF_JMP_IMM(BPF_JA, 0, 0, -4), 812 BPF_EXIT_INSN(), 813 }, 814 .errstr = "back-edge", 815 .result = REJECT, 816 }, 817 { 818 "conditional loop", 819 .insns = { 820 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 821 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 822 BPF_MOV64_REG(BPF_REG_3, BPF_REG_0), 823 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, -3), 824 BPF_EXIT_INSN(), 825 }, 826 .errstr = "back-edge", 827 .result = REJECT, 828 }, 829 { 830 "read uninitialized register", 831 .insns = { 832 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 833 BPF_EXIT_INSN(), 834 }, 835 .errstr = "R2 !read_ok", 836 .result = REJECT, 837 }, 838 { 839 "read invalid register", 840 .insns = { 841 BPF_MOV64_REG(BPF_REG_0, -1), 842 BPF_EXIT_INSN(), 843 }, 844 .errstr = "R15 is invalid", 845 .result = REJECT, 846 }, 847 { 848 "program doesn't init R0 before exit", 849 .insns = { 850 BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1), 851 BPF_EXIT_INSN(), 852 }, 853 .errstr = "R0 !read_ok", 854 .result = REJECT, 855 }, 856 { 857 "program doesn't init R0 before exit in all branches", 858 .insns = { 859 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 860 BPF_MOV64_IMM(BPF_REG_0, 1), 861 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 2), 862 BPF_EXIT_INSN(), 863 }, 864 .errstr = "R0 !read_ok", 865 .errstr_unpriv = "R1 pointer comparison", 866 .result = REJECT, 867 }, 868 { 869 "stack out of bounds", 870 .insns = { 871 BPF_ST_MEM(BPF_DW, BPF_REG_10, 8, 0), 872 BPF_EXIT_INSN(), 873 }, 874 .errstr = "invalid stack", 875 .result = REJECT, 876 }, 877 { 878 "invalid call insn1", 879 .insns = { 880 BPF_RAW_INSN(BPF_JMP | BPF_CALL | BPF_X, 0, 0, 0, 0), 881 BPF_EXIT_INSN(), 882 }, 883 .errstr = "unknown opcode 8d", 884 .result = REJECT, 885 }, 886 { 887 "invalid call insn2", 888 .insns = { 889 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 1, 0), 890 BPF_EXIT_INSN(), 891 }, 892 .errstr = "BPF_CALL uses reserved", 893 .result = REJECT, 894 }, 895 { 896 "invalid function call", 897 .insns = { 898 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1234567), 899 BPF_EXIT_INSN(), 900 }, 901 .errstr = "invalid func unknown#1234567", 902 .result = REJECT, 903 }, 904 { 905 "uninitialized stack1", 906 .insns = { 907 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 908 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 909 BPF_LD_MAP_FD(BPF_REG_1, 0), 910 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 911 BPF_FUNC_map_lookup_elem), 912 BPF_EXIT_INSN(), 913 }, 914 .fixup_map_hash_8b = { 2 }, 915 .errstr = "invalid indirect read from stack", 916 .result = REJECT, 917 }, 918 { 919 "uninitialized stack2", 920 .insns = { 921 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 922 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, -8), 923 BPF_EXIT_INSN(), 924 }, 925 .errstr = "invalid read from stack", 926 .result = REJECT, 927 }, 928 { 929 "invalid fp arithmetic", 930 /* If this gets ever changed, make sure JITs can deal with it. */ 931 .insns = { 932 BPF_MOV64_IMM(BPF_REG_0, 0), 933 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 934 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 8), 935 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), 936 BPF_EXIT_INSN(), 937 }, 938 .errstr = "R1 subtraction from stack pointer", 939 .result = REJECT, 940 }, 941 { 942 "non-invalid fp arithmetic", 943 .insns = { 944 BPF_MOV64_IMM(BPF_REG_0, 0), 945 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 946 BPF_EXIT_INSN(), 947 }, 948 .result = ACCEPT, 949 }, 950 { 951 "invalid argument register", 952 .insns = { 953 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 954 BPF_FUNC_get_cgroup_classid), 955 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 956 BPF_FUNC_get_cgroup_classid), 957 BPF_EXIT_INSN(), 958 }, 959 .errstr = "R1 !read_ok", 960 .result = REJECT, 961 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 962 }, 963 { 964 "non-invalid argument register", 965 .insns = { 966 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 967 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 968 BPF_FUNC_get_cgroup_classid), 969 BPF_ALU64_REG(BPF_MOV, BPF_REG_1, BPF_REG_6), 970 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 971 BPF_FUNC_get_cgroup_classid), 972 BPF_EXIT_INSN(), 973 }, 974 .result = ACCEPT, 975 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 976 }, 977 { 978 "check valid spill/fill", 979 .insns = { 980 /* spill R1(ctx) into stack */ 981 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 982 /* fill it back into R2 */ 983 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -8), 984 /* should be able to access R0 = *(R2 + 8) */ 985 /* BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, 8), */ 986 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 987 BPF_EXIT_INSN(), 988 }, 989 .errstr_unpriv = "R0 leaks addr", 990 .result = ACCEPT, 991 .result_unpriv = REJECT, 992 .retval = POINTER_VALUE, 993 }, 994 { 995 "check valid spill/fill, skb mark", 996 .insns = { 997 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 998 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_6, -8), 999 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 1000 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 1001 offsetof(struct __sk_buff, mark)), 1002 BPF_EXIT_INSN(), 1003 }, 1004 .result = ACCEPT, 1005 .result_unpriv = ACCEPT, 1006 }, 1007 { 1008 "check corrupted spill/fill", 1009 .insns = { 1010 /* spill R1(ctx) into stack */ 1011 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 1012 /* mess up with R1 pointer on stack */ 1013 BPF_ST_MEM(BPF_B, BPF_REG_10, -7, 0x23), 1014 /* fill back into R0 is fine for priv. 1015 * R0 now becomes SCALAR_VALUE. 1016 */ 1017 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 1018 /* Load from R0 should fail. */ 1019 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 8), 1020 BPF_EXIT_INSN(), 1021 }, 1022 .errstr_unpriv = "attempt to corrupt spilled", 1023 .errstr = "R0 invalid mem access 'inv", 1024 .result = REJECT, 1025 }, 1026 { 1027 "check corrupted spill/fill, LSB", 1028 .insns = { 1029 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 1030 BPF_ST_MEM(BPF_H, BPF_REG_10, -8, 0xcafe), 1031 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 1032 BPF_EXIT_INSN(), 1033 }, 1034 .errstr_unpriv = "attempt to corrupt spilled", 1035 .result_unpriv = REJECT, 1036 .result = ACCEPT, 1037 .retval = POINTER_VALUE, 1038 }, 1039 { 1040 "check corrupted spill/fill, MSB", 1041 .insns = { 1042 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 1043 BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0x12345678), 1044 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 1045 BPF_EXIT_INSN(), 1046 }, 1047 .errstr_unpriv = "attempt to corrupt spilled", 1048 .result_unpriv = REJECT, 1049 .result = ACCEPT, 1050 .retval = POINTER_VALUE, 1051 }, 1052 { 1053 "invalid src register in STX", 1054 .insns = { 1055 BPF_STX_MEM(BPF_B, BPF_REG_10, -1, -1), 1056 BPF_EXIT_INSN(), 1057 }, 1058 .errstr = "R15 is invalid", 1059 .result = REJECT, 1060 }, 1061 { 1062 "invalid dst register in STX", 1063 .insns = { 1064 BPF_STX_MEM(BPF_B, 14, BPF_REG_10, -1), 1065 BPF_EXIT_INSN(), 1066 }, 1067 .errstr = "R14 is invalid", 1068 .result = REJECT, 1069 }, 1070 { 1071 "invalid dst register in ST", 1072 .insns = { 1073 BPF_ST_MEM(BPF_B, 14, -1, -1), 1074 BPF_EXIT_INSN(), 1075 }, 1076 .errstr = "R14 is invalid", 1077 .result = REJECT, 1078 }, 1079 { 1080 "invalid src register in LDX", 1081 .insns = { 1082 BPF_LDX_MEM(BPF_B, BPF_REG_0, 12, 0), 1083 BPF_EXIT_INSN(), 1084 }, 1085 .errstr = "R12 is invalid", 1086 .result = REJECT, 1087 }, 1088 { 1089 "invalid dst register in LDX", 1090 .insns = { 1091 BPF_LDX_MEM(BPF_B, 11, BPF_REG_1, 0), 1092 BPF_EXIT_INSN(), 1093 }, 1094 .errstr = "R11 is invalid", 1095 .result = REJECT, 1096 }, 1097 { 1098 "junk insn", 1099 .insns = { 1100 BPF_RAW_INSN(0, 0, 0, 0, 0), 1101 BPF_EXIT_INSN(), 1102 }, 1103 .errstr = "unknown opcode 00", 1104 .result = REJECT, 1105 }, 1106 { 1107 "junk insn2", 1108 .insns = { 1109 BPF_RAW_INSN(1, 0, 0, 0, 0), 1110 BPF_EXIT_INSN(), 1111 }, 1112 .errstr = "BPF_LDX uses reserved fields", 1113 .result = REJECT, 1114 }, 1115 { 1116 "junk insn3", 1117 .insns = { 1118 BPF_RAW_INSN(-1, 0, 0, 0, 0), 1119 BPF_EXIT_INSN(), 1120 }, 1121 .errstr = "unknown opcode ff", 1122 .result = REJECT, 1123 }, 1124 { 1125 "junk insn4", 1126 .insns = { 1127 BPF_RAW_INSN(-1, -1, -1, -1, -1), 1128 BPF_EXIT_INSN(), 1129 }, 1130 .errstr = "unknown opcode ff", 1131 .result = REJECT, 1132 }, 1133 { 1134 "junk insn5", 1135 .insns = { 1136 BPF_RAW_INSN(0x7f, -1, -1, -1, -1), 1137 BPF_EXIT_INSN(), 1138 }, 1139 .errstr = "BPF_ALU uses reserved fields", 1140 .result = REJECT, 1141 }, 1142 { 1143 "misaligned read from stack", 1144 .insns = { 1145 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1146 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, -4), 1147 BPF_EXIT_INSN(), 1148 }, 1149 .errstr = "misaligned stack access", 1150 .result = REJECT, 1151 }, 1152 { 1153 "invalid map_fd for function call", 1154 .insns = { 1155 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1156 BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_10), 1157 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1158 BPF_LD_MAP_FD(BPF_REG_1, 0), 1159 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1160 BPF_FUNC_map_delete_elem), 1161 BPF_EXIT_INSN(), 1162 }, 1163 .errstr = "fd 0 is not pointing to valid bpf_map", 1164 .result = REJECT, 1165 }, 1166 { 1167 "don't check return value before access", 1168 .insns = { 1169 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1170 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1171 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1172 BPF_LD_MAP_FD(BPF_REG_1, 0), 1173 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1174 BPF_FUNC_map_lookup_elem), 1175 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 1176 BPF_EXIT_INSN(), 1177 }, 1178 .fixup_map_hash_8b = { 3 }, 1179 .errstr = "R0 invalid mem access 'map_value_or_null'", 1180 .result = REJECT, 1181 }, 1182 { 1183 "access memory with incorrect alignment", 1184 .insns = { 1185 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1186 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1187 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1188 BPF_LD_MAP_FD(BPF_REG_1, 0), 1189 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1190 BPF_FUNC_map_lookup_elem), 1191 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 1192 BPF_ST_MEM(BPF_DW, BPF_REG_0, 4, 0), 1193 BPF_EXIT_INSN(), 1194 }, 1195 .fixup_map_hash_8b = { 3 }, 1196 .errstr = "misaligned value access", 1197 .result = REJECT, 1198 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 1199 }, 1200 { 1201 "sometimes access memory with incorrect alignment", 1202 .insns = { 1203 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1204 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1205 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1206 BPF_LD_MAP_FD(BPF_REG_1, 0), 1207 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1208 BPF_FUNC_map_lookup_elem), 1209 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 1210 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 1211 BPF_EXIT_INSN(), 1212 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 1), 1213 BPF_EXIT_INSN(), 1214 }, 1215 .fixup_map_hash_8b = { 3 }, 1216 .errstr = "R0 invalid mem access", 1217 .errstr_unpriv = "R0 leaks addr", 1218 .result = REJECT, 1219 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 1220 }, 1221 { 1222 "jump test 1", 1223 .insns = { 1224 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1225 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -8), 1226 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 1227 BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 0), 1228 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 1), 1229 BPF_ST_MEM(BPF_DW, BPF_REG_2, -16, 1), 1230 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 2, 1), 1231 BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 2), 1232 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 3, 1), 1233 BPF_ST_MEM(BPF_DW, BPF_REG_2, -16, 3), 1234 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 4, 1), 1235 BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 4), 1236 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 5, 1), 1237 BPF_ST_MEM(BPF_DW, BPF_REG_2, -32, 5), 1238 BPF_MOV64_IMM(BPF_REG_0, 0), 1239 BPF_EXIT_INSN(), 1240 }, 1241 .errstr_unpriv = "R1 pointer comparison", 1242 .result_unpriv = REJECT, 1243 .result = ACCEPT, 1244 }, 1245 { 1246 "jump test 2", 1247 .insns = { 1248 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1249 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 2), 1250 BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 0), 1251 BPF_JMP_IMM(BPF_JA, 0, 0, 14), 1252 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 2), 1253 BPF_ST_MEM(BPF_DW, BPF_REG_2, -16, 0), 1254 BPF_JMP_IMM(BPF_JA, 0, 0, 11), 1255 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 2, 2), 1256 BPF_ST_MEM(BPF_DW, BPF_REG_2, -32, 0), 1257 BPF_JMP_IMM(BPF_JA, 0, 0, 8), 1258 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 3, 2), 1259 BPF_ST_MEM(BPF_DW, BPF_REG_2, -40, 0), 1260 BPF_JMP_IMM(BPF_JA, 0, 0, 5), 1261 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 4, 2), 1262 BPF_ST_MEM(BPF_DW, BPF_REG_2, -48, 0), 1263 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 1264 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 5, 1), 1265 BPF_ST_MEM(BPF_DW, BPF_REG_2, -56, 0), 1266 BPF_MOV64_IMM(BPF_REG_0, 0), 1267 BPF_EXIT_INSN(), 1268 }, 1269 .errstr_unpriv = "R1 pointer comparison", 1270 .result_unpriv = REJECT, 1271 .result = ACCEPT, 1272 }, 1273 { 1274 "jump test 3", 1275 .insns = { 1276 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1277 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3), 1278 BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 0), 1279 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1280 BPF_JMP_IMM(BPF_JA, 0, 0, 19), 1281 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 3), 1282 BPF_ST_MEM(BPF_DW, BPF_REG_2, -16, 0), 1283 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 1284 BPF_JMP_IMM(BPF_JA, 0, 0, 15), 1285 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 2, 3), 1286 BPF_ST_MEM(BPF_DW, BPF_REG_2, -32, 0), 1287 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -32), 1288 BPF_JMP_IMM(BPF_JA, 0, 0, 11), 1289 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 3, 3), 1290 BPF_ST_MEM(BPF_DW, BPF_REG_2, -40, 0), 1291 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -40), 1292 BPF_JMP_IMM(BPF_JA, 0, 0, 7), 1293 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 4, 3), 1294 BPF_ST_MEM(BPF_DW, BPF_REG_2, -48, 0), 1295 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -48), 1296 BPF_JMP_IMM(BPF_JA, 0, 0, 3), 1297 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 5, 0), 1298 BPF_ST_MEM(BPF_DW, BPF_REG_2, -56, 0), 1299 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -56), 1300 BPF_LD_MAP_FD(BPF_REG_1, 0), 1301 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1302 BPF_FUNC_map_delete_elem), 1303 BPF_EXIT_INSN(), 1304 }, 1305 .fixup_map_hash_8b = { 24 }, 1306 .errstr_unpriv = "R1 pointer comparison", 1307 .result_unpriv = REJECT, 1308 .result = ACCEPT, 1309 .retval = -ENOENT, 1310 }, 1311 { 1312 "jump test 4", 1313 .insns = { 1314 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1315 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1316 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1317 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1318 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1319 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1320 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1321 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1322 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1323 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1324 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1325 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1326 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1327 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1328 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1329 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1330 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1331 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1332 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1333 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1334 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1335 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1336 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1337 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1338 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1339 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1340 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1341 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1342 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1343 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1344 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1345 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1346 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1347 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1348 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1349 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1350 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0), 1351 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0), 1352 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0), 1353 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0), 1354 BPF_MOV64_IMM(BPF_REG_0, 0), 1355 BPF_EXIT_INSN(), 1356 }, 1357 .errstr_unpriv = "R1 pointer comparison", 1358 .result_unpriv = REJECT, 1359 .result = ACCEPT, 1360 }, 1361 { 1362 "jump test 5", 1363 .insns = { 1364 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1365 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 1366 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 1367 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8), 1368 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 1369 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8), 1370 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 1371 BPF_MOV64_IMM(BPF_REG_0, 0), 1372 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 1373 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8), 1374 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 1375 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8), 1376 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 1377 BPF_MOV64_IMM(BPF_REG_0, 0), 1378 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 1379 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8), 1380 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 1381 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8), 1382 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 1383 BPF_MOV64_IMM(BPF_REG_0, 0), 1384 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 1385 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8), 1386 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 1387 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8), 1388 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 1389 BPF_MOV64_IMM(BPF_REG_0, 0), 1390 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 1391 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8), 1392 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 1393 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8), 1394 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 1395 BPF_MOV64_IMM(BPF_REG_0, 0), 1396 BPF_EXIT_INSN(), 1397 }, 1398 .errstr_unpriv = "R1 pointer comparison", 1399 .result_unpriv = REJECT, 1400 .result = ACCEPT, 1401 }, 1402 { 1403 "access skb fields ok", 1404 .insns = { 1405 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1406 offsetof(struct __sk_buff, len)), 1407 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1), 1408 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1409 offsetof(struct __sk_buff, mark)), 1410 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1), 1411 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1412 offsetof(struct __sk_buff, pkt_type)), 1413 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1), 1414 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1415 offsetof(struct __sk_buff, queue_mapping)), 1416 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0), 1417 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1418 offsetof(struct __sk_buff, protocol)), 1419 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0), 1420 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1421 offsetof(struct __sk_buff, vlan_present)), 1422 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0), 1423 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1424 offsetof(struct __sk_buff, vlan_tci)), 1425 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0), 1426 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1427 offsetof(struct __sk_buff, napi_id)), 1428 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0), 1429 BPF_EXIT_INSN(), 1430 }, 1431 .result = ACCEPT, 1432 }, 1433 { 1434 "access skb fields bad1", 1435 .insns = { 1436 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -4), 1437 BPF_EXIT_INSN(), 1438 }, 1439 .errstr = "invalid bpf_context access", 1440 .result = REJECT, 1441 }, 1442 { 1443 "access skb fields bad2", 1444 .insns = { 1445 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 9), 1446 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1447 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1448 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1449 BPF_LD_MAP_FD(BPF_REG_1, 0), 1450 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1451 BPF_FUNC_map_lookup_elem), 1452 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 1453 BPF_EXIT_INSN(), 1454 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 1455 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1456 offsetof(struct __sk_buff, pkt_type)), 1457 BPF_EXIT_INSN(), 1458 }, 1459 .fixup_map_hash_8b = { 4 }, 1460 .errstr = "different pointers", 1461 .errstr_unpriv = "R1 pointer comparison", 1462 .result = REJECT, 1463 }, 1464 { 1465 "access skb fields bad3", 1466 .insns = { 1467 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 1468 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1469 offsetof(struct __sk_buff, pkt_type)), 1470 BPF_EXIT_INSN(), 1471 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1472 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1473 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1474 BPF_LD_MAP_FD(BPF_REG_1, 0), 1475 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1476 BPF_FUNC_map_lookup_elem), 1477 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 1478 BPF_EXIT_INSN(), 1479 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 1480 BPF_JMP_IMM(BPF_JA, 0, 0, -12), 1481 }, 1482 .fixup_map_hash_8b = { 6 }, 1483 .errstr = "different pointers", 1484 .errstr_unpriv = "R1 pointer comparison", 1485 .result = REJECT, 1486 }, 1487 { 1488 "access skb fields bad4", 1489 .insns = { 1490 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 3), 1491 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 1492 offsetof(struct __sk_buff, len)), 1493 BPF_MOV64_IMM(BPF_REG_0, 0), 1494 BPF_EXIT_INSN(), 1495 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1496 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1497 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1498 BPF_LD_MAP_FD(BPF_REG_1, 0), 1499 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1500 BPF_FUNC_map_lookup_elem), 1501 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 1502 BPF_EXIT_INSN(), 1503 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 1504 BPF_JMP_IMM(BPF_JA, 0, 0, -13), 1505 }, 1506 .fixup_map_hash_8b = { 7 }, 1507 .errstr = "different pointers", 1508 .errstr_unpriv = "R1 pointer comparison", 1509 .result = REJECT, 1510 }, 1511 { 1512 "invalid access __sk_buff family", 1513 .insns = { 1514 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1515 offsetof(struct __sk_buff, family)), 1516 BPF_EXIT_INSN(), 1517 }, 1518 .errstr = "invalid bpf_context access", 1519 .result = REJECT, 1520 }, 1521 { 1522 "invalid access __sk_buff remote_ip4", 1523 .insns = { 1524 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1525 offsetof(struct __sk_buff, remote_ip4)), 1526 BPF_EXIT_INSN(), 1527 }, 1528 .errstr = "invalid bpf_context access", 1529 .result = REJECT, 1530 }, 1531 { 1532 "invalid access __sk_buff local_ip4", 1533 .insns = { 1534 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1535 offsetof(struct __sk_buff, local_ip4)), 1536 BPF_EXIT_INSN(), 1537 }, 1538 .errstr = "invalid bpf_context access", 1539 .result = REJECT, 1540 }, 1541 { 1542 "invalid access __sk_buff remote_ip6", 1543 .insns = { 1544 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1545 offsetof(struct __sk_buff, remote_ip6)), 1546 BPF_EXIT_INSN(), 1547 }, 1548 .errstr = "invalid bpf_context access", 1549 .result = REJECT, 1550 }, 1551 { 1552 "invalid access __sk_buff local_ip6", 1553 .insns = { 1554 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1555 offsetof(struct __sk_buff, local_ip6)), 1556 BPF_EXIT_INSN(), 1557 }, 1558 .errstr = "invalid bpf_context access", 1559 .result = REJECT, 1560 }, 1561 { 1562 "invalid access __sk_buff remote_port", 1563 .insns = { 1564 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1565 offsetof(struct __sk_buff, remote_port)), 1566 BPF_EXIT_INSN(), 1567 }, 1568 .errstr = "invalid bpf_context access", 1569 .result = REJECT, 1570 }, 1571 { 1572 "invalid access __sk_buff remote_port", 1573 .insns = { 1574 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1575 offsetof(struct __sk_buff, local_port)), 1576 BPF_EXIT_INSN(), 1577 }, 1578 .errstr = "invalid bpf_context access", 1579 .result = REJECT, 1580 }, 1581 { 1582 "valid access __sk_buff family", 1583 .insns = { 1584 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1585 offsetof(struct __sk_buff, family)), 1586 BPF_EXIT_INSN(), 1587 }, 1588 .result = ACCEPT, 1589 .prog_type = BPF_PROG_TYPE_SK_SKB, 1590 }, 1591 { 1592 "valid access __sk_buff remote_ip4", 1593 .insns = { 1594 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1595 offsetof(struct __sk_buff, remote_ip4)), 1596 BPF_EXIT_INSN(), 1597 }, 1598 .result = ACCEPT, 1599 .prog_type = BPF_PROG_TYPE_SK_SKB, 1600 }, 1601 { 1602 "valid access __sk_buff local_ip4", 1603 .insns = { 1604 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1605 offsetof(struct __sk_buff, local_ip4)), 1606 BPF_EXIT_INSN(), 1607 }, 1608 .result = ACCEPT, 1609 .prog_type = BPF_PROG_TYPE_SK_SKB, 1610 }, 1611 { 1612 "valid access __sk_buff remote_ip6", 1613 .insns = { 1614 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1615 offsetof(struct __sk_buff, remote_ip6[0])), 1616 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1617 offsetof(struct __sk_buff, remote_ip6[1])), 1618 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1619 offsetof(struct __sk_buff, remote_ip6[2])), 1620 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1621 offsetof(struct __sk_buff, remote_ip6[3])), 1622 BPF_EXIT_INSN(), 1623 }, 1624 .result = ACCEPT, 1625 .prog_type = BPF_PROG_TYPE_SK_SKB, 1626 }, 1627 { 1628 "valid access __sk_buff local_ip6", 1629 .insns = { 1630 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1631 offsetof(struct __sk_buff, local_ip6[0])), 1632 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1633 offsetof(struct __sk_buff, local_ip6[1])), 1634 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1635 offsetof(struct __sk_buff, local_ip6[2])), 1636 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1637 offsetof(struct __sk_buff, local_ip6[3])), 1638 BPF_EXIT_INSN(), 1639 }, 1640 .result = ACCEPT, 1641 .prog_type = BPF_PROG_TYPE_SK_SKB, 1642 }, 1643 { 1644 "valid access __sk_buff remote_port", 1645 .insns = { 1646 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1647 offsetof(struct __sk_buff, remote_port)), 1648 BPF_EXIT_INSN(), 1649 }, 1650 .result = ACCEPT, 1651 .prog_type = BPF_PROG_TYPE_SK_SKB, 1652 }, 1653 { 1654 "valid access __sk_buff remote_port", 1655 .insns = { 1656 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1657 offsetof(struct __sk_buff, local_port)), 1658 BPF_EXIT_INSN(), 1659 }, 1660 .result = ACCEPT, 1661 .prog_type = BPF_PROG_TYPE_SK_SKB, 1662 }, 1663 { 1664 "invalid access of tc_classid for SK_SKB", 1665 .insns = { 1666 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1667 offsetof(struct __sk_buff, tc_classid)), 1668 BPF_EXIT_INSN(), 1669 }, 1670 .result = REJECT, 1671 .prog_type = BPF_PROG_TYPE_SK_SKB, 1672 .errstr = "invalid bpf_context access", 1673 }, 1674 { 1675 "invalid access of skb->mark for SK_SKB", 1676 .insns = { 1677 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1678 offsetof(struct __sk_buff, mark)), 1679 BPF_EXIT_INSN(), 1680 }, 1681 .result = REJECT, 1682 .prog_type = BPF_PROG_TYPE_SK_SKB, 1683 .errstr = "invalid bpf_context access", 1684 }, 1685 { 1686 "check skb->mark is not writeable by SK_SKB", 1687 .insns = { 1688 BPF_MOV64_IMM(BPF_REG_0, 0), 1689 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 1690 offsetof(struct __sk_buff, mark)), 1691 BPF_EXIT_INSN(), 1692 }, 1693 .result = REJECT, 1694 .prog_type = BPF_PROG_TYPE_SK_SKB, 1695 .errstr = "invalid bpf_context access", 1696 }, 1697 { 1698 "check skb->tc_index is writeable by SK_SKB", 1699 .insns = { 1700 BPF_MOV64_IMM(BPF_REG_0, 0), 1701 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 1702 offsetof(struct __sk_buff, tc_index)), 1703 BPF_EXIT_INSN(), 1704 }, 1705 .result = ACCEPT, 1706 .prog_type = BPF_PROG_TYPE_SK_SKB, 1707 }, 1708 { 1709 "check skb->priority is writeable by SK_SKB", 1710 .insns = { 1711 BPF_MOV64_IMM(BPF_REG_0, 0), 1712 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 1713 offsetof(struct __sk_buff, priority)), 1714 BPF_EXIT_INSN(), 1715 }, 1716 .result = ACCEPT, 1717 .prog_type = BPF_PROG_TYPE_SK_SKB, 1718 }, 1719 { 1720 "direct packet read for SK_SKB", 1721 .insns = { 1722 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 1723 offsetof(struct __sk_buff, data)), 1724 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 1725 offsetof(struct __sk_buff, data_end)), 1726 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 1727 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 1728 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 1729 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 1730 BPF_MOV64_IMM(BPF_REG_0, 0), 1731 BPF_EXIT_INSN(), 1732 }, 1733 .result = ACCEPT, 1734 .prog_type = BPF_PROG_TYPE_SK_SKB, 1735 }, 1736 { 1737 "direct packet write for SK_SKB", 1738 .insns = { 1739 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 1740 offsetof(struct __sk_buff, data)), 1741 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 1742 offsetof(struct __sk_buff, data_end)), 1743 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 1744 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 1745 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 1746 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 1747 BPF_MOV64_IMM(BPF_REG_0, 0), 1748 BPF_EXIT_INSN(), 1749 }, 1750 .result = ACCEPT, 1751 .prog_type = BPF_PROG_TYPE_SK_SKB, 1752 }, 1753 { 1754 "overlapping checks for direct packet access SK_SKB", 1755 .insns = { 1756 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 1757 offsetof(struct __sk_buff, data)), 1758 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 1759 offsetof(struct __sk_buff, data_end)), 1760 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 1761 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 1762 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 4), 1763 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 1764 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6), 1765 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 1766 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_2, 6), 1767 BPF_MOV64_IMM(BPF_REG_0, 0), 1768 BPF_EXIT_INSN(), 1769 }, 1770 .result = ACCEPT, 1771 .prog_type = BPF_PROG_TYPE_SK_SKB, 1772 }, 1773 { 1774 "valid access family in SK_MSG", 1775 .insns = { 1776 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1777 offsetof(struct sk_msg_md, family)), 1778 BPF_EXIT_INSN(), 1779 }, 1780 .result = ACCEPT, 1781 .prog_type = BPF_PROG_TYPE_SK_MSG, 1782 }, 1783 { 1784 "valid access remote_ip4 in SK_MSG", 1785 .insns = { 1786 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1787 offsetof(struct sk_msg_md, remote_ip4)), 1788 BPF_EXIT_INSN(), 1789 }, 1790 .result = ACCEPT, 1791 .prog_type = BPF_PROG_TYPE_SK_MSG, 1792 }, 1793 { 1794 "valid access local_ip4 in SK_MSG", 1795 .insns = { 1796 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1797 offsetof(struct sk_msg_md, local_ip4)), 1798 BPF_EXIT_INSN(), 1799 }, 1800 .result = ACCEPT, 1801 .prog_type = BPF_PROG_TYPE_SK_MSG, 1802 }, 1803 { 1804 "valid access remote_port in SK_MSG", 1805 .insns = { 1806 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1807 offsetof(struct sk_msg_md, remote_port)), 1808 BPF_EXIT_INSN(), 1809 }, 1810 .result = ACCEPT, 1811 .prog_type = BPF_PROG_TYPE_SK_MSG, 1812 }, 1813 { 1814 "valid access local_port in SK_MSG", 1815 .insns = { 1816 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1817 offsetof(struct sk_msg_md, local_port)), 1818 BPF_EXIT_INSN(), 1819 }, 1820 .result = ACCEPT, 1821 .prog_type = BPF_PROG_TYPE_SK_MSG, 1822 }, 1823 { 1824 "valid access remote_ip6 in SK_MSG", 1825 .insns = { 1826 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1827 offsetof(struct sk_msg_md, remote_ip6[0])), 1828 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1829 offsetof(struct sk_msg_md, remote_ip6[1])), 1830 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1831 offsetof(struct sk_msg_md, remote_ip6[2])), 1832 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1833 offsetof(struct sk_msg_md, remote_ip6[3])), 1834 BPF_EXIT_INSN(), 1835 }, 1836 .result = ACCEPT, 1837 .prog_type = BPF_PROG_TYPE_SK_SKB, 1838 }, 1839 { 1840 "valid access local_ip6 in SK_MSG", 1841 .insns = { 1842 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1843 offsetof(struct sk_msg_md, local_ip6[0])), 1844 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1845 offsetof(struct sk_msg_md, local_ip6[1])), 1846 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1847 offsetof(struct sk_msg_md, local_ip6[2])), 1848 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1849 offsetof(struct sk_msg_md, local_ip6[3])), 1850 BPF_EXIT_INSN(), 1851 }, 1852 .result = ACCEPT, 1853 .prog_type = BPF_PROG_TYPE_SK_SKB, 1854 }, 1855 { 1856 "valid access size in SK_MSG", 1857 .insns = { 1858 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1859 offsetof(struct sk_msg_md, size)), 1860 BPF_EXIT_INSN(), 1861 }, 1862 .result = ACCEPT, 1863 .prog_type = BPF_PROG_TYPE_SK_MSG, 1864 }, 1865 { 1866 "invalid 64B read of size in SK_MSG", 1867 .insns = { 1868 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 1869 offsetof(struct sk_msg_md, size)), 1870 BPF_EXIT_INSN(), 1871 }, 1872 .errstr = "invalid bpf_context access", 1873 .result = REJECT, 1874 .prog_type = BPF_PROG_TYPE_SK_MSG, 1875 }, 1876 { 1877 "invalid read past end of SK_MSG", 1878 .insns = { 1879 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 1880 offsetof(struct sk_msg_md, size) + 4), 1881 BPF_EXIT_INSN(), 1882 }, 1883 .errstr = "invalid bpf_context access", 1884 .result = REJECT, 1885 .prog_type = BPF_PROG_TYPE_SK_MSG, 1886 }, 1887 { 1888 "invalid read offset in SK_MSG", 1889 .insns = { 1890 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 1891 offsetof(struct sk_msg_md, family) + 1), 1892 BPF_EXIT_INSN(), 1893 }, 1894 .errstr = "invalid bpf_context access", 1895 .result = REJECT, 1896 .prog_type = BPF_PROG_TYPE_SK_MSG, 1897 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 1898 }, 1899 { 1900 "direct packet read for SK_MSG", 1901 .insns = { 1902 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 1903 offsetof(struct sk_msg_md, data)), 1904 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 1905 offsetof(struct sk_msg_md, data_end)), 1906 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 1907 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 1908 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 1909 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 1910 BPF_MOV64_IMM(BPF_REG_0, 0), 1911 BPF_EXIT_INSN(), 1912 }, 1913 .result = ACCEPT, 1914 .prog_type = BPF_PROG_TYPE_SK_MSG, 1915 }, 1916 { 1917 "direct packet write for SK_MSG", 1918 .insns = { 1919 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 1920 offsetof(struct sk_msg_md, data)), 1921 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 1922 offsetof(struct sk_msg_md, data_end)), 1923 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 1924 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 1925 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 1926 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 1927 BPF_MOV64_IMM(BPF_REG_0, 0), 1928 BPF_EXIT_INSN(), 1929 }, 1930 .result = ACCEPT, 1931 .prog_type = BPF_PROG_TYPE_SK_MSG, 1932 }, 1933 { 1934 "overlapping checks for direct packet access SK_MSG", 1935 .insns = { 1936 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 1937 offsetof(struct sk_msg_md, data)), 1938 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 1939 offsetof(struct sk_msg_md, data_end)), 1940 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 1941 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 1942 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 4), 1943 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 1944 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6), 1945 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 1946 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_2, 6), 1947 BPF_MOV64_IMM(BPF_REG_0, 0), 1948 BPF_EXIT_INSN(), 1949 }, 1950 .result = ACCEPT, 1951 .prog_type = BPF_PROG_TYPE_SK_MSG, 1952 }, 1953 { 1954 "check skb->mark is not writeable by sockets", 1955 .insns = { 1956 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 1957 offsetof(struct __sk_buff, mark)), 1958 BPF_EXIT_INSN(), 1959 }, 1960 .errstr = "invalid bpf_context access", 1961 .errstr_unpriv = "R1 leaks addr", 1962 .result = REJECT, 1963 }, 1964 { 1965 "check skb->tc_index is not writeable by sockets", 1966 .insns = { 1967 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 1968 offsetof(struct __sk_buff, tc_index)), 1969 BPF_EXIT_INSN(), 1970 }, 1971 .errstr = "invalid bpf_context access", 1972 .errstr_unpriv = "R1 leaks addr", 1973 .result = REJECT, 1974 }, 1975 { 1976 "check cb access: byte", 1977 .insns = { 1978 BPF_MOV64_IMM(BPF_REG_0, 0), 1979 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1980 offsetof(struct __sk_buff, cb[0])), 1981 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1982 offsetof(struct __sk_buff, cb[0]) + 1), 1983 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1984 offsetof(struct __sk_buff, cb[0]) + 2), 1985 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1986 offsetof(struct __sk_buff, cb[0]) + 3), 1987 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1988 offsetof(struct __sk_buff, cb[1])), 1989 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1990 offsetof(struct __sk_buff, cb[1]) + 1), 1991 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1992 offsetof(struct __sk_buff, cb[1]) + 2), 1993 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1994 offsetof(struct __sk_buff, cb[1]) + 3), 1995 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1996 offsetof(struct __sk_buff, cb[2])), 1997 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1998 offsetof(struct __sk_buff, cb[2]) + 1), 1999 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2000 offsetof(struct __sk_buff, cb[2]) + 2), 2001 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2002 offsetof(struct __sk_buff, cb[2]) + 3), 2003 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2004 offsetof(struct __sk_buff, cb[3])), 2005 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2006 offsetof(struct __sk_buff, cb[3]) + 1), 2007 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2008 offsetof(struct __sk_buff, cb[3]) + 2), 2009 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2010 offsetof(struct __sk_buff, cb[3]) + 3), 2011 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2012 offsetof(struct __sk_buff, cb[4])), 2013 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2014 offsetof(struct __sk_buff, cb[4]) + 1), 2015 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2016 offsetof(struct __sk_buff, cb[4]) + 2), 2017 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2018 offsetof(struct __sk_buff, cb[4]) + 3), 2019 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2020 offsetof(struct __sk_buff, cb[0])), 2021 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2022 offsetof(struct __sk_buff, cb[0]) + 1), 2023 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2024 offsetof(struct __sk_buff, cb[0]) + 2), 2025 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2026 offsetof(struct __sk_buff, cb[0]) + 3), 2027 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2028 offsetof(struct __sk_buff, cb[1])), 2029 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2030 offsetof(struct __sk_buff, cb[1]) + 1), 2031 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2032 offsetof(struct __sk_buff, cb[1]) + 2), 2033 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2034 offsetof(struct __sk_buff, cb[1]) + 3), 2035 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2036 offsetof(struct __sk_buff, cb[2])), 2037 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2038 offsetof(struct __sk_buff, cb[2]) + 1), 2039 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2040 offsetof(struct __sk_buff, cb[2]) + 2), 2041 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2042 offsetof(struct __sk_buff, cb[2]) + 3), 2043 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2044 offsetof(struct __sk_buff, cb[3])), 2045 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2046 offsetof(struct __sk_buff, cb[3]) + 1), 2047 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2048 offsetof(struct __sk_buff, cb[3]) + 2), 2049 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2050 offsetof(struct __sk_buff, cb[3]) + 3), 2051 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2052 offsetof(struct __sk_buff, cb[4])), 2053 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2054 offsetof(struct __sk_buff, cb[4]) + 1), 2055 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2056 offsetof(struct __sk_buff, cb[4]) + 2), 2057 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2058 offsetof(struct __sk_buff, cb[4]) + 3), 2059 BPF_EXIT_INSN(), 2060 }, 2061 .result = ACCEPT, 2062 }, 2063 { 2064 "__sk_buff->hash, offset 0, byte store not permitted", 2065 .insns = { 2066 BPF_MOV64_IMM(BPF_REG_0, 0), 2067 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2068 offsetof(struct __sk_buff, hash)), 2069 BPF_EXIT_INSN(), 2070 }, 2071 .errstr = "invalid bpf_context access", 2072 .result = REJECT, 2073 }, 2074 { 2075 "__sk_buff->tc_index, offset 3, byte store not permitted", 2076 .insns = { 2077 BPF_MOV64_IMM(BPF_REG_0, 0), 2078 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2079 offsetof(struct __sk_buff, tc_index) + 3), 2080 BPF_EXIT_INSN(), 2081 }, 2082 .errstr = "invalid bpf_context access", 2083 .result = REJECT, 2084 }, 2085 { 2086 "check skb->hash byte load permitted", 2087 .insns = { 2088 BPF_MOV64_IMM(BPF_REG_0, 0), 2089 #if __BYTE_ORDER == __LITTLE_ENDIAN 2090 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2091 offsetof(struct __sk_buff, hash)), 2092 #else 2093 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2094 offsetof(struct __sk_buff, hash) + 3), 2095 #endif 2096 BPF_EXIT_INSN(), 2097 }, 2098 .result = ACCEPT, 2099 }, 2100 { 2101 "check skb->hash byte load permitted 1", 2102 .insns = { 2103 BPF_MOV64_IMM(BPF_REG_0, 0), 2104 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2105 offsetof(struct __sk_buff, hash) + 1), 2106 BPF_EXIT_INSN(), 2107 }, 2108 .result = ACCEPT, 2109 }, 2110 { 2111 "check skb->hash byte load permitted 2", 2112 .insns = { 2113 BPF_MOV64_IMM(BPF_REG_0, 0), 2114 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2115 offsetof(struct __sk_buff, hash) + 2), 2116 BPF_EXIT_INSN(), 2117 }, 2118 .result = ACCEPT, 2119 }, 2120 { 2121 "check skb->hash byte load permitted 3", 2122 .insns = { 2123 BPF_MOV64_IMM(BPF_REG_0, 0), 2124 #if __BYTE_ORDER == __LITTLE_ENDIAN 2125 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2126 offsetof(struct __sk_buff, hash) + 3), 2127 #else 2128 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2129 offsetof(struct __sk_buff, hash)), 2130 #endif 2131 BPF_EXIT_INSN(), 2132 }, 2133 .result = ACCEPT, 2134 }, 2135 { 2136 "check cb access: byte, wrong type", 2137 .insns = { 2138 BPF_MOV64_IMM(BPF_REG_0, 0), 2139 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2140 offsetof(struct __sk_buff, cb[0])), 2141 BPF_EXIT_INSN(), 2142 }, 2143 .errstr = "invalid bpf_context access", 2144 .result = REJECT, 2145 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 2146 }, 2147 { 2148 "check cb access: half", 2149 .insns = { 2150 BPF_MOV64_IMM(BPF_REG_0, 0), 2151 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2152 offsetof(struct __sk_buff, cb[0])), 2153 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2154 offsetof(struct __sk_buff, cb[0]) + 2), 2155 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2156 offsetof(struct __sk_buff, cb[1])), 2157 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2158 offsetof(struct __sk_buff, cb[1]) + 2), 2159 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2160 offsetof(struct __sk_buff, cb[2])), 2161 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2162 offsetof(struct __sk_buff, cb[2]) + 2), 2163 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2164 offsetof(struct __sk_buff, cb[3])), 2165 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2166 offsetof(struct __sk_buff, cb[3]) + 2), 2167 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2168 offsetof(struct __sk_buff, cb[4])), 2169 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2170 offsetof(struct __sk_buff, cb[4]) + 2), 2171 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2172 offsetof(struct __sk_buff, cb[0])), 2173 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2174 offsetof(struct __sk_buff, cb[0]) + 2), 2175 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2176 offsetof(struct __sk_buff, cb[1])), 2177 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2178 offsetof(struct __sk_buff, cb[1]) + 2), 2179 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2180 offsetof(struct __sk_buff, cb[2])), 2181 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2182 offsetof(struct __sk_buff, cb[2]) + 2), 2183 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2184 offsetof(struct __sk_buff, cb[3])), 2185 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2186 offsetof(struct __sk_buff, cb[3]) + 2), 2187 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2188 offsetof(struct __sk_buff, cb[4])), 2189 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2190 offsetof(struct __sk_buff, cb[4]) + 2), 2191 BPF_EXIT_INSN(), 2192 }, 2193 .result = ACCEPT, 2194 }, 2195 { 2196 "check cb access: half, unaligned", 2197 .insns = { 2198 BPF_MOV64_IMM(BPF_REG_0, 0), 2199 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2200 offsetof(struct __sk_buff, cb[0]) + 1), 2201 BPF_EXIT_INSN(), 2202 }, 2203 .errstr = "misaligned context access", 2204 .result = REJECT, 2205 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 2206 }, 2207 { 2208 "check __sk_buff->hash, offset 0, half store not permitted", 2209 .insns = { 2210 BPF_MOV64_IMM(BPF_REG_0, 0), 2211 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2212 offsetof(struct __sk_buff, hash)), 2213 BPF_EXIT_INSN(), 2214 }, 2215 .errstr = "invalid bpf_context access", 2216 .result = REJECT, 2217 }, 2218 { 2219 "check __sk_buff->tc_index, offset 2, half store not permitted", 2220 .insns = { 2221 BPF_MOV64_IMM(BPF_REG_0, 0), 2222 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2223 offsetof(struct __sk_buff, tc_index) + 2), 2224 BPF_EXIT_INSN(), 2225 }, 2226 .errstr = "invalid bpf_context access", 2227 .result = REJECT, 2228 }, 2229 { 2230 "check skb->hash half load permitted", 2231 .insns = { 2232 BPF_MOV64_IMM(BPF_REG_0, 0), 2233 #if __BYTE_ORDER == __LITTLE_ENDIAN 2234 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2235 offsetof(struct __sk_buff, hash)), 2236 #else 2237 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2238 offsetof(struct __sk_buff, hash) + 2), 2239 #endif 2240 BPF_EXIT_INSN(), 2241 }, 2242 .result = ACCEPT, 2243 }, 2244 { 2245 "check skb->hash half load permitted 2", 2246 .insns = { 2247 BPF_MOV64_IMM(BPF_REG_0, 0), 2248 #if __BYTE_ORDER == __LITTLE_ENDIAN 2249 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2250 offsetof(struct __sk_buff, hash) + 2), 2251 #else 2252 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2253 offsetof(struct __sk_buff, hash)), 2254 #endif 2255 BPF_EXIT_INSN(), 2256 }, 2257 .result = ACCEPT, 2258 }, 2259 { 2260 "check skb->hash half load not permitted, unaligned 1", 2261 .insns = { 2262 BPF_MOV64_IMM(BPF_REG_0, 0), 2263 #if __BYTE_ORDER == __LITTLE_ENDIAN 2264 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2265 offsetof(struct __sk_buff, hash) + 1), 2266 #else 2267 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2268 offsetof(struct __sk_buff, hash) + 3), 2269 #endif 2270 BPF_EXIT_INSN(), 2271 }, 2272 .errstr = "invalid bpf_context access", 2273 .result = REJECT, 2274 }, 2275 { 2276 "check skb->hash half load not permitted, unaligned 3", 2277 .insns = { 2278 BPF_MOV64_IMM(BPF_REG_0, 0), 2279 #if __BYTE_ORDER == __LITTLE_ENDIAN 2280 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2281 offsetof(struct __sk_buff, hash) + 3), 2282 #else 2283 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2284 offsetof(struct __sk_buff, hash) + 1), 2285 #endif 2286 BPF_EXIT_INSN(), 2287 }, 2288 .errstr = "invalid bpf_context access", 2289 .result = REJECT, 2290 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 2291 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 2292 }, 2293 { 2294 "check cb access: half, wrong type", 2295 .insns = { 2296 BPF_MOV64_IMM(BPF_REG_0, 0), 2297 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2298 offsetof(struct __sk_buff, cb[0])), 2299 BPF_EXIT_INSN(), 2300 }, 2301 .errstr = "invalid bpf_context access", 2302 .result = REJECT, 2303 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 2304 }, 2305 { 2306 "check cb access: word", 2307 .insns = { 2308 BPF_MOV64_IMM(BPF_REG_0, 0), 2309 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2310 offsetof(struct __sk_buff, cb[0])), 2311 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2312 offsetof(struct __sk_buff, cb[1])), 2313 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2314 offsetof(struct __sk_buff, cb[2])), 2315 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2316 offsetof(struct __sk_buff, cb[3])), 2317 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2318 offsetof(struct __sk_buff, cb[4])), 2319 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2320 offsetof(struct __sk_buff, cb[0])), 2321 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2322 offsetof(struct __sk_buff, cb[1])), 2323 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2324 offsetof(struct __sk_buff, cb[2])), 2325 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2326 offsetof(struct __sk_buff, cb[3])), 2327 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2328 offsetof(struct __sk_buff, cb[4])), 2329 BPF_EXIT_INSN(), 2330 }, 2331 .result = ACCEPT, 2332 }, 2333 { 2334 "check cb access: word, unaligned 1", 2335 .insns = { 2336 BPF_MOV64_IMM(BPF_REG_0, 0), 2337 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2338 offsetof(struct __sk_buff, cb[0]) + 2), 2339 BPF_EXIT_INSN(), 2340 }, 2341 .errstr = "misaligned context access", 2342 .result = REJECT, 2343 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 2344 }, 2345 { 2346 "check cb access: word, unaligned 2", 2347 .insns = { 2348 BPF_MOV64_IMM(BPF_REG_0, 0), 2349 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2350 offsetof(struct __sk_buff, cb[4]) + 1), 2351 BPF_EXIT_INSN(), 2352 }, 2353 .errstr = "misaligned context access", 2354 .result = REJECT, 2355 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 2356 }, 2357 { 2358 "check cb access: word, unaligned 3", 2359 .insns = { 2360 BPF_MOV64_IMM(BPF_REG_0, 0), 2361 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2362 offsetof(struct __sk_buff, cb[4]) + 2), 2363 BPF_EXIT_INSN(), 2364 }, 2365 .errstr = "misaligned context access", 2366 .result = REJECT, 2367 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 2368 }, 2369 { 2370 "check cb access: word, unaligned 4", 2371 .insns = { 2372 BPF_MOV64_IMM(BPF_REG_0, 0), 2373 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2374 offsetof(struct __sk_buff, cb[4]) + 3), 2375 BPF_EXIT_INSN(), 2376 }, 2377 .errstr = "misaligned context access", 2378 .result = REJECT, 2379 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 2380 }, 2381 { 2382 "check cb access: double", 2383 .insns = { 2384 BPF_MOV64_IMM(BPF_REG_0, 0), 2385 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2386 offsetof(struct __sk_buff, cb[0])), 2387 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2388 offsetof(struct __sk_buff, cb[2])), 2389 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2390 offsetof(struct __sk_buff, cb[0])), 2391 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2392 offsetof(struct __sk_buff, cb[2])), 2393 BPF_EXIT_INSN(), 2394 }, 2395 .result = ACCEPT, 2396 }, 2397 { 2398 "check cb access: double, unaligned 1", 2399 .insns = { 2400 BPF_MOV64_IMM(BPF_REG_0, 0), 2401 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2402 offsetof(struct __sk_buff, cb[1])), 2403 BPF_EXIT_INSN(), 2404 }, 2405 .errstr = "misaligned context access", 2406 .result = REJECT, 2407 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 2408 }, 2409 { 2410 "check cb access: double, unaligned 2", 2411 .insns = { 2412 BPF_MOV64_IMM(BPF_REG_0, 0), 2413 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2414 offsetof(struct __sk_buff, cb[3])), 2415 BPF_EXIT_INSN(), 2416 }, 2417 .errstr = "misaligned context access", 2418 .result = REJECT, 2419 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 2420 }, 2421 { 2422 "check cb access: double, oob 1", 2423 .insns = { 2424 BPF_MOV64_IMM(BPF_REG_0, 0), 2425 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2426 offsetof(struct __sk_buff, cb[4])), 2427 BPF_EXIT_INSN(), 2428 }, 2429 .errstr = "invalid bpf_context access", 2430 .result = REJECT, 2431 }, 2432 { 2433 "check cb access: double, oob 2", 2434 .insns = { 2435 BPF_MOV64_IMM(BPF_REG_0, 0), 2436 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2437 offsetof(struct __sk_buff, cb[4])), 2438 BPF_EXIT_INSN(), 2439 }, 2440 .errstr = "invalid bpf_context access", 2441 .result = REJECT, 2442 }, 2443 { 2444 "check __sk_buff->ifindex dw store not permitted", 2445 .insns = { 2446 BPF_MOV64_IMM(BPF_REG_0, 0), 2447 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2448 offsetof(struct __sk_buff, ifindex)), 2449 BPF_EXIT_INSN(), 2450 }, 2451 .errstr = "invalid bpf_context access", 2452 .result = REJECT, 2453 }, 2454 { 2455 "check __sk_buff->ifindex dw load not permitted", 2456 .insns = { 2457 BPF_MOV64_IMM(BPF_REG_0, 0), 2458 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2459 offsetof(struct __sk_buff, ifindex)), 2460 BPF_EXIT_INSN(), 2461 }, 2462 .errstr = "invalid bpf_context access", 2463 .result = REJECT, 2464 }, 2465 { 2466 "check cb access: double, wrong type", 2467 .insns = { 2468 BPF_MOV64_IMM(BPF_REG_0, 0), 2469 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2470 offsetof(struct __sk_buff, cb[0])), 2471 BPF_EXIT_INSN(), 2472 }, 2473 .errstr = "invalid bpf_context access", 2474 .result = REJECT, 2475 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 2476 }, 2477 { 2478 "check out of range skb->cb access", 2479 .insns = { 2480 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2481 offsetof(struct __sk_buff, cb[0]) + 256), 2482 BPF_EXIT_INSN(), 2483 }, 2484 .errstr = "invalid bpf_context access", 2485 .errstr_unpriv = "", 2486 .result = REJECT, 2487 .prog_type = BPF_PROG_TYPE_SCHED_ACT, 2488 }, 2489 { 2490 "write skb fields from socket prog", 2491 .insns = { 2492 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2493 offsetof(struct __sk_buff, cb[4])), 2494 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1), 2495 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2496 offsetof(struct __sk_buff, mark)), 2497 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2498 offsetof(struct __sk_buff, tc_index)), 2499 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1), 2500 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 2501 offsetof(struct __sk_buff, cb[0])), 2502 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 2503 offsetof(struct __sk_buff, cb[2])), 2504 BPF_EXIT_INSN(), 2505 }, 2506 .result = ACCEPT, 2507 .errstr_unpriv = "R1 leaks addr", 2508 .result_unpriv = REJECT, 2509 }, 2510 { 2511 "write skb fields from tc_cls_act prog", 2512 .insns = { 2513 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2514 offsetof(struct __sk_buff, cb[0])), 2515 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2516 offsetof(struct __sk_buff, mark)), 2517 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2518 offsetof(struct __sk_buff, tc_index)), 2519 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2520 offsetof(struct __sk_buff, tc_index)), 2521 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2522 offsetof(struct __sk_buff, cb[3])), 2523 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2524 offsetof(struct __sk_buff, tstamp)), 2525 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2526 offsetof(struct __sk_buff, tstamp)), 2527 BPF_EXIT_INSN(), 2528 }, 2529 .errstr_unpriv = "", 2530 .result_unpriv = REJECT, 2531 .result = ACCEPT, 2532 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2533 }, 2534 { 2535 "PTR_TO_STACK store/load", 2536 .insns = { 2537 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 2538 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -10), 2539 BPF_ST_MEM(BPF_DW, BPF_REG_1, 2, 0xfaceb00c), 2540 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2), 2541 BPF_EXIT_INSN(), 2542 }, 2543 .result = ACCEPT, 2544 .retval = 0xfaceb00c, 2545 }, 2546 { 2547 "PTR_TO_STACK store/load - bad alignment on off", 2548 .insns = { 2549 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 2550 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 2551 BPF_ST_MEM(BPF_DW, BPF_REG_1, 2, 0xfaceb00c), 2552 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2), 2553 BPF_EXIT_INSN(), 2554 }, 2555 .result = REJECT, 2556 .errstr = "misaligned stack access off (0x0; 0x0)+-8+2 size 8", 2557 }, 2558 { 2559 "PTR_TO_STACK store/load - bad alignment on reg", 2560 .insns = { 2561 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 2562 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -10), 2563 BPF_ST_MEM(BPF_DW, BPF_REG_1, 8, 0xfaceb00c), 2564 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 8), 2565 BPF_EXIT_INSN(), 2566 }, 2567 .result = REJECT, 2568 .errstr = "misaligned stack access off (0x0; 0x0)+-10+8 size 8", 2569 }, 2570 { 2571 "PTR_TO_STACK store/load - out of bounds low", 2572 .insns = { 2573 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 2574 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -80000), 2575 BPF_ST_MEM(BPF_DW, BPF_REG_1, 8, 0xfaceb00c), 2576 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 8), 2577 BPF_EXIT_INSN(), 2578 }, 2579 .result = REJECT, 2580 .errstr = "invalid stack off=-79992 size=8", 2581 .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", 2582 }, 2583 { 2584 "PTR_TO_STACK store/load - out of bounds high", 2585 .insns = { 2586 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 2587 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 2588 BPF_ST_MEM(BPF_DW, BPF_REG_1, 8, 0xfaceb00c), 2589 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 8), 2590 BPF_EXIT_INSN(), 2591 }, 2592 .result = REJECT, 2593 .errstr = "invalid stack off=0 size=8", 2594 }, 2595 { 2596 "unpriv: return pointer", 2597 .insns = { 2598 BPF_MOV64_REG(BPF_REG_0, BPF_REG_10), 2599 BPF_EXIT_INSN(), 2600 }, 2601 .result = ACCEPT, 2602 .result_unpriv = REJECT, 2603 .errstr_unpriv = "R0 leaks addr", 2604 .retval = POINTER_VALUE, 2605 }, 2606 { 2607 "unpriv: add const to pointer", 2608 .insns = { 2609 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 2610 BPF_MOV64_IMM(BPF_REG_0, 0), 2611 BPF_EXIT_INSN(), 2612 }, 2613 .result = ACCEPT, 2614 }, 2615 { 2616 "unpriv: add pointer to pointer", 2617 .insns = { 2618 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_10), 2619 BPF_MOV64_IMM(BPF_REG_0, 0), 2620 BPF_EXIT_INSN(), 2621 }, 2622 .result = REJECT, 2623 .errstr = "R1 pointer += pointer", 2624 }, 2625 { 2626 "unpriv: neg pointer", 2627 .insns = { 2628 BPF_ALU64_IMM(BPF_NEG, BPF_REG_1, 0), 2629 BPF_MOV64_IMM(BPF_REG_0, 0), 2630 BPF_EXIT_INSN(), 2631 }, 2632 .result = ACCEPT, 2633 .result_unpriv = REJECT, 2634 .errstr_unpriv = "R1 pointer arithmetic", 2635 }, 2636 { 2637 "unpriv: cmp pointer with const", 2638 .insns = { 2639 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 0), 2640 BPF_MOV64_IMM(BPF_REG_0, 0), 2641 BPF_EXIT_INSN(), 2642 }, 2643 .result = ACCEPT, 2644 .result_unpriv = REJECT, 2645 .errstr_unpriv = "R1 pointer comparison", 2646 }, 2647 { 2648 "unpriv: cmp pointer with pointer", 2649 .insns = { 2650 BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0), 2651 BPF_MOV64_IMM(BPF_REG_0, 0), 2652 BPF_EXIT_INSN(), 2653 }, 2654 .result = ACCEPT, 2655 .result_unpriv = REJECT, 2656 .errstr_unpriv = "R10 pointer comparison", 2657 }, 2658 { 2659 "unpriv: check that printk is disallowed", 2660 .insns = { 2661 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 2662 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 2663 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 2664 BPF_MOV64_IMM(BPF_REG_2, 8), 2665 BPF_MOV64_REG(BPF_REG_3, BPF_REG_1), 2666 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2667 BPF_FUNC_trace_printk), 2668 BPF_MOV64_IMM(BPF_REG_0, 0), 2669 BPF_EXIT_INSN(), 2670 }, 2671 .errstr_unpriv = "unknown func bpf_trace_printk#6", 2672 .result_unpriv = REJECT, 2673 .result = ACCEPT, 2674 }, 2675 { 2676 "unpriv: pass pointer to helper function", 2677 .insns = { 2678 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 2679 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 2680 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 2681 BPF_LD_MAP_FD(BPF_REG_1, 0), 2682 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 2683 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 2684 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2685 BPF_FUNC_map_update_elem), 2686 BPF_MOV64_IMM(BPF_REG_0, 0), 2687 BPF_EXIT_INSN(), 2688 }, 2689 .fixup_map_hash_8b = { 3 }, 2690 .errstr_unpriv = "R4 leaks addr", 2691 .result_unpriv = REJECT, 2692 .result = ACCEPT, 2693 }, 2694 { 2695 "unpriv: indirectly pass pointer on stack to helper function", 2696 .insns = { 2697 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8), 2698 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 2699 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 2700 BPF_LD_MAP_FD(BPF_REG_1, 0), 2701 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2702 BPF_FUNC_map_lookup_elem), 2703 BPF_MOV64_IMM(BPF_REG_0, 0), 2704 BPF_EXIT_INSN(), 2705 }, 2706 .fixup_map_hash_8b = { 3 }, 2707 .errstr = "invalid indirect read from stack off -8+0 size 8", 2708 .result = REJECT, 2709 }, 2710 { 2711 "unpriv: mangle pointer on stack 1", 2712 .insns = { 2713 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8), 2714 BPF_ST_MEM(BPF_W, BPF_REG_10, -8, 0), 2715 BPF_MOV64_IMM(BPF_REG_0, 0), 2716 BPF_EXIT_INSN(), 2717 }, 2718 .errstr_unpriv = "attempt to corrupt spilled", 2719 .result_unpriv = REJECT, 2720 .result = ACCEPT, 2721 }, 2722 { 2723 "unpriv: mangle pointer on stack 2", 2724 .insns = { 2725 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8), 2726 BPF_ST_MEM(BPF_B, BPF_REG_10, -1, 0), 2727 BPF_MOV64_IMM(BPF_REG_0, 0), 2728 BPF_EXIT_INSN(), 2729 }, 2730 .errstr_unpriv = "attempt to corrupt spilled", 2731 .result_unpriv = REJECT, 2732 .result = ACCEPT, 2733 }, 2734 { 2735 "unpriv: read pointer from stack in small chunks", 2736 .insns = { 2737 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8), 2738 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -8), 2739 BPF_MOV64_IMM(BPF_REG_0, 0), 2740 BPF_EXIT_INSN(), 2741 }, 2742 .errstr = "invalid size", 2743 .result = REJECT, 2744 }, 2745 { 2746 "unpriv: write pointer into ctx", 2747 .insns = { 2748 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, 0), 2749 BPF_MOV64_IMM(BPF_REG_0, 0), 2750 BPF_EXIT_INSN(), 2751 }, 2752 .errstr_unpriv = "R1 leaks addr", 2753 .result_unpriv = REJECT, 2754 .errstr = "invalid bpf_context access", 2755 .result = REJECT, 2756 }, 2757 { 2758 "unpriv: spill/fill of ctx", 2759 .insns = { 2760 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2761 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2762 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2763 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2764 BPF_MOV64_IMM(BPF_REG_0, 0), 2765 BPF_EXIT_INSN(), 2766 }, 2767 .result = ACCEPT, 2768 }, 2769 { 2770 "unpriv: spill/fill of ctx 2", 2771 .insns = { 2772 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2773 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2774 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2775 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2776 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2777 BPF_FUNC_get_hash_recalc), 2778 BPF_MOV64_IMM(BPF_REG_0, 0), 2779 BPF_EXIT_INSN(), 2780 }, 2781 .result = ACCEPT, 2782 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2783 }, 2784 { 2785 "unpriv: spill/fill of ctx 3", 2786 .insns = { 2787 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2788 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2789 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2790 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_10, 0), 2791 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2792 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2793 BPF_FUNC_get_hash_recalc), 2794 BPF_EXIT_INSN(), 2795 }, 2796 .result = REJECT, 2797 .errstr = "R1 type=fp expected=ctx", 2798 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2799 }, 2800 { 2801 "unpriv: spill/fill of ctx 4", 2802 .insns = { 2803 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2804 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2805 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2806 BPF_MOV64_IMM(BPF_REG_0, 1), 2807 BPF_RAW_INSN(BPF_STX | BPF_XADD | BPF_DW, BPF_REG_10, 2808 BPF_REG_0, -8, 0), 2809 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2810 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2811 BPF_FUNC_get_hash_recalc), 2812 BPF_EXIT_INSN(), 2813 }, 2814 .result = REJECT, 2815 .errstr = "R1 type=inv expected=ctx", 2816 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2817 }, 2818 { 2819 "unpriv: spill/fill of different pointers stx", 2820 .insns = { 2821 BPF_MOV64_IMM(BPF_REG_3, 42), 2822 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2823 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2824 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3), 2825 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 2826 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 2827 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0), 2828 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 2829 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2830 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2831 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_3, 2832 offsetof(struct __sk_buff, mark)), 2833 BPF_MOV64_IMM(BPF_REG_0, 0), 2834 BPF_EXIT_INSN(), 2835 }, 2836 .result = REJECT, 2837 .errstr = "same insn cannot be used with different pointers", 2838 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2839 }, 2840 { 2841 "unpriv: spill/fill of different pointers stx - ctx and sock", 2842 .insns = { 2843 BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 2844 /* struct bpf_sock *sock = bpf_sock_lookup(...); */ 2845 BPF_SK_LOOKUP, 2846 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 2847 /* u64 foo; */ 2848 /* void *target = &foo; */ 2849 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2850 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2851 BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 2852 /* if (skb == NULL) *target = sock; */ 2853 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 2854 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0), 2855 /* else *target = skb; */ 2856 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 2857 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2858 /* struct __sk_buff *skb = *target; */ 2859 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2860 /* skb->mark = 42; */ 2861 BPF_MOV64_IMM(BPF_REG_3, 42), 2862 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_3, 2863 offsetof(struct __sk_buff, mark)), 2864 /* if (sk) bpf_sk_release(sk) */ 2865 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 2866 BPF_EMIT_CALL(BPF_FUNC_sk_release), 2867 BPF_MOV64_IMM(BPF_REG_0, 0), 2868 BPF_EXIT_INSN(), 2869 }, 2870 .result = REJECT, 2871 .errstr = "type=ctx expected=sock", 2872 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2873 }, 2874 { 2875 "unpriv: spill/fill of different pointers stx - leak sock", 2876 .insns = { 2877 BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 2878 /* struct bpf_sock *sock = bpf_sock_lookup(...); */ 2879 BPF_SK_LOOKUP, 2880 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 2881 /* u64 foo; */ 2882 /* void *target = &foo; */ 2883 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2884 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2885 BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 2886 /* if (skb == NULL) *target = sock; */ 2887 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 2888 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0), 2889 /* else *target = skb; */ 2890 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 2891 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2892 /* struct __sk_buff *skb = *target; */ 2893 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2894 /* skb->mark = 42; */ 2895 BPF_MOV64_IMM(BPF_REG_3, 42), 2896 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_3, 2897 offsetof(struct __sk_buff, mark)), 2898 BPF_EXIT_INSN(), 2899 }, 2900 .result = REJECT, 2901 //.errstr = "same insn cannot be used with different pointers", 2902 .errstr = "Unreleased reference", 2903 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2904 }, 2905 { 2906 "unpriv: spill/fill of different pointers stx - sock and ctx (read)", 2907 .insns = { 2908 BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 2909 /* struct bpf_sock *sock = bpf_sock_lookup(...); */ 2910 BPF_SK_LOOKUP, 2911 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 2912 /* u64 foo; */ 2913 /* void *target = &foo; */ 2914 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2915 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2916 BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 2917 /* if (skb) *target = skb */ 2918 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 2919 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2920 /* else *target = sock */ 2921 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 2922 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0), 2923 /* struct bpf_sock *sk = *target; */ 2924 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2925 /* if (sk) u32 foo = sk->mark; bpf_sk_release(sk); */ 2926 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 2), 2927 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 2928 offsetof(struct bpf_sock, mark)), 2929 BPF_EMIT_CALL(BPF_FUNC_sk_release), 2930 BPF_MOV64_IMM(BPF_REG_0, 0), 2931 BPF_EXIT_INSN(), 2932 }, 2933 .result = REJECT, 2934 .errstr = "same insn cannot be used with different pointers", 2935 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2936 }, 2937 { 2938 "unpriv: spill/fill of different pointers stx - sock and ctx (write)", 2939 .insns = { 2940 BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 2941 /* struct bpf_sock *sock = bpf_sock_lookup(...); */ 2942 BPF_SK_LOOKUP, 2943 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 2944 /* u64 foo; */ 2945 /* void *target = &foo; */ 2946 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2947 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2948 BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 2949 /* if (skb) *target = skb */ 2950 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 2951 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2952 /* else *target = sock */ 2953 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 2954 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0), 2955 /* struct bpf_sock *sk = *target; */ 2956 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2957 /* if (sk) sk->mark = 42; bpf_sk_release(sk); */ 2958 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3), 2959 BPF_MOV64_IMM(BPF_REG_3, 42), 2960 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_3, 2961 offsetof(struct bpf_sock, mark)), 2962 BPF_EMIT_CALL(BPF_FUNC_sk_release), 2963 BPF_MOV64_IMM(BPF_REG_0, 0), 2964 BPF_EXIT_INSN(), 2965 }, 2966 .result = REJECT, 2967 //.errstr = "same insn cannot be used with different pointers", 2968 .errstr = "cannot write into socket", 2969 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2970 }, 2971 { 2972 "unpriv: spill/fill of different pointers ldx", 2973 .insns = { 2974 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2975 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2976 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3), 2977 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 2978 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 2979 -(__s32)offsetof(struct bpf_perf_event_data, 2980 sample_period) - 8), 2981 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0), 2982 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 2983 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2984 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2985 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, 2986 offsetof(struct bpf_perf_event_data, 2987 sample_period)), 2988 BPF_MOV64_IMM(BPF_REG_0, 0), 2989 BPF_EXIT_INSN(), 2990 }, 2991 .result = REJECT, 2992 .errstr = "same insn cannot be used with different pointers", 2993 .prog_type = BPF_PROG_TYPE_PERF_EVENT, 2994 }, 2995 { 2996 "unpriv: write pointer into map elem value", 2997 .insns = { 2998 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 2999 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 3000 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 3001 BPF_LD_MAP_FD(BPF_REG_1, 0), 3002 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3003 BPF_FUNC_map_lookup_elem), 3004 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 3005 BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0), 3006 BPF_EXIT_INSN(), 3007 }, 3008 .fixup_map_hash_8b = { 3 }, 3009 .errstr_unpriv = "R0 leaks addr", 3010 .result_unpriv = REJECT, 3011 .result = ACCEPT, 3012 }, 3013 { 3014 "alu32: mov u32 const", 3015 .insns = { 3016 BPF_MOV32_IMM(BPF_REG_7, 0), 3017 BPF_ALU32_IMM(BPF_AND, BPF_REG_7, 1), 3018 BPF_MOV32_REG(BPF_REG_0, BPF_REG_7), 3019 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 3020 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0), 3021 BPF_EXIT_INSN(), 3022 }, 3023 .result = ACCEPT, 3024 .retval = 0, 3025 }, 3026 { 3027 "unpriv: partial copy of pointer", 3028 .insns = { 3029 BPF_MOV32_REG(BPF_REG_1, BPF_REG_10), 3030 BPF_MOV64_IMM(BPF_REG_0, 0), 3031 BPF_EXIT_INSN(), 3032 }, 3033 .errstr_unpriv = "R10 partial copy", 3034 .result_unpriv = REJECT, 3035 .result = ACCEPT, 3036 }, 3037 { 3038 "unpriv: pass pointer to tail_call", 3039 .insns = { 3040 BPF_MOV64_REG(BPF_REG_3, BPF_REG_1), 3041 BPF_LD_MAP_FD(BPF_REG_2, 0), 3042 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3043 BPF_FUNC_tail_call), 3044 BPF_MOV64_IMM(BPF_REG_0, 0), 3045 BPF_EXIT_INSN(), 3046 }, 3047 .fixup_prog1 = { 1 }, 3048 .errstr_unpriv = "R3 leaks addr into helper", 3049 .result_unpriv = REJECT, 3050 .result = ACCEPT, 3051 }, 3052 { 3053 "unpriv: cmp map pointer with zero", 3054 .insns = { 3055 BPF_MOV64_IMM(BPF_REG_1, 0), 3056 BPF_LD_MAP_FD(BPF_REG_1, 0), 3057 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 0), 3058 BPF_MOV64_IMM(BPF_REG_0, 0), 3059 BPF_EXIT_INSN(), 3060 }, 3061 .fixup_map_hash_8b = { 1 }, 3062 .errstr_unpriv = "R1 pointer comparison", 3063 .result_unpriv = REJECT, 3064 .result = ACCEPT, 3065 }, 3066 { 3067 "unpriv: write into frame pointer", 3068 .insns = { 3069 BPF_MOV64_REG(BPF_REG_10, BPF_REG_1), 3070 BPF_MOV64_IMM(BPF_REG_0, 0), 3071 BPF_EXIT_INSN(), 3072 }, 3073 .errstr = "frame pointer is read only", 3074 .result = REJECT, 3075 }, 3076 { 3077 "unpriv: spill/fill frame pointer", 3078 .insns = { 3079 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3080 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 3081 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_10, 0), 3082 BPF_LDX_MEM(BPF_DW, BPF_REG_10, BPF_REG_6, 0), 3083 BPF_MOV64_IMM(BPF_REG_0, 0), 3084 BPF_EXIT_INSN(), 3085 }, 3086 .errstr = "frame pointer is read only", 3087 .result = REJECT, 3088 }, 3089 { 3090 "unpriv: cmp of frame pointer", 3091 .insns = { 3092 BPF_JMP_IMM(BPF_JEQ, BPF_REG_10, 0, 0), 3093 BPF_MOV64_IMM(BPF_REG_0, 0), 3094 BPF_EXIT_INSN(), 3095 }, 3096 .errstr_unpriv = "R10 pointer comparison", 3097 .result_unpriv = REJECT, 3098 .result = ACCEPT, 3099 }, 3100 { 3101 "unpriv: adding of fp", 3102 .insns = { 3103 BPF_MOV64_IMM(BPF_REG_0, 0), 3104 BPF_MOV64_IMM(BPF_REG_1, 0), 3105 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_10), 3106 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, -8), 3107 BPF_EXIT_INSN(), 3108 }, 3109 .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", 3110 .result_unpriv = REJECT, 3111 .result = ACCEPT, 3112 }, 3113 { 3114 "unpriv: cmp of stack pointer", 3115 .insns = { 3116 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 3117 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 3118 BPF_JMP_IMM(BPF_JEQ, BPF_REG_2, 0, 0), 3119 BPF_MOV64_IMM(BPF_REG_0, 0), 3120 BPF_EXIT_INSN(), 3121 }, 3122 .errstr_unpriv = "R2 pointer comparison", 3123 .result_unpriv = REJECT, 3124 .result = ACCEPT, 3125 }, 3126 { 3127 "runtime/jit: tail_call within bounds, prog once", 3128 .insns = { 3129 BPF_MOV64_IMM(BPF_REG_3, 0), 3130 BPF_LD_MAP_FD(BPF_REG_2, 0), 3131 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3132 BPF_FUNC_tail_call), 3133 BPF_MOV64_IMM(BPF_REG_0, 1), 3134 BPF_EXIT_INSN(), 3135 }, 3136 .fixup_prog1 = { 1 }, 3137 .result = ACCEPT, 3138 .retval = 42, 3139 }, 3140 { 3141 "runtime/jit: tail_call within bounds, prog loop", 3142 .insns = { 3143 BPF_MOV64_IMM(BPF_REG_3, 1), 3144 BPF_LD_MAP_FD(BPF_REG_2, 0), 3145 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3146 BPF_FUNC_tail_call), 3147 BPF_MOV64_IMM(BPF_REG_0, 1), 3148 BPF_EXIT_INSN(), 3149 }, 3150 .fixup_prog1 = { 1 }, 3151 .result = ACCEPT, 3152 .retval = 41, 3153 }, 3154 { 3155 "runtime/jit: tail_call within bounds, no prog", 3156 .insns = { 3157 BPF_MOV64_IMM(BPF_REG_3, 2), 3158 BPF_LD_MAP_FD(BPF_REG_2, 0), 3159 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3160 BPF_FUNC_tail_call), 3161 BPF_MOV64_IMM(BPF_REG_0, 1), 3162 BPF_EXIT_INSN(), 3163 }, 3164 .fixup_prog1 = { 1 }, 3165 .result = ACCEPT, 3166 .retval = 1, 3167 }, 3168 { 3169 "runtime/jit: tail_call out of bounds", 3170 .insns = { 3171 BPF_MOV64_IMM(BPF_REG_3, 256), 3172 BPF_LD_MAP_FD(BPF_REG_2, 0), 3173 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3174 BPF_FUNC_tail_call), 3175 BPF_MOV64_IMM(BPF_REG_0, 2), 3176 BPF_EXIT_INSN(), 3177 }, 3178 .fixup_prog1 = { 1 }, 3179 .result = ACCEPT, 3180 .retval = 2, 3181 }, 3182 { 3183 "runtime/jit: pass negative index to tail_call", 3184 .insns = { 3185 BPF_MOV64_IMM(BPF_REG_3, -1), 3186 BPF_LD_MAP_FD(BPF_REG_2, 0), 3187 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3188 BPF_FUNC_tail_call), 3189 BPF_MOV64_IMM(BPF_REG_0, 2), 3190 BPF_EXIT_INSN(), 3191 }, 3192 .fixup_prog1 = { 1 }, 3193 .result = ACCEPT, 3194 .retval = 2, 3195 }, 3196 { 3197 "runtime/jit: pass > 32bit index to tail_call", 3198 .insns = { 3199 BPF_LD_IMM64(BPF_REG_3, 0x100000000ULL), 3200 BPF_LD_MAP_FD(BPF_REG_2, 0), 3201 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3202 BPF_FUNC_tail_call), 3203 BPF_MOV64_IMM(BPF_REG_0, 2), 3204 BPF_EXIT_INSN(), 3205 }, 3206 .fixup_prog1 = { 2 }, 3207 .result = ACCEPT, 3208 .retval = 42, 3209 /* Verifier rewrite for unpriv skips tail call here. */ 3210 .retval_unpriv = 2, 3211 }, 3212 { 3213 "PTR_TO_STACK check high 1", 3214 .insns = { 3215 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3216 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -1), 3217 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), 3218 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 3219 BPF_EXIT_INSN(), 3220 }, 3221 .result = ACCEPT, 3222 .retval = 42, 3223 }, 3224 { 3225 "PTR_TO_STACK check high 2", 3226 .insns = { 3227 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3228 BPF_ST_MEM(BPF_B, BPF_REG_1, -1, 42), 3229 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, -1), 3230 BPF_EXIT_INSN(), 3231 }, 3232 .result = ACCEPT, 3233 .retval = 42, 3234 }, 3235 { 3236 "PTR_TO_STACK check high 3", 3237 .insns = { 3238 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3239 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0), 3240 BPF_ST_MEM(BPF_B, BPF_REG_1, -1, 42), 3241 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, -1), 3242 BPF_EXIT_INSN(), 3243 }, 3244 .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", 3245 .result_unpriv = REJECT, 3246 .result = ACCEPT, 3247 .retval = 42, 3248 }, 3249 { 3250 "PTR_TO_STACK check high 4", 3251 .insns = { 3252 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3253 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0), 3254 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), 3255 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 3256 BPF_EXIT_INSN(), 3257 }, 3258 .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", 3259 .errstr = "invalid stack off=0 size=1", 3260 .result = REJECT, 3261 }, 3262 { 3263 "PTR_TO_STACK check high 5", 3264 .insns = { 3265 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3266 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, (1 << 29) - 1), 3267 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), 3268 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 3269 BPF_EXIT_INSN(), 3270 }, 3271 .result = REJECT, 3272 .errstr = "invalid stack off", 3273 }, 3274 { 3275 "PTR_TO_STACK check high 6", 3276 .insns = { 3277 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3278 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, (1 << 29) - 1), 3279 BPF_ST_MEM(BPF_B, BPF_REG_1, SHRT_MAX, 42), 3280 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, SHRT_MAX), 3281 BPF_EXIT_INSN(), 3282 }, 3283 .result = REJECT, 3284 .errstr = "invalid stack off", 3285 }, 3286 { 3287 "PTR_TO_STACK check high 7", 3288 .insns = { 3289 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3290 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, (1 << 29) - 1), 3291 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, (1 << 29) - 1), 3292 BPF_ST_MEM(BPF_B, BPF_REG_1, SHRT_MAX, 42), 3293 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, SHRT_MAX), 3294 BPF_EXIT_INSN(), 3295 }, 3296 .result = REJECT, 3297 .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", 3298 .errstr = "fp pointer offset", 3299 }, 3300 { 3301 "PTR_TO_STACK check low 1", 3302 .insns = { 3303 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3304 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -512), 3305 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), 3306 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 3307 BPF_EXIT_INSN(), 3308 }, 3309 .result = ACCEPT, 3310 .retval = 42, 3311 }, 3312 { 3313 "PTR_TO_STACK check low 2", 3314 .insns = { 3315 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3316 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -513), 3317 BPF_ST_MEM(BPF_B, BPF_REG_1, 1, 42), 3318 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1), 3319 BPF_EXIT_INSN(), 3320 }, 3321 .result_unpriv = REJECT, 3322 .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", 3323 .result = ACCEPT, 3324 .retval = 42, 3325 }, 3326 { 3327 "PTR_TO_STACK check low 3", 3328 .insns = { 3329 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3330 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -513), 3331 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), 3332 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 3333 BPF_EXIT_INSN(), 3334 }, 3335 .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", 3336 .errstr = "invalid stack off=-513 size=1", 3337 .result = REJECT, 3338 }, 3339 { 3340 "PTR_TO_STACK check low 4", 3341 .insns = { 3342 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3343 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, INT_MIN), 3344 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), 3345 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 3346 BPF_EXIT_INSN(), 3347 }, 3348 .result = REJECT, 3349 .errstr = "math between fp pointer", 3350 }, 3351 { 3352 "PTR_TO_STACK check low 5", 3353 .insns = { 3354 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3355 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -((1 << 29) - 1)), 3356 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), 3357 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 3358 BPF_EXIT_INSN(), 3359 }, 3360 .result = REJECT, 3361 .errstr = "invalid stack off", 3362 }, 3363 { 3364 "PTR_TO_STACK check low 6", 3365 .insns = { 3366 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3367 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -((1 << 29) - 1)), 3368 BPF_ST_MEM(BPF_B, BPF_REG_1, SHRT_MIN, 42), 3369 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, SHRT_MIN), 3370 BPF_EXIT_INSN(), 3371 }, 3372 .result = REJECT, 3373 .errstr = "invalid stack off", 3374 }, 3375 { 3376 "PTR_TO_STACK check low 7", 3377 .insns = { 3378 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3379 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -((1 << 29) - 1)), 3380 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -((1 << 29) - 1)), 3381 BPF_ST_MEM(BPF_B, BPF_REG_1, SHRT_MIN, 42), 3382 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, SHRT_MIN), 3383 BPF_EXIT_INSN(), 3384 }, 3385 .result = REJECT, 3386 .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", 3387 .errstr = "fp pointer offset", 3388 }, 3389 { 3390 "PTR_TO_STACK mixed reg/k, 1", 3391 .insns = { 3392 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3393 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -3), 3394 BPF_MOV64_IMM(BPF_REG_2, -3), 3395 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 3396 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), 3397 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 3398 BPF_EXIT_INSN(), 3399 }, 3400 .result = ACCEPT, 3401 .retval = 42, 3402 }, 3403 { 3404 "PTR_TO_STACK mixed reg/k, 2", 3405 .insns = { 3406 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 3407 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, 0), 3408 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3409 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -3), 3410 BPF_MOV64_IMM(BPF_REG_2, -3), 3411 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 3412 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), 3413 BPF_MOV64_REG(BPF_REG_5, BPF_REG_10), 3414 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_5, -6), 3415 BPF_EXIT_INSN(), 3416 }, 3417 .result = ACCEPT, 3418 .retval = 42, 3419 }, 3420 { 3421 "PTR_TO_STACK mixed reg/k, 3", 3422 .insns = { 3423 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3424 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -3), 3425 BPF_MOV64_IMM(BPF_REG_2, -3), 3426 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 3427 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), 3428 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3429 BPF_EXIT_INSN(), 3430 }, 3431 .result = ACCEPT, 3432 .retval = -3, 3433 }, 3434 { 3435 "PTR_TO_STACK reg", 3436 .insns = { 3437 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3438 BPF_MOV64_IMM(BPF_REG_2, -3), 3439 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 3440 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), 3441 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 3442 BPF_EXIT_INSN(), 3443 }, 3444 .result_unpriv = REJECT, 3445 .errstr_unpriv = "invalid stack off=0 size=1", 3446 .result = ACCEPT, 3447 .retval = 42, 3448 }, 3449 { 3450 "stack pointer arithmetic", 3451 .insns = { 3452 BPF_MOV64_IMM(BPF_REG_1, 4), 3453 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 3454 BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 3455 BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -10), 3456 BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -10), 3457 BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 3458 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_1), 3459 BPF_ST_MEM(0, BPF_REG_2, 4, 0), 3460 BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 3461 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8), 3462 BPF_ST_MEM(0, BPF_REG_2, 4, 0), 3463 BPF_MOV64_IMM(BPF_REG_0, 0), 3464 BPF_EXIT_INSN(), 3465 }, 3466 .result = ACCEPT, 3467 }, 3468 { 3469 "raw_stack: no skb_load_bytes", 3470 .insns = { 3471 BPF_MOV64_IMM(BPF_REG_2, 4), 3472 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3473 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 3474 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3475 BPF_MOV64_IMM(BPF_REG_4, 8), 3476 /* Call to skb_load_bytes() omitted. */ 3477 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3478 BPF_EXIT_INSN(), 3479 }, 3480 .result = REJECT, 3481 .errstr = "invalid read from stack off -8+0 size 8", 3482 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3483 }, 3484 { 3485 "raw_stack: skb_load_bytes, negative len", 3486 .insns = { 3487 BPF_MOV64_IMM(BPF_REG_2, 4), 3488 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3489 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 3490 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3491 BPF_MOV64_IMM(BPF_REG_4, -8), 3492 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3493 BPF_FUNC_skb_load_bytes), 3494 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3495 BPF_EXIT_INSN(), 3496 }, 3497 .result = REJECT, 3498 .errstr = "R4 min value is negative", 3499 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3500 }, 3501 { 3502 "raw_stack: skb_load_bytes, negative len 2", 3503 .insns = { 3504 BPF_MOV64_IMM(BPF_REG_2, 4), 3505 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3506 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 3507 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3508 BPF_MOV64_IMM(BPF_REG_4, ~0), 3509 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3510 BPF_FUNC_skb_load_bytes), 3511 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3512 BPF_EXIT_INSN(), 3513 }, 3514 .result = REJECT, 3515 .errstr = "R4 min value is negative", 3516 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3517 }, 3518 { 3519 "raw_stack: skb_load_bytes, zero len", 3520 .insns = { 3521 BPF_MOV64_IMM(BPF_REG_2, 4), 3522 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3523 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 3524 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3525 BPF_MOV64_IMM(BPF_REG_4, 0), 3526 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3527 BPF_FUNC_skb_load_bytes), 3528 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3529 BPF_EXIT_INSN(), 3530 }, 3531 .result = REJECT, 3532 .errstr = "invalid stack type R3", 3533 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3534 }, 3535 { 3536 "raw_stack: skb_load_bytes, no init", 3537 .insns = { 3538 BPF_MOV64_IMM(BPF_REG_2, 4), 3539 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3540 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 3541 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3542 BPF_MOV64_IMM(BPF_REG_4, 8), 3543 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3544 BPF_FUNC_skb_load_bytes), 3545 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3546 BPF_EXIT_INSN(), 3547 }, 3548 .result = ACCEPT, 3549 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3550 }, 3551 { 3552 "raw_stack: skb_load_bytes, init", 3553 .insns = { 3554 BPF_MOV64_IMM(BPF_REG_2, 4), 3555 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3556 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 3557 BPF_ST_MEM(BPF_DW, BPF_REG_6, 0, 0xcafe), 3558 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3559 BPF_MOV64_IMM(BPF_REG_4, 8), 3560 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3561 BPF_FUNC_skb_load_bytes), 3562 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3563 BPF_EXIT_INSN(), 3564 }, 3565 .result = ACCEPT, 3566 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3567 }, 3568 { 3569 "raw_stack: skb_load_bytes, spilled regs around bounds", 3570 .insns = { 3571 BPF_MOV64_IMM(BPF_REG_2, 4), 3572 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3573 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -16), 3574 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, -8), 3575 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 8), 3576 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3577 BPF_MOV64_IMM(BPF_REG_4, 8), 3578 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3579 BPF_FUNC_skb_load_bytes), 3580 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, -8), 3581 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6, 8), 3582 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 3583 offsetof(struct __sk_buff, mark)), 3584 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_2, 3585 offsetof(struct __sk_buff, priority)), 3586 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 3587 BPF_EXIT_INSN(), 3588 }, 3589 .result = ACCEPT, 3590 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3591 }, 3592 { 3593 "raw_stack: skb_load_bytes, spilled regs corruption", 3594 .insns = { 3595 BPF_MOV64_IMM(BPF_REG_2, 4), 3596 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3597 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 3598 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 3599 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3600 BPF_MOV64_IMM(BPF_REG_4, 8), 3601 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3602 BPF_FUNC_skb_load_bytes), 3603 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3604 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 3605 offsetof(struct __sk_buff, mark)), 3606 BPF_EXIT_INSN(), 3607 }, 3608 .result = REJECT, 3609 .errstr = "R0 invalid mem access 'inv'", 3610 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3611 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 3612 }, 3613 { 3614 "raw_stack: skb_load_bytes, spilled regs corruption 2", 3615 .insns = { 3616 BPF_MOV64_IMM(BPF_REG_2, 4), 3617 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3618 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -16), 3619 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, -8), 3620 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 3621 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 8), 3622 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3623 BPF_MOV64_IMM(BPF_REG_4, 8), 3624 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3625 BPF_FUNC_skb_load_bytes), 3626 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, -8), 3627 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6, 8), 3628 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_6, 0), 3629 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 3630 offsetof(struct __sk_buff, mark)), 3631 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_2, 3632 offsetof(struct __sk_buff, priority)), 3633 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 3634 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_3, 3635 offsetof(struct __sk_buff, pkt_type)), 3636 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_3), 3637 BPF_EXIT_INSN(), 3638 }, 3639 .result = REJECT, 3640 .errstr = "R3 invalid mem access 'inv'", 3641 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3642 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 3643 }, 3644 { 3645 "raw_stack: skb_load_bytes, spilled regs + data", 3646 .insns = { 3647 BPF_MOV64_IMM(BPF_REG_2, 4), 3648 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3649 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -16), 3650 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, -8), 3651 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 3652 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 8), 3653 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3654 BPF_MOV64_IMM(BPF_REG_4, 8), 3655 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3656 BPF_FUNC_skb_load_bytes), 3657 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, -8), 3658 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6, 8), 3659 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_6, 0), 3660 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 3661 offsetof(struct __sk_buff, mark)), 3662 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_2, 3663 offsetof(struct __sk_buff, priority)), 3664 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 3665 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_3), 3666 BPF_EXIT_INSN(), 3667 }, 3668 .result = ACCEPT, 3669 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3670 }, 3671 { 3672 "raw_stack: skb_load_bytes, invalid access 1", 3673 .insns = { 3674 BPF_MOV64_IMM(BPF_REG_2, 4), 3675 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3676 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -513), 3677 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3678 BPF_MOV64_IMM(BPF_REG_4, 8), 3679 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3680 BPF_FUNC_skb_load_bytes), 3681 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3682 BPF_EXIT_INSN(), 3683 }, 3684 .result = REJECT, 3685 .errstr = "invalid stack type R3 off=-513 access_size=8", 3686 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3687 }, 3688 { 3689 "raw_stack: skb_load_bytes, invalid access 2", 3690 .insns = { 3691 BPF_MOV64_IMM(BPF_REG_2, 4), 3692 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3693 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -1), 3694 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3695 BPF_MOV64_IMM(BPF_REG_4, 8), 3696 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3697 BPF_FUNC_skb_load_bytes), 3698 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3699 BPF_EXIT_INSN(), 3700 }, 3701 .result = REJECT, 3702 .errstr = "invalid stack type R3 off=-1 access_size=8", 3703 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3704 }, 3705 { 3706 "raw_stack: skb_load_bytes, invalid access 3", 3707 .insns = { 3708 BPF_MOV64_IMM(BPF_REG_2, 4), 3709 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3710 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 0xffffffff), 3711 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3712 BPF_MOV64_IMM(BPF_REG_4, 0xffffffff), 3713 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3714 BPF_FUNC_skb_load_bytes), 3715 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3716 BPF_EXIT_INSN(), 3717 }, 3718 .result = REJECT, 3719 .errstr = "R4 min value is negative", 3720 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3721 }, 3722 { 3723 "raw_stack: skb_load_bytes, invalid access 4", 3724 .insns = { 3725 BPF_MOV64_IMM(BPF_REG_2, 4), 3726 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3727 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -1), 3728 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3729 BPF_MOV64_IMM(BPF_REG_4, 0x7fffffff), 3730 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3731 BPF_FUNC_skb_load_bytes), 3732 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3733 BPF_EXIT_INSN(), 3734 }, 3735 .result = REJECT, 3736 .errstr = "R4 unbounded memory access, use 'var &= const' or 'if (var < const)'", 3737 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3738 }, 3739 { 3740 "raw_stack: skb_load_bytes, invalid access 5", 3741 .insns = { 3742 BPF_MOV64_IMM(BPF_REG_2, 4), 3743 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3744 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -512), 3745 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3746 BPF_MOV64_IMM(BPF_REG_4, 0x7fffffff), 3747 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3748 BPF_FUNC_skb_load_bytes), 3749 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3750 BPF_EXIT_INSN(), 3751 }, 3752 .result = REJECT, 3753 .errstr = "R4 unbounded memory access, use 'var &= const' or 'if (var < const)'", 3754 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3755 }, 3756 { 3757 "raw_stack: skb_load_bytes, invalid access 6", 3758 .insns = { 3759 BPF_MOV64_IMM(BPF_REG_2, 4), 3760 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3761 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -512), 3762 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3763 BPF_MOV64_IMM(BPF_REG_4, 0), 3764 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3765 BPF_FUNC_skb_load_bytes), 3766 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3767 BPF_EXIT_INSN(), 3768 }, 3769 .result = REJECT, 3770 .errstr = "invalid stack type R3 off=-512 access_size=0", 3771 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3772 }, 3773 { 3774 "raw_stack: skb_load_bytes, large access", 3775 .insns = { 3776 BPF_MOV64_IMM(BPF_REG_2, 4), 3777 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3778 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -512), 3779 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3780 BPF_MOV64_IMM(BPF_REG_4, 512), 3781 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3782 BPF_FUNC_skb_load_bytes), 3783 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3784 BPF_EXIT_INSN(), 3785 }, 3786 .result = ACCEPT, 3787 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3788 }, 3789 { 3790 "context stores via ST", 3791 .insns = { 3792 BPF_MOV64_IMM(BPF_REG_0, 0), 3793 BPF_ST_MEM(BPF_DW, BPF_REG_1, offsetof(struct __sk_buff, mark), 0), 3794 BPF_EXIT_INSN(), 3795 }, 3796 .errstr = "BPF_ST stores into R1 ctx is not allowed", 3797 .result = REJECT, 3798 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3799 }, 3800 { 3801 "context stores via XADD", 3802 .insns = { 3803 BPF_MOV64_IMM(BPF_REG_0, 0), 3804 BPF_RAW_INSN(BPF_STX | BPF_XADD | BPF_W, BPF_REG_1, 3805 BPF_REG_0, offsetof(struct __sk_buff, mark), 0), 3806 BPF_EXIT_INSN(), 3807 }, 3808 .errstr = "BPF_XADD stores into R1 ctx is not allowed", 3809 .result = REJECT, 3810 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3811 }, 3812 { 3813 "direct packet access: test1", 3814 .insns = { 3815 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3816 offsetof(struct __sk_buff, data)), 3817 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3818 offsetof(struct __sk_buff, data_end)), 3819 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3820 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3821 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 3822 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3823 BPF_MOV64_IMM(BPF_REG_0, 0), 3824 BPF_EXIT_INSN(), 3825 }, 3826 .result = ACCEPT, 3827 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3828 }, 3829 { 3830 "direct packet access: test2", 3831 .insns = { 3832 BPF_MOV64_IMM(BPF_REG_0, 1), 3833 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 3834 offsetof(struct __sk_buff, data_end)), 3835 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3836 offsetof(struct __sk_buff, data)), 3837 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3), 3838 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 14), 3839 BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_4, 15), 3840 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_3, 7), 3841 BPF_LDX_MEM(BPF_B, BPF_REG_4, BPF_REG_3, 12), 3842 BPF_ALU64_IMM(BPF_MUL, BPF_REG_4, 14), 3843 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3844 offsetof(struct __sk_buff, data)), 3845 BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_4), 3846 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3847 offsetof(struct __sk_buff, len)), 3848 BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 49), 3849 BPF_ALU64_IMM(BPF_RSH, BPF_REG_2, 49), 3850 BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_2), 3851 BPF_MOV64_REG(BPF_REG_2, BPF_REG_3), 3852 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8), 3853 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 3854 offsetof(struct __sk_buff, data_end)), 3855 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1), 3856 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_3, 4), 3857 BPF_MOV64_IMM(BPF_REG_0, 0), 3858 BPF_EXIT_INSN(), 3859 }, 3860 .result = ACCEPT, 3861 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3862 }, 3863 { 3864 "direct packet access: test3", 3865 .insns = { 3866 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3867 offsetof(struct __sk_buff, data)), 3868 BPF_MOV64_IMM(BPF_REG_0, 0), 3869 BPF_EXIT_INSN(), 3870 }, 3871 .errstr = "invalid bpf_context access off=76", 3872 .result = REJECT, 3873 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 3874 }, 3875 { 3876 "direct packet access: test4 (write)", 3877 .insns = { 3878 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3879 offsetof(struct __sk_buff, data)), 3880 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3881 offsetof(struct __sk_buff, data_end)), 3882 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3883 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3884 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 3885 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 3886 BPF_MOV64_IMM(BPF_REG_0, 0), 3887 BPF_EXIT_INSN(), 3888 }, 3889 .result = ACCEPT, 3890 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3891 }, 3892 { 3893 "direct packet access: test5 (pkt_end >= reg, good access)", 3894 .insns = { 3895 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3896 offsetof(struct __sk_buff, data)), 3897 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3898 offsetof(struct __sk_buff, data_end)), 3899 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3900 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3901 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 2), 3902 BPF_MOV64_IMM(BPF_REG_0, 1), 3903 BPF_EXIT_INSN(), 3904 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3905 BPF_MOV64_IMM(BPF_REG_0, 0), 3906 BPF_EXIT_INSN(), 3907 }, 3908 .result = ACCEPT, 3909 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3910 }, 3911 { 3912 "direct packet access: test6 (pkt_end >= reg, bad access)", 3913 .insns = { 3914 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3915 offsetof(struct __sk_buff, data)), 3916 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3917 offsetof(struct __sk_buff, data_end)), 3918 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3919 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3920 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 3), 3921 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3922 BPF_MOV64_IMM(BPF_REG_0, 1), 3923 BPF_EXIT_INSN(), 3924 BPF_MOV64_IMM(BPF_REG_0, 0), 3925 BPF_EXIT_INSN(), 3926 }, 3927 .errstr = "invalid access to packet", 3928 .result = REJECT, 3929 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3930 }, 3931 { 3932 "direct packet access: test7 (pkt_end >= reg, both accesses)", 3933 .insns = { 3934 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3935 offsetof(struct __sk_buff, data)), 3936 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3937 offsetof(struct __sk_buff, data_end)), 3938 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3939 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3940 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 3), 3941 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3942 BPF_MOV64_IMM(BPF_REG_0, 1), 3943 BPF_EXIT_INSN(), 3944 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3945 BPF_MOV64_IMM(BPF_REG_0, 0), 3946 BPF_EXIT_INSN(), 3947 }, 3948 .errstr = "invalid access to packet", 3949 .result = REJECT, 3950 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3951 }, 3952 { 3953 "direct packet access: test8 (double test, variant 1)", 3954 .insns = { 3955 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3956 offsetof(struct __sk_buff, data)), 3957 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3958 offsetof(struct __sk_buff, data_end)), 3959 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3960 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3961 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 4), 3962 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 3963 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3964 BPF_MOV64_IMM(BPF_REG_0, 1), 3965 BPF_EXIT_INSN(), 3966 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3967 BPF_MOV64_IMM(BPF_REG_0, 0), 3968 BPF_EXIT_INSN(), 3969 }, 3970 .result = ACCEPT, 3971 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3972 }, 3973 { 3974 "direct packet access: test9 (double test, variant 2)", 3975 .insns = { 3976 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3977 offsetof(struct __sk_buff, data)), 3978 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3979 offsetof(struct __sk_buff, data_end)), 3980 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3981 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3982 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 2), 3983 BPF_MOV64_IMM(BPF_REG_0, 1), 3984 BPF_EXIT_INSN(), 3985 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 3986 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3987 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3988 BPF_MOV64_IMM(BPF_REG_0, 0), 3989 BPF_EXIT_INSN(), 3990 }, 3991 .result = ACCEPT, 3992 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3993 }, 3994 { 3995 "direct packet access: test10 (write invalid)", 3996 .insns = { 3997 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3998 offsetof(struct __sk_buff, data)), 3999 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4000 offsetof(struct __sk_buff, data_end)), 4001 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4002 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4003 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 4004 BPF_MOV64_IMM(BPF_REG_0, 0), 4005 BPF_EXIT_INSN(), 4006 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 4007 BPF_MOV64_IMM(BPF_REG_0, 0), 4008 BPF_EXIT_INSN(), 4009 }, 4010 .errstr = "invalid access to packet", 4011 .result = REJECT, 4012 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4013 }, 4014 { 4015 "direct packet access: test11 (shift, good access)", 4016 .insns = { 4017 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4018 offsetof(struct __sk_buff, data)), 4019 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4020 offsetof(struct __sk_buff, data_end)), 4021 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4022 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22), 4023 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 8), 4024 BPF_MOV64_IMM(BPF_REG_3, 144), 4025 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3), 4026 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 23), 4027 BPF_ALU64_IMM(BPF_RSH, BPF_REG_5, 3), 4028 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 4029 BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5), 4030 BPF_MOV64_IMM(BPF_REG_0, 1), 4031 BPF_EXIT_INSN(), 4032 BPF_MOV64_IMM(BPF_REG_0, 0), 4033 BPF_EXIT_INSN(), 4034 }, 4035 .result = ACCEPT, 4036 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4037 .retval = 1, 4038 }, 4039 { 4040 "direct packet access: test12 (and, good access)", 4041 .insns = { 4042 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4043 offsetof(struct __sk_buff, data)), 4044 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4045 offsetof(struct __sk_buff, data_end)), 4046 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4047 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22), 4048 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 8), 4049 BPF_MOV64_IMM(BPF_REG_3, 144), 4050 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3), 4051 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 23), 4052 BPF_ALU64_IMM(BPF_AND, BPF_REG_5, 15), 4053 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 4054 BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5), 4055 BPF_MOV64_IMM(BPF_REG_0, 1), 4056 BPF_EXIT_INSN(), 4057 BPF_MOV64_IMM(BPF_REG_0, 0), 4058 BPF_EXIT_INSN(), 4059 }, 4060 .result = ACCEPT, 4061 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4062 .retval = 1, 4063 }, 4064 { 4065 "direct packet access: test13 (branches, good access)", 4066 .insns = { 4067 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4068 offsetof(struct __sk_buff, data)), 4069 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4070 offsetof(struct __sk_buff, data_end)), 4071 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4072 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22), 4073 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 13), 4074 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4075 offsetof(struct __sk_buff, mark)), 4076 BPF_MOV64_IMM(BPF_REG_4, 1), 4077 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_4, 2), 4078 BPF_MOV64_IMM(BPF_REG_3, 14), 4079 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 4080 BPF_MOV64_IMM(BPF_REG_3, 24), 4081 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3), 4082 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 23), 4083 BPF_ALU64_IMM(BPF_AND, BPF_REG_5, 15), 4084 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 4085 BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5), 4086 BPF_MOV64_IMM(BPF_REG_0, 1), 4087 BPF_EXIT_INSN(), 4088 BPF_MOV64_IMM(BPF_REG_0, 0), 4089 BPF_EXIT_INSN(), 4090 }, 4091 .result = ACCEPT, 4092 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4093 .retval = 1, 4094 }, 4095 { 4096 "direct packet access: test14 (pkt_ptr += 0, CONST_IMM, good access)", 4097 .insns = { 4098 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4099 offsetof(struct __sk_buff, data)), 4100 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4101 offsetof(struct __sk_buff, data_end)), 4102 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4103 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22), 4104 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 7), 4105 BPF_MOV64_IMM(BPF_REG_5, 12), 4106 BPF_ALU64_IMM(BPF_RSH, BPF_REG_5, 4), 4107 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 4108 BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5), 4109 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_6, 0), 4110 BPF_MOV64_IMM(BPF_REG_0, 1), 4111 BPF_EXIT_INSN(), 4112 BPF_MOV64_IMM(BPF_REG_0, 0), 4113 BPF_EXIT_INSN(), 4114 }, 4115 .result = ACCEPT, 4116 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4117 .retval = 1, 4118 }, 4119 { 4120 "direct packet access: test15 (spill with xadd)", 4121 .insns = { 4122 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4123 offsetof(struct __sk_buff, data)), 4124 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4125 offsetof(struct __sk_buff, data_end)), 4126 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4127 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4128 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 8), 4129 BPF_MOV64_IMM(BPF_REG_5, 4096), 4130 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 4131 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 4132 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 4133 BPF_STX_XADD(BPF_DW, BPF_REG_4, BPF_REG_5, 0), 4134 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0), 4135 BPF_STX_MEM(BPF_W, BPF_REG_2, BPF_REG_5, 0), 4136 BPF_MOV64_IMM(BPF_REG_0, 0), 4137 BPF_EXIT_INSN(), 4138 }, 4139 .errstr = "R2 invalid mem access 'inv'", 4140 .result = REJECT, 4141 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4142 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4143 }, 4144 { 4145 "direct packet access: test16 (arith on data_end)", 4146 .insns = { 4147 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4148 offsetof(struct __sk_buff, data)), 4149 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4150 offsetof(struct __sk_buff, data_end)), 4151 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4152 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4153 BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, 16), 4154 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 4155 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 4156 BPF_MOV64_IMM(BPF_REG_0, 0), 4157 BPF_EXIT_INSN(), 4158 }, 4159 .errstr = "R3 pointer arithmetic on pkt_end", 4160 .result = REJECT, 4161 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4162 }, 4163 { 4164 "direct packet access: test17 (pruning, alignment)", 4165 .insns = { 4166 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4167 offsetof(struct __sk_buff, data)), 4168 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4169 offsetof(struct __sk_buff, data_end)), 4170 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4171 offsetof(struct __sk_buff, mark)), 4172 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4173 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 14), 4174 BPF_JMP_IMM(BPF_JGT, BPF_REG_7, 1, 4), 4175 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 4176 BPF_STX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, -4), 4177 BPF_MOV64_IMM(BPF_REG_0, 0), 4178 BPF_EXIT_INSN(), 4179 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 4180 BPF_JMP_A(-6), 4181 }, 4182 .errstr = "misaligned packet access off 2+(0x0; 0x0)+15+-4 size 4", 4183 .result = REJECT, 4184 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4185 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 4186 }, 4187 { 4188 "direct packet access: test18 (imm += pkt_ptr, 1)", 4189 .insns = { 4190 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4191 offsetof(struct __sk_buff, data)), 4192 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4193 offsetof(struct __sk_buff, data_end)), 4194 BPF_MOV64_IMM(BPF_REG_0, 8), 4195 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 4196 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 4197 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 4198 BPF_MOV64_IMM(BPF_REG_0, 0), 4199 BPF_EXIT_INSN(), 4200 }, 4201 .result = ACCEPT, 4202 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4203 }, 4204 { 4205 "direct packet access: test19 (imm += pkt_ptr, 2)", 4206 .insns = { 4207 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4208 offsetof(struct __sk_buff, data)), 4209 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4210 offsetof(struct __sk_buff, data_end)), 4211 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4212 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4213 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 4214 BPF_MOV64_IMM(BPF_REG_4, 4), 4215 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_2), 4216 BPF_STX_MEM(BPF_B, BPF_REG_4, BPF_REG_4, 0), 4217 BPF_MOV64_IMM(BPF_REG_0, 0), 4218 BPF_EXIT_INSN(), 4219 }, 4220 .result = ACCEPT, 4221 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4222 }, 4223 { 4224 "direct packet access: test20 (x += pkt_ptr, 1)", 4225 .insns = { 4226 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4227 offsetof(struct __sk_buff, data)), 4228 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4229 offsetof(struct __sk_buff, data_end)), 4230 BPF_MOV64_IMM(BPF_REG_0, 0xffffffff), 4231 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 4232 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 4233 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0x7fff), 4234 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 4235 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_2), 4236 BPF_MOV64_REG(BPF_REG_5, BPF_REG_4), 4237 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 0x7fff - 1), 4238 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1), 4239 BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_4, 0), 4240 BPF_MOV64_IMM(BPF_REG_0, 0), 4241 BPF_EXIT_INSN(), 4242 }, 4243 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4244 .result = ACCEPT, 4245 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4246 }, 4247 { 4248 "direct packet access: test21 (x += pkt_ptr, 2)", 4249 .insns = { 4250 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4251 offsetof(struct __sk_buff, data)), 4252 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4253 offsetof(struct __sk_buff, data_end)), 4254 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4255 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4256 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 9), 4257 BPF_MOV64_IMM(BPF_REG_4, 0xffffffff), 4258 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_4, -8), 4259 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 4260 BPF_ALU64_IMM(BPF_AND, BPF_REG_4, 0x7fff), 4261 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_2), 4262 BPF_MOV64_REG(BPF_REG_5, BPF_REG_4), 4263 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 0x7fff - 1), 4264 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1), 4265 BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_4, 0), 4266 BPF_MOV64_IMM(BPF_REG_0, 0), 4267 BPF_EXIT_INSN(), 4268 }, 4269 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4270 .result = ACCEPT, 4271 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4272 }, 4273 { 4274 "direct packet access: test22 (x += pkt_ptr, 3)", 4275 .insns = { 4276 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4277 offsetof(struct __sk_buff, data)), 4278 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4279 offsetof(struct __sk_buff, data_end)), 4280 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4281 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4282 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -8), 4283 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_3, -16), 4284 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_10, -16), 4285 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 11), 4286 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -8), 4287 BPF_MOV64_IMM(BPF_REG_4, 0xffffffff), 4288 BPF_STX_XADD(BPF_DW, BPF_REG_10, BPF_REG_4, -8), 4289 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 4290 BPF_ALU64_IMM(BPF_RSH, BPF_REG_4, 49), 4291 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_2), 4292 BPF_MOV64_REG(BPF_REG_0, BPF_REG_4), 4293 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 2), 4294 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 4295 BPF_MOV64_IMM(BPF_REG_2, 1), 4296 BPF_STX_MEM(BPF_H, BPF_REG_4, BPF_REG_2, 0), 4297 BPF_MOV64_IMM(BPF_REG_0, 0), 4298 BPF_EXIT_INSN(), 4299 }, 4300 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4301 .result = ACCEPT, 4302 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4303 }, 4304 { 4305 "direct packet access: test23 (x += pkt_ptr, 4)", 4306 .insns = { 4307 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4308 offsetof(struct __sk_buff, data)), 4309 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4310 offsetof(struct __sk_buff, data_end)), 4311 BPF_MOV64_IMM(BPF_REG_0, 0xffffffff), 4312 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 4313 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 4314 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0xffff), 4315 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 4316 BPF_MOV64_IMM(BPF_REG_0, 31), 4317 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_4), 4318 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 4319 BPF_MOV64_REG(BPF_REG_5, BPF_REG_0), 4320 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0xffff - 1), 4321 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 4322 BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_0, 0), 4323 BPF_MOV64_IMM(BPF_REG_0, 0), 4324 BPF_EXIT_INSN(), 4325 }, 4326 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4327 .result = REJECT, 4328 .errstr = "invalid access to packet, off=0 size=8, R5(id=1,off=0,r=0)", 4329 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4330 }, 4331 { 4332 "direct packet access: test24 (x += pkt_ptr, 5)", 4333 .insns = { 4334 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4335 offsetof(struct __sk_buff, data)), 4336 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4337 offsetof(struct __sk_buff, data_end)), 4338 BPF_MOV64_IMM(BPF_REG_0, 0xffffffff), 4339 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 4340 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 4341 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0xff), 4342 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 4343 BPF_MOV64_IMM(BPF_REG_0, 64), 4344 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_4), 4345 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 4346 BPF_MOV64_REG(BPF_REG_5, BPF_REG_0), 4347 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x7fff - 1), 4348 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 4349 BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_0, 0), 4350 BPF_MOV64_IMM(BPF_REG_0, 0), 4351 BPF_EXIT_INSN(), 4352 }, 4353 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4354 .result = ACCEPT, 4355 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4356 }, 4357 { 4358 "direct packet access: test25 (marking on <, good access)", 4359 .insns = { 4360 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4361 offsetof(struct __sk_buff, data)), 4362 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4363 offsetof(struct __sk_buff, data_end)), 4364 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4365 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4366 BPF_JMP_REG(BPF_JLT, BPF_REG_0, BPF_REG_3, 2), 4367 BPF_MOV64_IMM(BPF_REG_0, 0), 4368 BPF_EXIT_INSN(), 4369 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 4370 BPF_JMP_IMM(BPF_JA, 0, 0, -4), 4371 }, 4372 .result = ACCEPT, 4373 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4374 }, 4375 { 4376 "direct packet access: test26 (marking on <, bad access)", 4377 .insns = { 4378 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4379 offsetof(struct __sk_buff, data)), 4380 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4381 offsetof(struct __sk_buff, data_end)), 4382 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4383 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4384 BPF_JMP_REG(BPF_JLT, BPF_REG_0, BPF_REG_3, 3), 4385 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 4386 BPF_MOV64_IMM(BPF_REG_0, 0), 4387 BPF_EXIT_INSN(), 4388 BPF_JMP_IMM(BPF_JA, 0, 0, -3), 4389 }, 4390 .result = REJECT, 4391 .errstr = "invalid access to packet", 4392 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4393 }, 4394 { 4395 "direct packet access: test27 (marking on <=, good access)", 4396 .insns = { 4397 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4398 offsetof(struct __sk_buff, data)), 4399 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4400 offsetof(struct __sk_buff, data_end)), 4401 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4402 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4403 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_0, 1), 4404 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 4405 BPF_MOV64_IMM(BPF_REG_0, 1), 4406 BPF_EXIT_INSN(), 4407 }, 4408 .result = ACCEPT, 4409 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4410 .retval = 1, 4411 }, 4412 { 4413 "direct packet access: test28 (marking on <=, bad access)", 4414 .insns = { 4415 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4416 offsetof(struct __sk_buff, data)), 4417 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4418 offsetof(struct __sk_buff, data_end)), 4419 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4420 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4421 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_0, 2), 4422 BPF_MOV64_IMM(BPF_REG_0, 1), 4423 BPF_EXIT_INSN(), 4424 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 4425 BPF_JMP_IMM(BPF_JA, 0, 0, -4), 4426 }, 4427 .result = REJECT, 4428 .errstr = "invalid access to packet", 4429 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4430 }, 4431 { 4432 "helper access to packet: test1, valid packet_ptr range", 4433 .insns = { 4434 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4435 offsetof(struct xdp_md, data)), 4436 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4437 offsetof(struct xdp_md, data_end)), 4438 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 4439 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 4440 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 5), 4441 BPF_LD_MAP_FD(BPF_REG_1, 0), 4442 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 4443 BPF_MOV64_IMM(BPF_REG_4, 0), 4444 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4445 BPF_FUNC_map_update_elem), 4446 BPF_MOV64_IMM(BPF_REG_0, 0), 4447 BPF_EXIT_INSN(), 4448 }, 4449 .fixup_map_hash_8b = { 5 }, 4450 .result_unpriv = ACCEPT, 4451 .result = ACCEPT, 4452 .prog_type = BPF_PROG_TYPE_XDP, 4453 }, 4454 { 4455 "helper access to packet: test2, unchecked packet_ptr", 4456 .insns = { 4457 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4458 offsetof(struct xdp_md, data)), 4459 BPF_LD_MAP_FD(BPF_REG_1, 0), 4460 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4461 BPF_FUNC_map_lookup_elem), 4462 BPF_MOV64_IMM(BPF_REG_0, 0), 4463 BPF_EXIT_INSN(), 4464 }, 4465 .fixup_map_hash_8b = { 1 }, 4466 .result = REJECT, 4467 .errstr = "invalid access to packet", 4468 .prog_type = BPF_PROG_TYPE_XDP, 4469 }, 4470 { 4471 "helper access to packet: test3, variable add", 4472 .insns = { 4473 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4474 offsetof(struct xdp_md, data)), 4475 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4476 offsetof(struct xdp_md, data_end)), 4477 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 4478 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8), 4479 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 10), 4480 BPF_LDX_MEM(BPF_B, BPF_REG_5, BPF_REG_2, 0), 4481 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 4482 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_5), 4483 BPF_MOV64_REG(BPF_REG_5, BPF_REG_4), 4484 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 8), 4485 BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_3, 4), 4486 BPF_LD_MAP_FD(BPF_REG_1, 0), 4487 BPF_MOV64_REG(BPF_REG_2, BPF_REG_4), 4488 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4489 BPF_FUNC_map_lookup_elem), 4490 BPF_MOV64_IMM(BPF_REG_0, 0), 4491 BPF_EXIT_INSN(), 4492 }, 4493 .fixup_map_hash_8b = { 11 }, 4494 .result = ACCEPT, 4495 .prog_type = BPF_PROG_TYPE_XDP, 4496 }, 4497 { 4498 "helper access to packet: test4, packet_ptr with bad range", 4499 .insns = { 4500 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4501 offsetof(struct xdp_md, data)), 4502 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4503 offsetof(struct xdp_md, data_end)), 4504 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 4505 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 4), 4506 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 2), 4507 BPF_MOV64_IMM(BPF_REG_0, 0), 4508 BPF_EXIT_INSN(), 4509 BPF_LD_MAP_FD(BPF_REG_1, 0), 4510 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4511 BPF_FUNC_map_lookup_elem), 4512 BPF_MOV64_IMM(BPF_REG_0, 0), 4513 BPF_EXIT_INSN(), 4514 }, 4515 .fixup_map_hash_8b = { 7 }, 4516 .result = REJECT, 4517 .errstr = "invalid access to packet", 4518 .prog_type = BPF_PROG_TYPE_XDP, 4519 }, 4520 { 4521 "helper access to packet: test5, packet_ptr with too short range", 4522 .insns = { 4523 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4524 offsetof(struct xdp_md, data)), 4525 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4526 offsetof(struct xdp_md, data_end)), 4527 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), 4528 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 4529 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 7), 4530 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 3), 4531 BPF_LD_MAP_FD(BPF_REG_1, 0), 4532 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4533 BPF_FUNC_map_lookup_elem), 4534 BPF_MOV64_IMM(BPF_REG_0, 0), 4535 BPF_EXIT_INSN(), 4536 }, 4537 .fixup_map_hash_8b = { 6 }, 4538 .result = REJECT, 4539 .errstr = "invalid access to packet", 4540 .prog_type = BPF_PROG_TYPE_XDP, 4541 }, 4542 { 4543 "helper access to packet: test6, cls valid packet_ptr range", 4544 .insns = { 4545 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4546 offsetof(struct __sk_buff, data)), 4547 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4548 offsetof(struct __sk_buff, data_end)), 4549 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 4550 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 4551 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 5), 4552 BPF_LD_MAP_FD(BPF_REG_1, 0), 4553 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 4554 BPF_MOV64_IMM(BPF_REG_4, 0), 4555 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4556 BPF_FUNC_map_update_elem), 4557 BPF_MOV64_IMM(BPF_REG_0, 0), 4558 BPF_EXIT_INSN(), 4559 }, 4560 .fixup_map_hash_8b = { 5 }, 4561 .result = ACCEPT, 4562 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4563 }, 4564 { 4565 "helper access to packet: test7, cls unchecked packet_ptr", 4566 .insns = { 4567 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4568 offsetof(struct __sk_buff, data)), 4569 BPF_LD_MAP_FD(BPF_REG_1, 0), 4570 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4571 BPF_FUNC_map_lookup_elem), 4572 BPF_MOV64_IMM(BPF_REG_0, 0), 4573 BPF_EXIT_INSN(), 4574 }, 4575 .fixup_map_hash_8b = { 1 }, 4576 .result = REJECT, 4577 .errstr = "invalid access to packet", 4578 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4579 }, 4580 { 4581 "helper access to packet: test8, cls variable add", 4582 .insns = { 4583 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4584 offsetof(struct __sk_buff, data)), 4585 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4586 offsetof(struct __sk_buff, data_end)), 4587 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 4588 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8), 4589 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 10), 4590 BPF_LDX_MEM(BPF_B, BPF_REG_5, BPF_REG_2, 0), 4591 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 4592 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_5), 4593 BPF_MOV64_REG(BPF_REG_5, BPF_REG_4), 4594 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 8), 4595 BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_3, 4), 4596 BPF_LD_MAP_FD(BPF_REG_1, 0), 4597 BPF_MOV64_REG(BPF_REG_2, BPF_REG_4), 4598 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4599 BPF_FUNC_map_lookup_elem), 4600 BPF_MOV64_IMM(BPF_REG_0, 0), 4601 BPF_EXIT_INSN(), 4602 }, 4603 .fixup_map_hash_8b = { 11 }, 4604 .result = ACCEPT, 4605 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4606 }, 4607 { 4608 "helper access to packet: test9, cls packet_ptr with bad range", 4609 .insns = { 4610 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4611 offsetof(struct __sk_buff, data)), 4612 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4613 offsetof(struct __sk_buff, data_end)), 4614 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 4615 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 4), 4616 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 2), 4617 BPF_MOV64_IMM(BPF_REG_0, 0), 4618 BPF_EXIT_INSN(), 4619 BPF_LD_MAP_FD(BPF_REG_1, 0), 4620 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4621 BPF_FUNC_map_lookup_elem), 4622 BPF_MOV64_IMM(BPF_REG_0, 0), 4623 BPF_EXIT_INSN(), 4624 }, 4625 .fixup_map_hash_8b = { 7 }, 4626 .result = REJECT, 4627 .errstr = "invalid access to packet", 4628 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4629 }, 4630 { 4631 "helper access to packet: test10, cls packet_ptr with too short range", 4632 .insns = { 4633 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4634 offsetof(struct __sk_buff, data)), 4635 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4636 offsetof(struct __sk_buff, data_end)), 4637 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), 4638 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 4639 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 7), 4640 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 3), 4641 BPF_LD_MAP_FD(BPF_REG_1, 0), 4642 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4643 BPF_FUNC_map_lookup_elem), 4644 BPF_MOV64_IMM(BPF_REG_0, 0), 4645 BPF_EXIT_INSN(), 4646 }, 4647 .fixup_map_hash_8b = { 6 }, 4648 .result = REJECT, 4649 .errstr = "invalid access to packet", 4650 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4651 }, 4652 { 4653 "helper access to packet: test11, cls unsuitable helper 1", 4654 .insns = { 4655 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4656 offsetof(struct __sk_buff, data)), 4657 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4658 offsetof(struct __sk_buff, data_end)), 4659 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4660 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 4661 BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, 7), 4662 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_7, 4), 4663 BPF_MOV64_IMM(BPF_REG_2, 0), 4664 BPF_MOV64_IMM(BPF_REG_4, 42), 4665 BPF_MOV64_IMM(BPF_REG_5, 0), 4666 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4667 BPF_FUNC_skb_store_bytes), 4668 BPF_MOV64_IMM(BPF_REG_0, 0), 4669 BPF_EXIT_INSN(), 4670 }, 4671 .result = REJECT, 4672 .errstr = "helper access to the packet", 4673 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4674 }, 4675 { 4676 "helper access to packet: test12, cls unsuitable helper 2", 4677 .insns = { 4678 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4679 offsetof(struct __sk_buff, data)), 4680 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4681 offsetof(struct __sk_buff, data_end)), 4682 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 4683 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 8), 4684 BPF_JMP_REG(BPF_JGT, BPF_REG_6, BPF_REG_7, 3), 4685 BPF_MOV64_IMM(BPF_REG_2, 0), 4686 BPF_MOV64_IMM(BPF_REG_4, 4), 4687 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4688 BPF_FUNC_skb_load_bytes), 4689 BPF_MOV64_IMM(BPF_REG_0, 0), 4690 BPF_EXIT_INSN(), 4691 }, 4692 .result = REJECT, 4693 .errstr = "helper access to the packet", 4694 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4695 }, 4696 { 4697 "helper access to packet: test13, cls helper ok", 4698 .insns = { 4699 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4700 offsetof(struct __sk_buff, data)), 4701 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4702 offsetof(struct __sk_buff, data_end)), 4703 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4704 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4705 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4706 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4707 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4708 BPF_MOV64_IMM(BPF_REG_2, 4), 4709 BPF_MOV64_IMM(BPF_REG_3, 0), 4710 BPF_MOV64_IMM(BPF_REG_4, 0), 4711 BPF_MOV64_IMM(BPF_REG_5, 0), 4712 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4713 BPF_FUNC_csum_diff), 4714 BPF_MOV64_IMM(BPF_REG_0, 0), 4715 BPF_EXIT_INSN(), 4716 }, 4717 .result = ACCEPT, 4718 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4719 }, 4720 { 4721 "helper access to packet: test14, cls helper ok sub", 4722 .insns = { 4723 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4724 offsetof(struct __sk_buff, data)), 4725 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4726 offsetof(struct __sk_buff, data_end)), 4727 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4728 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4729 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4730 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4731 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 4), 4732 BPF_MOV64_IMM(BPF_REG_2, 4), 4733 BPF_MOV64_IMM(BPF_REG_3, 0), 4734 BPF_MOV64_IMM(BPF_REG_4, 0), 4735 BPF_MOV64_IMM(BPF_REG_5, 0), 4736 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4737 BPF_FUNC_csum_diff), 4738 BPF_MOV64_IMM(BPF_REG_0, 0), 4739 BPF_EXIT_INSN(), 4740 }, 4741 .result = ACCEPT, 4742 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4743 }, 4744 { 4745 "helper access to packet: test15, cls helper fail sub", 4746 .insns = { 4747 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4748 offsetof(struct __sk_buff, data)), 4749 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4750 offsetof(struct __sk_buff, data_end)), 4751 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4752 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4753 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4754 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4755 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 12), 4756 BPF_MOV64_IMM(BPF_REG_2, 4), 4757 BPF_MOV64_IMM(BPF_REG_3, 0), 4758 BPF_MOV64_IMM(BPF_REG_4, 0), 4759 BPF_MOV64_IMM(BPF_REG_5, 0), 4760 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4761 BPF_FUNC_csum_diff), 4762 BPF_MOV64_IMM(BPF_REG_0, 0), 4763 BPF_EXIT_INSN(), 4764 }, 4765 .result = REJECT, 4766 .errstr = "invalid access to packet", 4767 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4768 }, 4769 { 4770 "helper access to packet: test16, cls helper fail range 1", 4771 .insns = { 4772 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4773 offsetof(struct __sk_buff, data)), 4774 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4775 offsetof(struct __sk_buff, data_end)), 4776 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4777 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4778 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4779 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4780 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4781 BPF_MOV64_IMM(BPF_REG_2, 8), 4782 BPF_MOV64_IMM(BPF_REG_3, 0), 4783 BPF_MOV64_IMM(BPF_REG_4, 0), 4784 BPF_MOV64_IMM(BPF_REG_5, 0), 4785 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4786 BPF_FUNC_csum_diff), 4787 BPF_MOV64_IMM(BPF_REG_0, 0), 4788 BPF_EXIT_INSN(), 4789 }, 4790 .result = REJECT, 4791 .errstr = "invalid access to packet", 4792 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4793 }, 4794 { 4795 "helper access to packet: test17, cls helper fail range 2", 4796 .insns = { 4797 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4798 offsetof(struct __sk_buff, data)), 4799 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4800 offsetof(struct __sk_buff, data_end)), 4801 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4802 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4803 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4804 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4805 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4806 BPF_MOV64_IMM(BPF_REG_2, -9), 4807 BPF_MOV64_IMM(BPF_REG_3, 0), 4808 BPF_MOV64_IMM(BPF_REG_4, 0), 4809 BPF_MOV64_IMM(BPF_REG_5, 0), 4810 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4811 BPF_FUNC_csum_diff), 4812 BPF_MOV64_IMM(BPF_REG_0, 0), 4813 BPF_EXIT_INSN(), 4814 }, 4815 .result = REJECT, 4816 .errstr = "R2 min value is negative", 4817 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4818 }, 4819 { 4820 "helper access to packet: test18, cls helper fail range 3", 4821 .insns = { 4822 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4823 offsetof(struct __sk_buff, data)), 4824 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4825 offsetof(struct __sk_buff, data_end)), 4826 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4827 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4828 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4829 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4830 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4831 BPF_MOV64_IMM(BPF_REG_2, ~0), 4832 BPF_MOV64_IMM(BPF_REG_3, 0), 4833 BPF_MOV64_IMM(BPF_REG_4, 0), 4834 BPF_MOV64_IMM(BPF_REG_5, 0), 4835 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4836 BPF_FUNC_csum_diff), 4837 BPF_MOV64_IMM(BPF_REG_0, 0), 4838 BPF_EXIT_INSN(), 4839 }, 4840 .result = REJECT, 4841 .errstr = "R2 min value is negative", 4842 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4843 }, 4844 { 4845 "helper access to packet: test19, cls helper range zero", 4846 .insns = { 4847 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4848 offsetof(struct __sk_buff, data)), 4849 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4850 offsetof(struct __sk_buff, data_end)), 4851 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4852 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4853 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4854 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4855 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4856 BPF_MOV64_IMM(BPF_REG_2, 0), 4857 BPF_MOV64_IMM(BPF_REG_3, 0), 4858 BPF_MOV64_IMM(BPF_REG_4, 0), 4859 BPF_MOV64_IMM(BPF_REG_5, 0), 4860 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4861 BPF_FUNC_csum_diff), 4862 BPF_MOV64_IMM(BPF_REG_0, 0), 4863 BPF_EXIT_INSN(), 4864 }, 4865 .result = ACCEPT, 4866 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4867 }, 4868 { 4869 "helper access to packet: test20, pkt end as input", 4870 .insns = { 4871 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4872 offsetof(struct __sk_buff, data)), 4873 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4874 offsetof(struct __sk_buff, data_end)), 4875 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4876 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4877 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4878 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4879 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 4880 BPF_MOV64_IMM(BPF_REG_2, 4), 4881 BPF_MOV64_IMM(BPF_REG_3, 0), 4882 BPF_MOV64_IMM(BPF_REG_4, 0), 4883 BPF_MOV64_IMM(BPF_REG_5, 0), 4884 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4885 BPF_FUNC_csum_diff), 4886 BPF_MOV64_IMM(BPF_REG_0, 0), 4887 BPF_EXIT_INSN(), 4888 }, 4889 .result = REJECT, 4890 .errstr = "R1 type=pkt_end expected=fp", 4891 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4892 }, 4893 { 4894 "helper access to packet: test21, wrong reg", 4895 .insns = { 4896 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4897 offsetof(struct __sk_buff, data)), 4898 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4899 offsetof(struct __sk_buff, data_end)), 4900 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4901 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4902 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4903 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4904 BPF_MOV64_IMM(BPF_REG_2, 4), 4905 BPF_MOV64_IMM(BPF_REG_3, 0), 4906 BPF_MOV64_IMM(BPF_REG_4, 0), 4907 BPF_MOV64_IMM(BPF_REG_5, 0), 4908 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4909 BPF_FUNC_csum_diff), 4910 BPF_MOV64_IMM(BPF_REG_0, 0), 4911 BPF_EXIT_INSN(), 4912 }, 4913 .result = REJECT, 4914 .errstr = "invalid access to packet", 4915 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4916 }, 4917 { 4918 "prevent map lookup in sockmap", 4919 .insns = { 4920 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4921 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4922 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4923 BPF_LD_MAP_FD(BPF_REG_1, 0), 4924 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4925 BPF_FUNC_map_lookup_elem), 4926 BPF_EXIT_INSN(), 4927 }, 4928 .fixup_map_sockmap = { 3 }, 4929 .result = REJECT, 4930 .errstr = "cannot pass map_type 15 into func bpf_map_lookup_elem", 4931 .prog_type = BPF_PROG_TYPE_SOCK_OPS, 4932 }, 4933 { 4934 "prevent map lookup in sockhash", 4935 .insns = { 4936 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4937 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4938 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4939 BPF_LD_MAP_FD(BPF_REG_1, 0), 4940 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4941 BPF_FUNC_map_lookup_elem), 4942 BPF_EXIT_INSN(), 4943 }, 4944 .fixup_map_sockhash = { 3 }, 4945 .result = REJECT, 4946 .errstr = "cannot pass map_type 18 into func bpf_map_lookup_elem", 4947 .prog_type = BPF_PROG_TYPE_SOCK_OPS, 4948 }, 4949 { 4950 "prevent map lookup in xskmap", 4951 .insns = { 4952 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4953 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4954 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4955 BPF_LD_MAP_FD(BPF_REG_1, 0), 4956 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4957 BPF_FUNC_map_lookup_elem), 4958 BPF_EXIT_INSN(), 4959 }, 4960 .fixup_map_xskmap = { 3 }, 4961 .result = REJECT, 4962 .errstr = "cannot pass map_type 17 into func bpf_map_lookup_elem", 4963 .prog_type = BPF_PROG_TYPE_XDP, 4964 }, 4965 { 4966 "prevent map lookup in stack trace", 4967 .insns = { 4968 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4969 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4970 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4971 BPF_LD_MAP_FD(BPF_REG_1, 0), 4972 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4973 BPF_FUNC_map_lookup_elem), 4974 BPF_EXIT_INSN(), 4975 }, 4976 .fixup_map_stacktrace = { 3 }, 4977 .result = REJECT, 4978 .errstr = "cannot pass map_type 7 into func bpf_map_lookup_elem", 4979 .prog_type = BPF_PROG_TYPE_PERF_EVENT, 4980 }, 4981 { 4982 "prevent map lookup in prog array", 4983 .insns = { 4984 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4985 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4986 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4987 BPF_LD_MAP_FD(BPF_REG_1, 0), 4988 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4989 BPF_FUNC_map_lookup_elem), 4990 BPF_EXIT_INSN(), 4991 }, 4992 .fixup_prog2 = { 3 }, 4993 .result = REJECT, 4994 .errstr = "cannot pass map_type 3 into func bpf_map_lookup_elem", 4995 }, 4996 { 4997 "valid map access into an array with a constant", 4998 .insns = { 4999 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 5000 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5001 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5002 BPF_LD_MAP_FD(BPF_REG_1, 0), 5003 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5004 BPF_FUNC_map_lookup_elem), 5005 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 5006 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 5007 offsetof(struct test_val, foo)), 5008 BPF_EXIT_INSN(), 5009 }, 5010 .fixup_map_hash_48b = { 3 }, 5011 .errstr_unpriv = "R0 leaks addr", 5012 .result_unpriv = REJECT, 5013 .result = ACCEPT, 5014 }, 5015 { 5016 "valid map access into an array with a register", 5017 .insns = { 5018 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 5019 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5020 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5021 BPF_LD_MAP_FD(BPF_REG_1, 0), 5022 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5023 BPF_FUNC_map_lookup_elem), 5024 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 5025 BPF_MOV64_IMM(BPF_REG_1, 4), 5026 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2), 5027 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5028 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 5029 offsetof(struct test_val, foo)), 5030 BPF_EXIT_INSN(), 5031 }, 5032 .fixup_map_hash_48b = { 3 }, 5033 .errstr_unpriv = "R0 leaks addr", 5034 .result_unpriv = REJECT, 5035 .result = ACCEPT, 5036 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 5037 }, 5038 { 5039 "valid map access into an array with a variable", 5040 .insns = { 5041 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 5042 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5043 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5044 BPF_LD_MAP_FD(BPF_REG_1, 0), 5045 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5046 BPF_FUNC_map_lookup_elem), 5047 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 5048 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5049 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, MAX_ENTRIES, 3), 5050 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2), 5051 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5052 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 5053 offsetof(struct test_val, foo)), 5054 BPF_EXIT_INSN(), 5055 }, 5056 .fixup_map_hash_48b = { 3 }, 5057 .errstr_unpriv = "R0 leaks addr", 5058 .result_unpriv = REJECT, 5059 .result = ACCEPT, 5060 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 5061 }, 5062 { 5063 "valid map access into an array with a signed variable", 5064 .insns = { 5065 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 5066 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5067 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5068 BPF_LD_MAP_FD(BPF_REG_1, 0), 5069 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5070 BPF_FUNC_map_lookup_elem), 5071 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 5072 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5073 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 0xffffffff, 1), 5074 BPF_MOV32_IMM(BPF_REG_1, 0), 5075 BPF_MOV32_IMM(BPF_REG_2, MAX_ENTRIES), 5076 BPF_JMP_REG(BPF_JSGT, BPF_REG_2, BPF_REG_1, 1), 5077 BPF_MOV32_IMM(BPF_REG_1, 0), 5078 BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 2), 5079 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5080 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 5081 offsetof(struct test_val, foo)), 5082 BPF_EXIT_INSN(), 5083 }, 5084 .fixup_map_hash_48b = { 3 }, 5085 .errstr_unpriv = "R0 leaks addr", 5086 .result_unpriv = REJECT, 5087 .result = ACCEPT, 5088 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 5089 }, 5090 { 5091 "invalid map access into an array with a constant", 5092 .insns = { 5093 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 5094 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5095 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5096 BPF_LD_MAP_FD(BPF_REG_1, 0), 5097 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5098 BPF_FUNC_map_lookup_elem), 5099 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 5100 BPF_ST_MEM(BPF_DW, BPF_REG_0, (MAX_ENTRIES + 1) << 2, 5101 offsetof(struct test_val, foo)), 5102 BPF_EXIT_INSN(), 5103 }, 5104 .fixup_map_hash_48b = { 3 }, 5105 .errstr = "invalid access to map value, value_size=48 off=48 size=8", 5106 .result = REJECT, 5107 }, 5108 { 5109 "invalid map access into an array with a register", 5110 .insns = { 5111 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 5112 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5113 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5114 BPF_LD_MAP_FD(BPF_REG_1, 0), 5115 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5116 BPF_FUNC_map_lookup_elem), 5117 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 5118 BPF_MOV64_IMM(BPF_REG_1, MAX_ENTRIES + 1), 5119 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2), 5120 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5121 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 5122 offsetof(struct test_val, foo)), 5123 BPF_EXIT_INSN(), 5124 }, 5125 .fixup_map_hash_48b = { 3 }, 5126 .errstr = "R0 min value is outside of the array range", 5127 .result = REJECT, 5128 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 5129 }, 5130 { 5131 "invalid map access into an array with a variable", 5132 .insns = { 5133 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 5134 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5135 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5136 BPF_LD_MAP_FD(BPF_REG_1, 0), 5137 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5138 BPF_FUNC_map_lookup_elem), 5139 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 5140 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5141 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2), 5142 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5143 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 5144 offsetof(struct test_val, foo)), 5145 BPF_EXIT_INSN(), 5146 }, 5147 .fixup_map_hash_48b = { 3 }, 5148 .errstr = "R0 unbounded memory access, make sure to bounds check any array access into a map", 5149 .result = REJECT, 5150 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 5151 }, 5152 { 5153 "invalid map access into an array with no floor check", 5154 .insns = { 5155 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 5156 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5157 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5158 BPF_LD_MAP_FD(BPF_REG_1, 0), 5159 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5160 BPF_FUNC_map_lookup_elem), 5161 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 5162 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), 5163 BPF_MOV32_IMM(BPF_REG_2, MAX_ENTRIES), 5164 BPF_JMP_REG(BPF_JSGT, BPF_REG_2, BPF_REG_1, 1), 5165 BPF_MOV32_IMM(BPF_REG_1, 0), 5166 BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 2), 5167 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5168 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 5169 offsetof(struct test_val, foo)), 5170 BPF_EXIT_INSN(), 5171 }, 5172 .fixup_map_hash_48b = { 3 }, 5173 .errstr_unpriv = "R0 leaks addr", 5174 .errstr = "R0 unbounded memory access", 5175 .result_unpriv = REJECT, 5176 .result = REJECT, 5177 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 5178 }, 5179 { 5180 "invalid map access into an array with a invalid max check", 5181 .insns = { 5182 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 5183 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5184 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5185 BPF_LD_MAP_FD(BPF_REG_1, 0), 5186 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5187 BPF_FUNC_map_lookup_elem), 5188 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 5189 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5190 BPF_MOV32_IMM(BPF_REG_2, MAX_ENTRIES + 1), 5191 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1), 5192 BPF_MOV32_IMM(BPF_REG_1, 0), 5193 BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 2), 5194 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5195 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 5196 offsetof(struct test_val, foo)), 5197 BPF_EXIT_INSN(), 5198 }, 5199 .fixup_map_hash_48b = { 3 }, 5200 .errstr_unpriv = "R0 leaks addr", 5201 .errstr = "invalid access to map value, value_size=48 off=44 size=8", 5202 .result_unpriv = REJECT, 5203 .result = REJECT, 5204 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 5205 }, 5206 { 5207 "invalid map access into an array with a invalid max check", 5208 .insns = { 5209 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 5210 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5211 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5212 BPF_LD_MAP_FD(BPF_REG_1, 0), 5213 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5214 BPF_FUNC_map_lookup_elem), 5215 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10), 5216 BPF_MOV64_REG(BPF_REG_8, BPF_REG_0), 5217 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 5218 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5219 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5220 BPF_LD_MAP_FD(BPF_REG_1, 0), 5221 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5222 BPF_FUNC_map_lookup_elem), 5223 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 5224 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_8), 5225 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 5226 offsetof(struct test_val, foo)), 5227 BPF_EXIT_INSN(), 5228 }, 5229 .fixup_map_hash_48b = { 3, 11 }, 5230 .errstr = "R0 pointer += pointer", 5231 .result = REJECT, 5232 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 5233 }, 5234 { 5235 "direct packet read test#1 for CGROUP_SKB", 5236 .insns = { 5237 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 5238 offsetof(struct __sk_buff, data)), 5239 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 5240 offsetof(struct __sk_buff, data_end)), 5241 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 5242 offsetof(struct __sk_buff, len)), 5243 BPF_LDX_MEM(BPF_W, BPF_REG_5, BPF_REG_1, 5244 offsetof(struct __sk_buff, pkt_type)), 5245 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 5246 offsetof(struct __sk_buff, mark)), 5247 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_6, 5248 offsetof(struct __sk_buff, mark)), 5249 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 5250 offsetof(struct __sk_buff, queue_mapping)), 5251 BPF_LDX_MEM(BPF_W, BPF_REG_8, BPF_REG_1, 5252 offsetof(struct __sk_buff, protocol)), 5253 BPF_LDX_MEM(BPF_W, BPF_REG_9, BPF_REG_1, 5254 offsetof(struct __sk_buff, vlan_present)), 5255 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 5256 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 5257 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 5258 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 5259 BPF_MOV64_IMM(BPF_REG_0, 0), 5260 BPF_EXIT_INSN(), 5261 }, 5262 .result = ACCEPT, 5263 .result_unpriv = REJECT, 5264 .errstr_unpriv = "invalid bpf_context access off=76 size=4", 5265 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5266 }, 5267 { 5268 "direct packet read test#2 for CGROUP_SKB", 5269 .insns = { 5270 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 5271 offsetof(struct __sk_buff, vlan_tci)), 5272 BPF_LDX_MEM(BPF_W, BPF_REG_5, BPF_REG_1, 5273 offsetof(struct __sk_buff, vlan_proto)), 5274 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 5275 offsetof(struct __sk_buff, priority)), 5276 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_6, 5277 offsetof(struct __sk_buff, priority)), 5278 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 5279 offsetof(struct __sk_buff, 5280 ingress_ifindex)), 5281 BPF_LDX_MEM(BPF_W, BPF_REG_8, BPF_REG_1, 5282 offsetof(struct __sk_buff, tc_index)), 5283 BPF_LDX_MEM(BPF_W, BPF_REG_9, BPF_REG_1, 5284 offsetof(struct __sk_buff, hash)), 5285 BPF_MOV64_IMM(BPF_REG_0, 0), 5286 BPF_EXIT_INSN(), 5287 }, 5288 .result = ACCEPT, 5289 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5290 }, 5291 { 5292 "direct packet read test#3 for CGROUP_SKB", 5293 .insns = { 5294 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 5295 offsetof(struct __sk_buff, cb[0])), 5296 BPF_LDX_MEM(BPF_W, BPF_REG_5, BPF_REG_1, 5297 offsetof(struct __sk_buff, cb[1])), 5298 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 5299 offsetof(struct __sk_buff, cb[2])), 5300 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 5301 offsetof(struct __sk_buff, cb[3])), 5302 BPF_LDX_MEM(BPF_W, BPF_REG_8, BPF_REG_1, 5303 offsetof(struct __sk_buff, cb[4])), 5304 BPF_LDX_MEM(BPF_W, BPF_REG_9, BPF_REG_1, 5305 offsetof(struct __sk_buff, napi_id)), 5306 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_4, 5307 offsetof(struct __sk_buff, cb[0])), 5308 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_5, 5309 offsetof(struct __sk_buff, cb[1])), 5310 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_6, 5311 offsetof(struct __sk_buff, cb[2])), 5312 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_7, 5313 offsetof(struct __sk_buff, cb[3])), 5314 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_8, 5315 offsetof(struct __sk_buff, cb[4])), 5316 BPF_MOV64_IMM(BPF_REG_0, 0), 5317 BPF_EXIT_INSN(), 5318 }, 5319 .result = ACCEPT, 5320 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5321 }, 5322 { 5323 "direct packet read test#4 for CGROUP_SKB", 5324 .insns = { 5325 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 5326 offsetof(struct __sk_buff, family)), 5327 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 5328 offsetof(struct __sk_buff, remote_ip4)), 5329 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 5330 offsetof(struct __sk_buff, local_ip4)), 5331 BPF_LDX_MEM(BPF_W, BPF_REG_5, BPF_REG_1, 5332 offsetof(struct __sk_buff, remote_ip6[0])), 5333 BPF_LDX_MEM(BPF_W, BPF_REG_5, BPF_REG_1, 5334 offsetof(struct __sk_buff, remote_ip6[1])), 5335 BPF_LDX_MEM(BPF_W, BPF_REG_5, BPF_REG_1, 5336 offsetof(struct __sk_buff, remote_ip6[2])), 5337 BPF_LDX_MEM(BPF_W, BPF_REG_5, BPF_REG_1, 5338 offsetof(struct __sk_buff, remote_ip6[3])), 5339 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 5340 offsetof(struct __sk_buff, local_ip6[0])), 5341 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 5342 offsetof(struct __sk_buff, local_ip6[1])), 5343 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 5344 offsetof(struct __sk_buff, local_ip6[2])), 5345 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 5346 offsetof(struct __sk_buff, local_ip6[3])), 5347 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 5348 offsetof(struct __sk_buff, remote_port)), 5349 BPF_LDX_MEM(BPF_W, BPF_REG_8, BPF_REG_1, 5350 offsetof(struct __sk_buff, local_port)), 5351 BPF_MOV64_IMM(BPF_REG_0, 0), 5352 BPF_EXIT_INSN(), 5353 }, 5354 .result = ACCEPT, 5355 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5356 }, 5357 { 5358 "invalid access of tc_classid for CGROUP_SKB", 5359 .insns = { 5360 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 5361 offsetof(struct __sk_buff, tc_classid)), 5362 BPF_MOV64_IMM(BPF_REG_0, 0), 5363 BPF_EXIT_INSN(), 5364 }, 5365 .result = REJECT, 5366 .errstr = "invalid bpf_context access", 5367 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5368 }, 5369 { 5370 "invalid access of data_meta for CGROUP_SKB", 5371 .insns = { 5372 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 5373 offsetof(struct __sk_buff, data_meta)), 5374 BPF_MOV64_IMM(BPF_REG_0, 0), 5375 BPF_EXIT_INSN(), 5376 }, 5377 .result = REJECT, 5378 .errstr = "invalid bpf_context access", 5379 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5380 }, 5381 { 5382 "invalid access of flow_keys for CGROUP_SKB", 5383 .insns = { 5384 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 5385 offsetof(struct __sk_buff, flow_keys)), 5386 BPF_MOV64_IMM(BPF_REG_0, 0), 5387 BPF_EXIT_INSN(), 5388 }, 5389 .result = REJECT, 5390 .errstr = "invalid bpf_context access", 5391 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5392 }, 5393 { 5394 "invalid write access to napi_id for CGROUP_SKB", 5395 .insns = { 5396 BPF_LDX_MEM(BPF_W, BPF_REG_9, BPF_REG_1, 5397 offsetof(struct __sk_buff, napi_id)), 5398 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_9, 5399 offsetof(struct __sk_buff, napi_id)), 5400 BPF_MOV64_IMM(BPF_REG_0, 0), 5401 BPF_EXIT_INSN(), 5402 }, 5403 .result = REJECT, 5404 .errstr = "invalid bpf_context access", 5405 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5406 }, 5407 { 5408 "valid cgroup storage access", 5409 .insns = { 5410 BPF_MOV64_IMM(BPF_REG_2, 0), 5411 BPF_LD_MAP_FD(BPF_REG_1, 0), 5412 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5413 BPF_FUNC_get_local_storage), 5414 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5415 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5416 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5417 BPF_EXIT_INSN(), 5418 }, 5419 .fixup_cgroup_storage = { 1 }, 5420 .result = ACCEPT, 5421 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5422 }, 5423 { 5424 "invalid cgroup storage access 1", 5425 .insns = { 5426 BPF_MOV64_IMM(BPF_REG_2, 0), 5427 BPF_LD_MAP_FD(BPF_REG_1, 0), 5428 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5429 BPF_FUNC_get_local_storage), 5430 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5431 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5432 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5433 BPF_EXIT_INSN(), 5434 }, 5435 .fixup_map_hash_8b = { 1 }, 5436 .result = REJECT, 5437 .errstr = "cannot pass map_type 1 into func bpf_get_local_storage", 5438 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5439 }, 5440 { 5441 "invalid cgroup storage access 2", 5442 .insns = { 5443 BPF_MOV64_IMM(BPF_REG_2, 0), 5444 BPF_LD_MAP_FD(BPF_REG_1, 1), 5445 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5446 BPF_FUNC_get_local_storage), 5447 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5448 BPF_EXIT_INSN(), 5449 }, 5450 .result = REJECT, 5451 .errstr = "fd 1 is not pointing to valid bpf_map", 5452 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5453 }, 5454 { 5455 "invalid cgroup storage access 3", 5456 .insns = { 5457 BPF_MOV64_IMM(BPF_REG_2, 0), 5458 BPF_LD_MAP_FD(BPF_REG_1, 0), 5459 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5460 BPF_FUNC_get_local_storage), 5461 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 256), 5462 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 1), 5463 BPF_MOV64_IMM(BPF_REG_0, 0), 5464 BPF_EXIT_INSN(), 5465 }, 5466 .fixup_cgroup_storage = { 1 }, 5467 .result = REJECT, 5468 .errstr = "invalid access to map value, value_size=64 off=256 size=4", 5469 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5470 }, 5471 { 5472 "invalid cgroup storage access 4", 5473 .insns = { 5474 BPF_MOV64_IMM(BPF_REG_2, 0), 5475 BPF_LD_MAP_FD(BPF_REG_1, 0), 5476 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5477 BPF_FUNC_get_local_storage), 5478 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, -2), 5479 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5480 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 1), 5481 BPF_EXIT_INSN(), 5482 }, 5483 .fixup_cgroup_storage = { 1 }, 5484 .result = REJECT, 5485 .errstr = "invalid access to map value, value_size=64 off=-2 size=4", 5486 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5487 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 5488 }, 5489 { 5490 "invalid cgroup storage access 5", 5491 .insns = { 5492 BPF_MOV64_IMM(BPF_REG_2, 7), 5493 BPF_LD_MAP_FD(BPF_REG_1, 0), 5494 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5495 BPF_FUNC_get_local_storage), 5496 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5497 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5498 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5499 BPF_EXIT_INSN(), 5500 }, 5501 .fixup_cgroup_storage = { 1 }, 5502 .result = REJECT, 5503 .errstr = "get_local_storage() doesn't support non-zero flags", 5504 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5505 }, 5506 { 5507 "invalid cgroup storage access 6", 5508 .insns = { 5509 BPF_MOV64_REG(BPF_REG_2, BPF_REG_1), 5510 BPF_LD_MAP_FD(BPF_REG_1, 0), 5511 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5512 BPF_FUNC_get_local_storage), 5513 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5514 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5515 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5516 BPF_EXIT_INSN(), 5517 }, 5518 .fixup_cgroup_storage = { 1 }, 5519 .result = REJECT, 5520 .errstr = "get_local_storage() doesn't support non-zero flags", 5521 .errstr_unpriv = "R2 leaks addr into helper function", 5522 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5523 }, 5524 { 5525 "valid per-cpu cgroup storage access", 5526 .insns = { 5527 BPF_MOV64_IMM(BPF_REG_2, 0), 5528 BPF_LD_MAP_FD(BPF_REG_1, 0), 5529 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5530 BPF_FUNC_get_local_storage), 5531 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5532 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5533 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5534 BPF_EXIT_INSN(), 5535 }, 5536 .fixup_percpu_cgroup_storage = { 1 }, 5537 .result = ACCEPT, 5538 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5539 }, 5540 { 5541 "invalid per-cpu cgroup storage access 1", 5542 .insns = { 5543 BPF_MOV64_IMM(BPF_REG_2, 0), 5544 BPF_LD_MAP_FD(BPF_REG_1, 0), 5545 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5546 BPF_FUNC_get_local_storage), 5547 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5548 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5549 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5550 BPF_EXIT_INSN(), 5551 }, 5552 .fixup_map_hash_8b = { 1 }, 5553 .result = REJECT, 5554 .errstr = "cannot pass map_type 1 into func bpf_get_local_storage", 5555 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5556 }, 5557 { 5558 "invalid per-cpu cgroup storage access 2", 5559 .insns = { 5560 BPF_MOV64_IMM(BPF_REG_2, 0), 5561 BPF_LD_MAP_FD(BPF_REG_1, 1), 5562 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5563 BPF_FUNC_get_local_storage), 5564 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5565 BPF_EXIT_INSN(), 5566 }, 5567 .result = REJECT, 5568 .errstr = "fd 1 is not pointing to valid bpf_map", 5569 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5570 }, 5571 { 5572 "invalid per-cpu cgroup storage access 3", 5573 .insns = { 5574 BPF_MOV64_IMM(BPF_REG_2, 0), 5575 BPF_LD_MAP_FD(BPF_REG_1, 0), 5576 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5577 BPF_FUNC_get_local_storage), 5578 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 256), 5579 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 1), 5580 BPF_MOV64_IMM(BPF_REG_0, 0), 5581 BPF_EXIT_INSN(), 5582 }, 5583 .fixup_percpu_cgroup_storage = { 1 }, 5584 .result = REJECT, 5585 .errstr = "invalid access to map value, value_size=64 off=256 size=4", 5586 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5587 }, 5588 { 5589 "invalid per-cpu cgroup storage access 4", 5590 .insns = { 5591 BPF_MOV64_IMM(BPF_REG_2, 0), 5592 BPF_LD_MAP_FD(BPF_REG_1, 0), 5593 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5594 BPF_FUNC_get_local_storage), 5595 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, -2), 5596 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5597 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 1), 5598 BPF_EXIT_INSN(), 5599 }, 5600 .fixup_cgroup_storage = { 1 }, 5601 .result = REJECT, 5602 .errstr = "invalid access to map value, value_size=64 off=-2 size=4", 5603 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5604 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 5605 }, 5606 { 5607 "invalid per-cpu cgroup storage access 5", 5608 .insns = { 5609 BPF_MOV64_IMM(BPF_REG_2, 7), 5610 BPF_LD_MAP_FD(BPF_REG_1, 0), 5611 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5612 BPF_FUNC_get_local_storage), 5613 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5614 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5615 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5616 BPF_EXIT_INSN(), 5617 }, 5618 .fixup_percpu_cgroup_storage = { 1 }, 5619 .result = REJECT, 5620 .errstr = "get_local_storage() doesn't support non-zero flags", 5621 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5622 }, 5623 { 5624 "invalid per-cpu cgroup storage access 6", 5625 .insns = { 5626 BPF_MOV64_REG(BPF_REG_2, BPF_REG_1), 5627 BPF_LD_MAP_FD(BPF_REG_1, 0), 5628 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5629 BPF_FUNC_get_local_storage), 5630 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5631 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5632 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5633 BPF_EXIT_INSN(), 5634 }, 5635 .fixup_percpu_cgroup_storage = { 1 }, 5636 .result = REJECT, 5637 .errstr = "get_local_storage() doesn't support non-zero flags", 5638 .errstr_unpriv = "R2 leaks addr into helper function", 5639 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5640 }, 5641 { 5642 "write tstamp from CGROUP_SKB", 5643 .insns = { 5644 BPF_MOV64_IMM(BPF_REG_0, 0), 5645 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 5646 offsetof(struct __sk_buff, tstamp)), 5647 BPF_MOV64_IMM(BPF_REG_0, 0), 5648 BPF_EXIT_INSN(), 5649 }, 5650 .result = ACCEPT, 5651 .result_unpriv = REJECT, 5652 .errstr_unpriv = "invalid bpf_context access off=152 size=8", 5653 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5654 }, 5655 { 5656 "read tstamp from CGROUP_SKB", 5657 .insns = { 5658 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 5659 offsetof(struct __sk_buff, tstamp)), 5660 BPF_MOV64_IMM(BPF_REG_0, 0), 5661 BPF_EXIT_INSN(), 5662 }, 5663 .result = ACCEPT, 5664 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5665 }, 5666 { 5667 "multiple registers share map_lookup_elem result", 5668 .insns = { 5669 BPF_MOV64_IMM(BPF_REG_1, 10), 5670 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 5671 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5672 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5673 BPF_LD_MAP_FD(BPF_REG_1, 0), 5674 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5675 BPF_FUNC_map_lookup_elem), 5676 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 5677 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 5678 BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0), 5679 BPF_EXIT_INSN(), 5680 }, 5681 .fixup_map_hash_8b = { 4 }, 5682 .result = ACCEPT, 5683 .prog_type = BPF_PROG_TYPE_SCHED_CLS 5684 }, 5685 { 5686 "alu ops on ptr_to_map_value_or_null, 1", 5687 .insns = { 5688 BPF_MOV64_IMM(BPF_REG_1, 10), 5689 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 5690 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5691 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5692 BPF_LD_MAP_FD(BPF_REG_1, 0), 5693 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5694 BPF_FUNC_map_lookup_elem), 5695 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 5696 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -2), 5697 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 2), 5698 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 5699 BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0), 5700 BPF_EXIT_INSN(), 5701 }, 5702 .fixup_map_hash_8b = { 4 }, 5703 .errstr = "R4 pointer arithmetic on map_value_or_null", 5704 .result = REJECT, 5705 .prog_type = BPF_PROG_TYPE_SCHED_CLS 5706 }, 5707 { 5708 "alu ops on ptr_to_map_value_or_null, 2", 5709 .insns = { 5710 BPF_MOV64_IMM(BPF_REG_1, 10), 5711 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 5712 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5713 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5714 BPF_LD_MAP_FD(BPF_REG_1, 0), 5715 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5716 BPF_FUNC_map_lookup_elem), 5717 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 5718 BPF_ALU64_IMM(BPF_AND, BPF_REG_4, -1), 5719 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 5720 BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0), 5721 BPF_EXIT_INSN(), 5722 }, 5723 .fixup_map_hash_8b = { 4 }, 5724 .errstr = "R4 pointer arithmetic on map_value_or_null", 5725 .result = REJECT, 5726 .prog_type = BPF_PROG_TYPE_SCHED_CLS 5727 }, 5728 { 5729 "alu ops on ptr_to_map_value_or_null, 3", 5730 .insns = { 5731 BPF_MOV64_IMM(BPF_REG_1, 10), 5732 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 5733 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5734 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5735 BPF_LD_MAP_FD(BPF_REG_1, 0), 5736 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5737 BPF_FUNC_map_lookup_elem), 5738 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 5739 BPF_ALU64_IMM(BPF_LSH, BPF_REG_4, 1), 5740 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 5741 BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0), 5742 BPF_EXIT_INSN(), 5743 }, 5744 .fixup_map_hash_8b = { 4 }, 5745 .errstr = "R4 pointer arithmetic on map_value_or_null", 5746 .result = REJECT, 5747 .prog_type = BPF_PROG_TYPE_SCHED_CLS 5748 }, 5749 { 5750 "invalid memory access with multiple map_lookup_elem calls", 5751 .insns = { 5752 BPF_MOV64_IMM(BPF_REG_1, 10), 5753 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 5754 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5755 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5756 BPF_LD_MAP_FD(BPF_REG_1, 0), 5757 BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 5758 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 5759 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5760 BPF_FUNC_map_lookup_elem), 5761 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 5762 BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 5763 BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 5764 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5765 BPF_FUNC_map_lookup_elem), 5766 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 5767 BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0), 5768 BPF_EXIT_INSN(), 5769 }, 5770 .fixup_map_hash_8b = { 4 }, 5771 .result = REJECT, 5772 .errstr = "R4 !read_ok", 5773 .prog_type = BPF_PROG_TYPE_SCHED_CLS 5774 }, 5775 { 5776 "valid indirect map_lookup_elem access with 2nd lookup in branch", 5777 .insns = { 5778 BPF_MOV64_IMM(BPF_REG_1, 10), 5779 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 5780 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5781 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5782 BPF_LD_MAP_FD(BPF_REG_1, 0), 5783 BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 5784 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 5785 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5786 BPF_FUNC_map_lookup_elem), 5787 BPF_MOV64_IMM(BPF_REG_2, 10), 5788 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0, 3), 5789 BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 5790 BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 5791 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5792 BPF_FUNC_map_lookup_elem), 5793 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 5794 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 5795 BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0), 5796 BPF_EXIT_INSN(), 5797 }, 5798 .fixup_map_hash_8b = { 4 }, 5799 .result = ACCEPT, 5800 .prog_type = BPF_PROG_TYPE_SCHED_CLS 5801 }, 5802 { 5803 "invalid map access from else condition", 5804 .insns = { 5805 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 5806 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5807 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5808 BPF_LD_MAP_FD(BPF_REG_1, 0), 5809 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem), 5810 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 5811 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5812 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, MAX_ENTRIES-1, 1), 5813 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 1), 5814 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2), 5815 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5816 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, offsetof(struct test_val, foo)), 5817 BPF_EXIT_INSN(), 5818 }, 5819 .fixup_map_hash_48b = { 3 }, 5820 .errstr = "R0 unbounded memory access", 5821 .result = REJECT, 5822 .errstr_unpriv = "R0 leaks addr", 5823 .result_unpriv = REJECT, 5824 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 5825 }, 5826 { 5827 "constant register |= constant should keep constant type", 5828 .insns = { 5829 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 5830 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48), 5831 BPF_MOV64_IMM(BPF_REG_2, 34), 5832 BPF_ALU64_IMM(BPF_OR, BPF_REG_2, 13), 5833 BPF_MOV64_IMM(BPF_REG_3, 0), 5834 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5835 BPF_EXIT_INSN(), 5836 }, 5837 .result = ACCEPT, 5838 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5839 }, 5840 { 5841 "constant register |= constant should not bypass stack boundary checks", 5842 .insns = { 5843 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 5844 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48), 5845 BPF_MOV64_IMM(BPF_REG_2, 34), 5846 BPF_ALU64_IMM(BPF_OR, BPF_REG_2, 24), 5847 BPF_MOV64_IMM(BPF_REG_3, 0), 5848 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5849 BPF_EXIT_INSN(), 5850 }, 5851 .errstr = "invalid stack type R1 off=-48 access_size=58", 5852 .result = REJECT, 5853 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5854 }, 5855 { 5856 "constant register |= constant register should keep constant type", 5857 .insns = { 5858 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 5859 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48), 5860 BPF_MOV64_IMM(BPF_REG_2, 34), 5861 BPF_MOV64_IMM(BPF_REG_4, 13), 5862 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_4), 5863 BPF_MOV64_IMM(BPF_REG_3, 0), 5864 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5865 BPF_EXIT_INSN(), 5866 }, 5867 .result = ACCEPT, 5868 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5869 }, 5870 { 5871 "constant register |= constant register should not bypass stack boundary checks", 5872 .insns = { 5873 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 5874 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48), 5875 BPF_MOV64_IMM(BPF_REG_2, 34), 5876 BPF_MOV64_IMM(BPF_REG_4, 24), 5877 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_4), 5878 BPF_MOV64_IMM(BPF_REG_3, 0), 5879 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5880 BPF_EXIT_INSN(), 5881 }, 5882 .errstr = "invalid stack type R1 off=-48 access_size=58", 5883 .result = REJECT, 5884 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5885 }, 5886 { 5887 "invalid direct packet write for LWT_IN", 5888 .insns = { 5889 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 5890 offsetof(struct __sk_buff, data)), 5891 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 5892 offsetof(struct __sk_buff, data_end)), 5893 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 5894 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 5895 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 5896 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 5897 BPF_MOV64_IMM(BPF_REG_0, 0), 5898 BPF_EXIT_INSN(), 5899 }, 5900 .errstr = "cannot write into packet", 5901 .result = REJECT, 5902 .prog_type = BPF_PROG_TYPE_LWT_IN, 5903 }, 5904 { 5905 "invalid direct packet write for LWT_OUT", 5906 .insns = { 5907 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 5908 offsetof(struct __sk_buff, data)), 5909 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 5910 offsetof(struct __sk_buff, data_end)), 5911 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 5912 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 5913 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 5914 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 5915 BPF_MOV64_IMM(BPF_REG_0, 0), 5916 BPF_EXIT_INSN(), 5917 }, 5918 .errstr = "cannot write into packet", 5919 .result = REJECT, 5920 .prog_type = BPF_PROG_TYPE_LWT_OUT, 5921 }, 5922 { 5923 "direct packet write for LWT_XMIT", 5924 .insns = { 5925 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 5926 offsetof(struct __sk_buff, data)), 5927 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 5928 offsetof(struct __sk_buff, data_end)), 5929 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 5930 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 5931 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 5932 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 5933 BPF_MOV64_IMM(BPF_REG_0, 0), 5934 BPF_EXIT_INSN(), 5935 }, 5936 .result = ACCEPT, 5937 .prog_type = BPF_PROG_TYPE_LWT_XMIT, 5938 }, 5939 { 5940 "direct packet read for LWT_IN", 5941 .insns = { 5942 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 5943 offsetof(struct __sk_buff, data)), 5944 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 5945 offsetof(struct __sk_buff, data_end)), 5946 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 5947 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 5948 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 5949 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 5950 BPF_MOV64_IMM(BPF_REG_0, 0), 5951 BPF_EXIT_INSN(), 5952 }, 5953 .result = ACCEPT, 5954 .prog_type = BPF_PROG_TYPE_LWT_IN, 5955 }, 5956 { 5957 "direct packet read for LWT_OUT", 5958 .insns = { 5959 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 5960 offsetof(struct __sk_buff, data)), 5961 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 5962 offsetof(struct __sk_buff, data_end)), 5963 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 5964 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 5965 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 5966 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 5967 BPF_MOV64_IMM(BPF_REG_0, 0), 5968 BPF_EXIT_INSN(), 5969 }, 5970 .result = ACCEPT, 5971 .prog_type = BPF_PROG_TYPE_LWT_OUT, 5972 }, 5973 { 5974 "direct packet read for LWT_XMIT", 5975 .insns = { 5976 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 5977 offsetof(struct __sk_buff, data)), 5978 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 5979 offsetof(struct __sk_buff, data_end)), 5980 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 5981 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 5982 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 5983 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 5984 BPF_MOV64_IMM(BPF_REG_0, 0), 5985 BPF_EXIT_INSN(), 5986 }, 5987 .result = ACCEPT, 5988 .prog_type = BPF_PROG_TYPE_LWT_XMIT, 5989 }, 5990 { 5991 "overlapping checks for direct packet access", 5992 .insns = { 5993 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 5994 offsetof(struct __sk_buff, data)), 5995 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 5996 offsetof(struct __sk_buff, data_end)), 5997 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 5998 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 5999 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 4), 6000 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 6001 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6), 6002 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 6003 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_2, 6), 6004 BPF_MOV64_IMM(BPF_REG_0, 0), 6005 BPF_EXIT_INSN(), 6006 }, 6007 .result = ACCEPT, 6008 .prog_type = BPF_PROG_TYPE_LWT_XMIT, 6009 }, 6010 { 6011 "make headroom for LWT_XMIT", 6012 .insns = { 6013 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 6014 BPF_MOV64_IMM(BPF_REG_2, 34), 6015 BPF_MOV64_IMM(BPF_REG_3, 0), 6016 BPF_EMIT_CALL(BPF_FUNC_skb_change_head), 6017 /* split for s390 to succeed */ 6018 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 6019 BPF_MOV64_IMM(BPF_REG_2, 42), 6020 BPF_MOV64_IMM(BPF_REG_3, 0), 6021 BPF_EMIT_CALL(BPF_FUNC_skb_change_head), 6022 BPF_MOV64_IMM(BPF_REG_0, 0), 6023 BPF_EXIT_INSN(), 6024 }, 6025 .result = ACCEPT, 6026 .prog_type = BPF_PROG_TYPE_LWT_XMIT, 6027 }, 6028 { 6029 "invalid access of tc_classid for LWT_IN", 6030 .insns = { 6031 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 6032 offsetof(struct __sk_buff, tc_classid)), 6033 BPF_EXIT_INSN(), 6034 }, 6035 .result = REJECT, 6036 .errstr = "invalid bpf_context access", 6037 }, 6038 { 6039 "invalid access of tc_classid for LWT_OUT", 6040 .insns = { 6041 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 6042 offsetof(struct __sk_buff, tc_classid)), 6043 BPF_EXIT_INSN(), 6044 }, 6045 .result = REJECT, 6046 .errstr = "invalid bpf_context access", 6047 }, 6048 { 6049 "invalid access of tc_classid for LWT_XMIT", 6050 .insns = { 6051 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 6052 offsetof(struct __sk_buff, tc_classid)), 6053 BPF_EXIT_INSN(), 6054 }, 6055 .result = REJECT, 6056 .errstr = "invalid bpf_context access", 6057 }, 6058 { 6059 "leak pointer into ctx 1", 6060 .insns = { 6061 BPF_MOV64_IMM(BPF_REG_0, 0), 6062 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 6063 offsetof(struct __sk_buff, cb[0])), 6064 BPF_LD_MAP_FD(BPF_REG_2, 0), 6065 BPF_STX_XADD(BPF_DW, BPF_REG_1, BPF_REG_2, 6066 offsetof(struct __sk_buff, cb[0])), 6067 BPF_EXIT_INSN(), 6068 }, 6069 .fixup_map_hash_8b = { 2 }, 6070 .errstr_unpriv = "R2 leaks addr into mem", 6071 .result_unpriv = REJECT, 6072 .result = REJECT, 6073 .errstr = "BPF_XADD stores into R1 ctx is not allowed", 6074 }, 6075 { 6076 "leak pointer into ctx 2", 6077 .insns = { 6078 BPF_MOV64_IMM(BPF_REG_0, 0), 6079 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 6080 offsetof(struct __sk_buff, cb[0])), 6081 BPF_STX_XADD(BPF_DW, BPF_REG_1, BPF_REG_10, 6082 offsetof(struct __sk_buff, cb[0])), 6083 BPF_EXIT_INSN(), 6084 }, 6085 .errstr_unpriv = "R10 leaks addr into mem", 6086 .result_unpriv = REJECT, 6087 .result = REJECT, 6088 .errstr = "BPF_XADD stores into R1 ctx is not allowed", 6089 }, 6090 { 6091 "leak pointer into ctx 3", 6092 .insns = { 6093 BPF_MOV64_IMM(BPF_REG_0, 0), 6094 BPF_LD_MAP_FD(BPF_REG_2, 0), 6095 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, 6096 offsetof(struct __sk_buff, cb[0])), 6097 BPF_EXIT_INSN(), 6098 }, 6099 .fixup_map_hash_8b = { 1 }, 6100 .errstr_unpriv = "R2 leaks addr into ctx", 6101 .result_unpriv = REJECT, 6102 .result = ACCEPT, 6103 }, 6104 { 6105 "leak pointer into map val", 6106 .insns = { 6107 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 6108 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6109 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6110 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6111 BPF_LD_MAP_FD(BPF_REG_1, 0), 6112 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6113 BPF_FUNC_map_lookup_elem), 6114 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 6115 BPF_MOV64_IMM(BPF_REG_3, 0), 6116 BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 6117 BPF_STX_XADD(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 6118 BPF_MOV64_IMM(BPF_REG_0, 0), 6119 BPF_EXIT_INSN(), 6120 }, 6121 .fixup_map_hash_8b = { 4 }, 6122 .errstr_unpriv = "R6 leaks addr into mem", 6123 .result_unpriv = REJECT, 6124 .result = ACCEPT, 6125 }, 6126 { 6127 "helper access to map: full range", 6128 .insns = { 6129 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6130 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6131 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6132 BPF_LD_MAP_FD(BPF_REG_1, 0), 6133 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6134 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6135 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6136 BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)), 6137 BPF_MOV64_IMM(BPF_REG_3, 0), 6138 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6139 BPF_EXIT_INSN(), 6140 }, 6141 .fixup_map_hash_48b = { 3 }, 6142 .result = ACCEPT, 6143 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6144 }, 6145 { 6146 "helper access to map: partial range", 6147 .insns = { 6148 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6149 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6150 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6151 BPF_LD_MAP_FD(BPF_REG_1, 0), 6152 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6153 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6154 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6155 BPF_MOV64_IMM(BPF_REG_2, 8), 6156 BPF_MOV64_IMM(BPF_REG_3, 0), 6157 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6158 BPF_EXIT_INSN(), 6159 }, 6160 .fixup_map_hash_48b = { 3 }, 6161 .result = ACCEPT, 6162 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6163 }, 6164 { 6165 "helper access to map: empty range", 6166 .insns = { 6167 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6168 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6169 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6170 BPF_LD_MAP_FD(BPF_REG_1, 0), 6171 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6172 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 6173 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6174 BPF_MOV64_IMM(BPF_REG_2, 0), 6175 BPF_EMIT_CALL(BPF_FUNC_trace_printk), 6176 BPF_EXIT_INSN(), 6177 }, 6178 .fixup_map_hash_48b = { 3 }, 6179 .errstr = "invalid access to map value, value_size=48 off=0 size=0", 6180 .result = REJECT, 6181 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6182 }, 6183 { 6184 "helper access to map: out-of-bound range", 6185 .insns = { 6186 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6187 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6188 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6189 BPF_LD_MAP_FD(BPF_REG_1, 0), 6190 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6191 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6192 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6193 BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val) + 8), 6194 BPF_MOV64_IMM(BPF_REG_3, 0), 6195 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6196 BPF_EXIT_INSN(), 6197 }, 6198 .fixup_map_hash_48b = { 3 }, 6199 .errstr = "invalid access to map value, value_size=48 off=0 size=56", 6200 .result = REJECT, 6201 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6202 }, 6203 { 6204 "helper access to map: negative range", 6205 .insns = { 6206 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6207 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6208 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6209 BPF_LD_MAP_FD(BPF_REG_1, 0), 6210 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6211 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6212 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6213 BPF_MOV64_IMM(BPF_REG_2, -8), 6214 BPF_MOV64_IMM(BPF_REG_3, 0), 6215 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6216 BPF_EXIT_INSN(), 6217 }, 6218 .fixup_map_hash_48b = { 3 }, 6219 .errstr = "R2 min value is negative", 6220 .result = REJECT, 6221 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6222 }, 6223 { 6224 "helper access to adjusted map (via const imm): full range", 6225 .insns = { 6226 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6227 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6228 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6229 BPF_LD_MAP_FD(BPF_REG_1, 0), 6230 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6231 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 6232 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6233 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6234 offsetof(struct test_val, foo)), 6235 BPF_MOV64_IMM(BPF_REG_2, 6236 sizeof(struct test_val) - 6237 offsetof(struct test_val, foo)), 6238 BPF_MOV64_IMM(BPF_REG_3, 0), 6239 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6240 BPF_EXIT_INSN(), 6241 }, 6242 .fixup_map_hash_48b = { 3 }, 6243 .result = ACCEPT, 6244 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6245 }, 6246 { 6247 "helper access to adjusted map (via const imm): partial range", 6248 .insns = { 6249 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6250 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6251 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6252 BPF_LD_MAP_FD(BPF_REG_1, 0), 6253 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6254 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 6255 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6256 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6257 offsetof(struct test_val, foo)), 6258 BPF_MOV64_IMM(BPF_REG_2, 8), 6259 BPF_MOV64_IMM(BPF_REG_3, 0), 6260 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6261 BPF_EXIT_INSN(), 6262 }, 6263 .fixup_map_hash_48b = { 3 }, 6264 .result = ACCEPT, 6265 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6266 }, 6267 { 6268 "helper access to adjusted map (via const imm): empty range", 6269 .insns = { 6270 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6271 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6272 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6273 BPF_LD_MAP_FD(BPF_REG_1, 0), 6274 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6275 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6276 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6277 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6278 offsetof(struct test_val, foo)), 6279 BPF_MOV64_IMM(BPF_REG_2, 0), 6280 BPF_EMIT_CALL(BPF_FUNC_trace_printk), 6281 BPF_EXIT_INSN(), 6282 }, 6283 .fixup_map_hash_48b = { 3 }, 6284 .errstr = "invalid access to map value, value_size=48 off=4 size=0", 6285 .result = REJECT, 6286 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6287 }, 6288 { 6289 "helper access to adjusted map (via const imm): out-of-bound range", 6290 .insns = { 6291 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6292 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6293 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6294 BPF_LD_MAP_FD(BPF_REG_1, 0), 6295 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6296 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 6297 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6298 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6299 offsetof(struct test_val, foo)), 6300 BPF_MOV64_IMM(BPF_REG_2, 6301 sizeof(struct test_val) - 6302 offsetof(struct test_val, foo) + 8), 6303 BPF_MOV64_IMM(BPF_REG_3, 0), 6304 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6305 BPF_EXIT_INSN(), 6306 }, 6307 .fixup_map_hash_48b = { 3 }, 6308 .errstr = "invalid access to map value, value_size=48 off=4 size=52", 6309 .result = REJECT, 6310 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6311 }, 6312 { 6313 "helper access to adjusted map (via const imm): negative range (> adjustment)", 6314 .insns = { 6315 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6316 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6317 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6318 BPF_LD_MAP_FD(BPF_REG_1, 0), 6319 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6320 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 6321 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6322 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6323 offsetof(struct test_val, foo)), 6324 BPF_MOV64_IMM(BPF_REG_2, -8), 6325 BPF_MOV64_IMM(BPF_REG_3, 0), 6326 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6327 BPF_EXIT_INSN(), 6328 }, 6329 .fixup_map_hash_48b = { 3 }, 6330 .errstr = "R2 min value is negative", 6331 .result = REJECT, 6332 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6333 }, 6334 { 6335 "helper access to adjusted map (via const imm): negative range (< adjustment)", 6336 .insns = { 6337 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6338 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6339 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6340 BPF_LD_MAP_FD(BPF_REG_1, 0), 6341 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6342 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 6343 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6344 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6345 offsetof(struct test_val, foo)), 6346 BPF_MOV64_IMM(BPF_REG_2, -1), 6347 BPF_MOV64_IMM(BPF_REG_3, 0), 6348 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6349 BPF_EXIT_INSN(), 6350 }, 6351 .fixup_map_hash_48b = { 3 }, 6352 .errstr = "R2 min value is negative", 6353 .result = REJECT, 6354 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6355 }, 6356 { 6357 "helper access to adjusted map (via const reg): full range", 6358 .insns = { 6359 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6360 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6361 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6362 BPF_LD_MAP_FD(BPF_REG_1, 0), 6363 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6364 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6365 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6366 BPF_MOV64_IMM(BPF_REG_3, 6367 offsetof(struct test_val, foo)), 6368 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6369 BPF_MOV64_IMM(BPF_REG_2, 6370 sizeof(struct test_val) - 6371 offsetof(struct test_val, foo)), 6372 BPF_MOV64_IMM(BPF_REG_3, 0), 6373 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6374 BPF_EXIT_INSN(), 6375 }, 6376 .fixup_map_hash_48b = { 3 }, 6377 .result = ACCEPT, 6378 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6379 }, 6380 { 6381 "helper access to adjusted map (via const reg): partial range", 6382 .insns = { 6383 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6384 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6385 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6386 BPF_LD_MAP_FD(BPF_REG_1, 0), 6387 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6388 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6389 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6390 BPF_MOV64_IMM(BPF_REG_3, 6391 offsetof(struct test_val, foo)), 6392 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6393 BPF_MOV64_IMM(BPF_REG_2, 8), 6394 BPF_MOV64_IMM(BPF_REG_3, 0), 6395 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6396 BPF_EXIT_INSN(), 6397 }, 6398 .fixup_map_hash_48b = { 3 }, 6399 .result = ACCEPT, 6400 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6401 }, 6402 { 6403 "helper access to adjusted map (via const reg): empty range", 6404 .insns = { 6405 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6406 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6407 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6408 BPF_LD_MAP_FD(BPF_REG_1, 0), 6409 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6410 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 6411 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6412 BPF_MOV64_IMM(BPF_REG_3, 0), 6413 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6414 BPF_MOV64_IMM(BPF_REG_2, 0), 6415 BPF_EMIT_CALL(BPF_FUNC_trace_printk), 6416 BPF_EXIT_INSN(), 6417 }, 6418 .fixup_map_hash_48b = { 3 }, 6419 .errstr = "R1 min value is outside of the array range", 6420 .result = REJECT, 6421 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6422 }, 6423 { 6424 "helper access to adjusted map (via const reg): out-of-bound range", 6425 .insns = { 6426 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6427 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6428 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6429 BPF_LD_MAP_FD(BPF_REG_1, 0), 6430 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6431 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6432 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6433 BPF_MOV64_IMM(BPF_REG_3, 6434 offsetof(struct test_val, foo)), 6435 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6436 BPF_MOV64_IMM(BPF_REG_2, 6437 sizeof(struct test_val) - 6438 offsetof(struct test_val, foo) + 8), 6439 BPF_MOV64_IMM(BPF_REG_3, 0), 6440 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6441 BPF_EXIT_INSN(), 6442 }, 6443 .fixup_map_hash_48b = { 3 }, 6444 .errstr = "invalid access to map value, value_size=48 off=4 size=52", 6445 .result = REJECT, 6446 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6447 }, 6448 { 6449 "helper access to adjusted map (via const reg): negative range (> adjustment)", 6450 .insns = { 6451 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6452 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6453 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6454 BPF_LD_MAP_FD(BPF_REG_1, 0), 6455 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6456 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6457 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6458 BPF_MOV64_IMM(BPF_REG_3, 6459 offsetof(struct test_val, foo)), 6460 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6461 BPF_MOV64_IMM(BPF_REG_2, -8), 6462 BPF_MOV64_IMM(BPF_REG_3, 0), 6463 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6464 BPF_EXIT_INSN(), 6465 }, 6466 .fixup_map_hash_48b = { 3 }, 6467 .errstr = "R2 min value is negative", 6468 .result = REJECT, 6469 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6470 }, 6471 { 6472 "helper access to adjusted map (via const reg): negative range (< adjustment)", 6473 .insns = { 6474 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6475 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6476 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6477 BPF_LD_MAP_FD(BPF_REG_1, 0), 6478 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6479 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6480 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6481 BPF_MOV64_IMM(BPF_REG_3, 6482 offsetof(struct test_val, foo)), 6483 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6484 BPF_MOV64_IMM(BPF_REG_2, -1), 6485 BPF_MOV64_IMM(BPF_REG_3, 0), 6486 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6487 BPF_EXIT_INSN(), 6488 }, 6489 .fixup_map_hash_48b = { 3 }, 6490 .errstr = "R2 min value is negative", 6491 .result = REJECT, 6492 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6493 }, 6494 { 6495 "helper access to adjusted map (via variable): full range", 6496 .insns = { 6497 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6498 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6499 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6500 BPF_LD_MAP_FD(BPF_REG_1, 0), 6501 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6502 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 6503 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6504 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6505 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 6506 offsetof(struct test_val, foo), 4), 6507 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6508 BPF_MOV64_IMM(BPF_REG_2, 6509 sizeof(struct test_val) - 6510 offsetof(struct test_val, foo)), 6511 BPF_MOV64_IMM(BPF_REG_3, 0), 6512 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6513 BPF_EXIT_INSN(), 6514 }, 6515 .fixup_map_hash_48b = { 3 }, 6516 .result = ACCEPT, 6517 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6518 }, 6519 { 6520 "helper access to adjusted map (via variable): partial range", 6521 .insns = { 6522 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6523 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6524 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6525 BPF_LD_MAP_FD(BPF_REG_1, 0), 6526 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6527 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 6528 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6529 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6530 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 6531 offsetof(struct test_val, foo), 4), 6532 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6533 BPF_MOV64_IMM(BPF_REG_2, 8), 6534 BPF_MOV64_IMM(BPF_REG_3, 0), 6535 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6536 BPF_EXIT_INSN(), 6537 }, 6538 .fixup_map_hash_48b = { 3 }, 6539 .result = ACCEPT, 6540 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6541 }, 6542 { 6543 "helper access to adjusted map (via variable): empty range", 6544 .insns = { 6545 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6546 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6547 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6548 BPF_LD_MAP_FD(BPF_REG_1, 0), 6549 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6550 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6551 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6552 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6553 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 6554 offsetof(struct test_val, foo), 3), 6555 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6556 BPF_MOV64_IMM(BPF_REG_2, 0), 6557 BPF_EMIT_CALL(BPF_FUNC_trace_printk), 6558 BPF_EXIT_INSN(), 6559 }, 6560 .fixup_map_hash_48b = { 3 }, 6561 .errstr = "R1 min value is outside of the array range", 6562 .result = REJECT, 6563 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6564 }, 6565 { 6566 "helper access to adjusted map (via variable): no max check", 6567 .insns = { 6568 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6569 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6570 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6571 BPF_LD_MAP_FD(BPF_REG_1, 0), 6572 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6573 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6574 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6575 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6576 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6577 BPF_MOV64_IMM(BPF_REG_2, 1), 6578 BPF_MOV64_IMM(BPF_REG_3, 0), 6579 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6580 BPF_EXIT_INSN(), 6581 }, 6582 .fixup_map_hash_48b = { 3 }, 6583 .errstr = "R1 unbounded memory access", 6584 .result = REJECT, 6585 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6586 }, 6587 { 6588 "helper access to adjusted map (via variable): wrong max check", 6589 .insns = { 6590 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6591 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6592 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6593 BPF_LD_MAP_FD(BPF_REG_1, 0), 6594 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6595 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 6596 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6597 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6598 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 6599 offsetof(struct test_val, foo), 4), 6600 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6601 BPF_MOV64_IMM(BPF_REG_2, 6602 sizeof(struct test_val) - 6603 offsetof(struct test_val, foo) + 1), 6604 BPF_MOV64_IMM(BPF_REG_3, 0), 6605 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6606 BPF_EXIT_INSN(), 6607 }, 6608 .fixup_map_hash_48b = { 3 }, 6609 .errstr = "invalid access to map value, value_size=48 off=4 size=45", 6610 .result = REJECT, 6611 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6612 }, 6613 { 6614 "helper access to map: bounds check using <, good access", 6615 .insns = { 6616 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6617 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6618 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6619 BPF_LD_MAP_FD(BPF_REG_1, 0), 6620 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6621 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6622 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6623 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6624 BPF_JMP_IMM(BPF_JLT, BPF_REG_3, 32, 2), 6625 BPF_MOV64_IMM(BPF_REG_0, 0), 6626 BPF_EXIT_INSN(), 6627 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6628 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6629 BPF_MOV64_IMM(BPF_REG_0, 0), 6630 BPF_EXIT_INSN(), 6631 }, 6632 .fixup_map_hash_48b = { 3 }, 6633 .result = ACCEPT, 6634 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6635 }, 6636 { 6637 "helper access to map: bounds check using <, bad access", 6638 .insns = { 6639 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6640 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6641 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6642 BPF_LD_MAP_FD(BPF_REG_1, 0), 6643 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6644 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6645 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6646 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6647 BPF_JMP_IMM(BPF_JLT, BPF_REG_3, 32, 4), 6648 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6649 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6650 BPF_MOV64_IMM(BPF_REG_0, 0), 6651 BPF_EXIT_INSN(), 6652 BPF_MOV64_IMM(BPF_REG_0, 0), 6653 BPF_EXIT_INSN(), 6654 }, 6655 .fixup_map_hash_48b = { 3 }, 6656 .result = REJECT, 6657 .errstr = "R1 unbounded memory access", 6658 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6659 }, 6660 { 6661 "helper access to map: bounds check using <=, good access", 6662 .insns = { 6663 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6664 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6665 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6666 BPF_LD_MAP_FD(BPF_REG_1, 0), 6667 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6668 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6669 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6670 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6671 BPF_JMP_IMM(BPF_JLE, BPF_REG_3, 32, 2), 6672 BPF_MOV64_IMM(BPF_REG_0, 0), 6673 BPF_EXIT_INSN(), 6674 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6675 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6676 BPF_MOV64_IMM(BPF_REG_0, 0), 6677 BPF_EXIT_INSN(), 6678 }, 6679 .fixup_map_hash_48b = { 3 }, 6680 .result = ACCEPT, 6681 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6682 }, 6683 { 6684 "helper access to map: bounds check using <=, bad access", 6685 .insns = { 6686 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6687 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6688 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6689 BPF_LD_MAP_FD(BPF_REG_1, 0), 6690 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6691 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6692 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6693 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6694 BPF_JMP_IMM(BPF_JLE, BPF_REG_3, 32, 4), 6695 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6696 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6697 BPF_MOV64_IMM(BPF_REG_0, 0), 6698 BPF_EXIT_INSN(), 6699 BPF_MOV64_IMM(BPF_REG_0, 0), 6700 BPF_EXIT_INSN(), 6701 }, 6702 .fixup_map_hash_48b = { 3 }, 6703 .result = REJECT, 6704 .errstr = "R1 unbounded memory access", 6705 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6706 }, 6707 { 6708 "helper access to map: bounds check using s<, good access", 6709 .insns = { 6710 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6711 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6712 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6713 BPF_LD_MAP_FD(BPF_REG_1, 0), 6714 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6715 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6716 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6717 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6718 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 32, 2), 6719 BPF_MOV64_IMM(BPF_REG_0, 0), 6720 BPF_EXIT_INSN(), 6721 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 0, -3), 6722 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6723 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6724 BPF_MOV64_IMM(BPF_REG_0, 0), 6725 BPF_EXIT_INSN(), 6726 }, 6727 .fixup_map_hash_48b = { 3 }, 6728 .result = ACCEPT, 6729 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6730 }, 6731 { 6732 "helper access to map: bounds check using s<, good access 2", 6733 .insns = { 6734 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6735 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6736 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6737 BPF_LD_MAP_FD(BPF_REG_1, 0), 6738 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6739 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6740 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6741 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6742 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 32, 2), 6743 BPF_MOV64_IMM(BPF_REG_0, 0), 6744 BPF_EXIT_INSN(), 6745 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, -3, -3), 6746 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6747 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6748 BPF_MOV64_IMM(BPF_REG_0, 0), 6749 BPF_EXIT_INSN(), 6750 }, 6751 .fixup_map_hash_48b = { 3 }, 6752 .result = ACCEPT, 6753 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6754 }, 6755 { 6756 "helper access to map: bounds check using s<, bad access", 6757 .insns = { 6758 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6759 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6760 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6761 BPF_LD_MAP_FD(BPF_REG_1, 0), 6762 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6763 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6764 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6765 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0), 6766 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 32, 2), 6767 BPF_MOV64_IMM(BPF_REG_0, 0), 6768 BPF_EXIT_INSN(), 6769 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, -3, -3), 6770 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6771 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6772 BPF_MOV64_IMM(BPF_REG_0, 0), 6773 BPF_EXIT_INSN(), 6774 }, 6775 .fixup_map_hash_48b = { 3 }, 6776 .result = REJECT, 6777 .errstr = "R1 min value is negative", 6778 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6779 }, 6780 { 6781 "helper access to map: bounds check using s<=, good access", 6782 .insns = { 6783 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6784 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6785 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6786 BPF_LD_MAP_FD(BPF_REG_1, 0), 6787 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6788 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6789 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6790 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6791 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 32, 2), 6792 BPF_MOV64_IMM(BPF_REG_0, 0), 6793 BPF_EXIT_INSN(), 6794 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 0, -3), 6795 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6796 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6797 BPF_MOV64_IMM(BPF_REG_0, 0), 6798 BPF_EXIT_INSN(), 6799 }, 6800 .fixup_map_hash_48b = { 3 }, 6801 .result = ACCEPT, 6802 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6803 }, 6804 { 6805 "helper access to map: bounds check using s<=, good access 2", 6806 .insns = { 6807 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6808 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6809 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6810 BPF_LD_MAP_FD(BPF_REG_1, 0), 6811 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6812 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6813 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6814 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6815 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 32, 2), 6816 BPF_MOV64_IMM(BPF_REG_0, 0), 6817 BPF_EXIT_INSN(), 6818 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, -3, -3), 6819 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6820 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6821 BPF_MOV64_IMM(BPF_REG_0, 0), 6822 BPF_EXIT_INSN(), 6823 }, 6824 .fixup_map_hash_48b = { 3 }, 6825 .result = ACCEPT, 6826 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6827 }, 6828 { 6829 "helper access to map: bounds check using s<=, bad access", 6830 .insns = { 6831 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6832 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6833 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6834 BPF_LD_MAP_FD(BPF_REG_1, 0), 6835 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6836 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6837 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6838 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0), 6839 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 32, 2), 6840 BPF_MOV64_IMM(BPF_REG_0, 0), 6841 BPF_EXIT_INSN(), 6842 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, -3, -3), 6843 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6844 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6845 BPF_MOV64_IMM(BPF_REG_0, 0), 6846 BPF_EXIT_INSN(), 6847 }, 6848 .fixup_map_hash_48b = { 3 }, 6849 .result = REJECT, 6850 .errstr = "R1 min value is negative", 6851 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6852 }, 6853 { 6854 "map access: known scalar += value_ptr from different maps", 6855 .insns = { 6856 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 6857 offsetof(struct __sk_buff, len)), 6858 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6859 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6860 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6861 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 1, 3), 6862 BPF_LD_MAP_FD(BPF_REG_1, 0), 6863 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2), 6864 BPF_LD_MAP_FD(BPF_REG_1, 0), 6865 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6866 BPF_FUNC_map_lookup_elem), 6867 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 6868 BPF_MOV64_IMM(BPF_REG_1, 4), 6869 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), 6870 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 6871 BPF_MOV64_IMM(BPF_REG_0, 1), 6872 BPF_EXIT_INSN(), 6873 }, 6874 .fixup_map_hash_16b = { 5 }, 6875 .fixup_map_array_48b = { 8 }, 6876 .result = ACCEPT, 6877 .result_unpriv = REJECT, 6878 .errstr_unpriv = "R1 tried to add from different maps", 6879 .retval = 1, 6880 }, 6881 { 6882 "map access: value_ptr -= known scalar from different maps", 6883 .insns = { 6884 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 6885 offsetof(struct __sk_buff, len)), 6886 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6887 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6888 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6889 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 1, 3), 6890 BPF_LD_MAP_FD(BPF_REG_1, 0), 6891 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2), 6892 BPF_LD_MAP_FD(BPF_REG_1, 0), 6893 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6894 BPF_FUNC_map_lookup_elem), 6895 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6896 BPF_MOV64_IMM(BPF_REG_1, 4), 6897 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 6898 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 6899 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 6900 BPF_MOV64_IMM(BPF_REG_0, 1), 6901 BPF_EXIT_INSN(), 6902 }, 6903 .fixup_map_hash_16b = { 5 }, 6904 .fixup_map_array_48b = { 8 }, 6905 .result = ACCEPT, 6906 .result_unpriv = REJECT, 6907 .errstr_unpriv = "R0 min value is outside of the array range", 6908 .retval = 1, 6909 }, 6910 { 6911 "map access: known scalar += value_ptr from different maps, but same value properties", 6912 .insns = { 6913 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 6914 offsetof(struct __sk_buff, len)), 6915 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6916 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6917 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6918 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 1, 3), 6919 BPF_LD_MAP_FD(BPF_REG_1, 0), 6920 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2), 6921 BPF_LD_MAP_FD(BPF_REG_1, 0), 6922 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6923 BPF_FUNC_map_lookup_elem), 6924 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 6925 BPF_MOV64_IMM(BPF_REG_1, 4), 6926 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), 6927 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 6928 BPF_MOV64_IMM(BPF_REG_0, 1), 6929 BPF_EXIT_INSN(), 6930 }, 6931 .fixup_map_hash_48b = { 5 }, 6932 .fixup_map_array_48b = { 8 }, 6933 .result = ACCEPT, 6934 .retval = 1, 6935 }, 6936 { 6937 "map access: mixing value pointer and scalar, 1", 6938 .insns = { 6939 // load map value pointer into r0 and r2 6940 BPF_MOV64_IMM(BPF_REG_0, 1), 6941 BPF_LD_MAP_FD(BPF_REG_ARG1, 0), 6942 BPF_MOV64_REG(BPF_REG_ARG2, BPF_REG_FP), 6943 BPF_ALU64_IMM(BPF_ADD, BPF_REG_ARG2, -16), 6944 BPF_ST_MEM(BPF_DW, BPF_REG_FP, -16, 0), 6945 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6946 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 6947 BPF_EXIT_INSN(), 6948 // load some number from the map into r1 6949 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 6950 // depending on r1, branch: 6951 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 3), 6952 // branch A 6953 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 6954 BPF_MOV64_IMM(BPF_REG_3, 0), 6955 BPF_JMP_A(2), 6956 // branch B 6957 BPF_MOV64_IMM(BPF_REG_2, 0), 6958 BPF_MOV64_IMM(BPF_REG_3, 0x100000), 6959 // common instruction 6960 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3), 6961 // depending on r1, branch: 6962 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 6963 // branch A 6964 BPF_JMP_A(4), 6965 // branch B 6966 BPF_MOV64_IMM(BPF_REG_0, 0x13371337), 6967 // verifier follows fall-through 6968 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0x100000, 2), 6969 BPF_MOV64_IMM(BPF_REG_0, 0), 6970 BPF_EXIT_INSN(), 6971 // fake-dead code; targeted from branch A to 6972 // prevent dead code sanitization 6973 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 6974 BPF_MOV64_IMM(BPF_REG_0, 0), 6975 BPF_EXIT_INSN(), 6976 }, 6977 .fixup_map_array_48b = { 1 }, 6978 .result = ACCEPT, 6979 .result_unpriv = REJECT, 6980 .errstr_unpriv = "R2 tried to add from different pointers or scalars", 6981 .retval = 0, 6982 }, 6983 { 6984 "map access: mixing value pointer and scalar, 2", 6985 .insns = { 6986 // load map value pointer into r0 and r2 6987 BPF_MOV64_IMM(BPF_REG_0, 1), 6988 BPF_LD_MAP_FD(BPF_REG_ARG1, 0), 6989 BPF_MOV64_REG(BPF_REG_ARG2, BPF_REG_FP), 6990 BPF_ALU64_IMM(BPF_ADD, BPF_REG_ARG2, -16), 6991 BPF_ST_MEM(BPF_DW, BPF_REG_FP, -16, 0), 6992 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6993 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 6994 BPF_EXIT_INSN(), 6995 // load some number from the map into r1 6996 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 6997 // depending on r1, branch: 6998 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3), 6999 // branch A 7000 BPF_MOV64_IMM(BPF_REG_2, 0), 7001 BPF_MOV64_IMM(BPF_REG_3, 0x100000), 7002 BPF_JMP_A(2), 7003 // branch B 7004 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7005 BPF_MOV64_IMM(BPF_REG_3, 0), 7006 // common instruction 7007 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3), 7008 // depending on r1, branch: 7009 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 7010 // branch A 7011 BPF_JMP_A(4), 7012 // branch B 7013 BPF_MOV64_IMM(BPF_REG_0, 0x13371337), 7014 // verifier follows fall-through 7015 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0x100000, 2), 7016 BPF_MOV64_IMM(BPF_REG_0, 0), 7017 BPF_EXIT_INSN(), 7018 // fake-dead code; targeted from branch A to 7019 // prevent dead code sanitization 7020 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 7021 BPF_MOV64_IMM(BPF_REG_0, 0), 7022 BPF_EXIT_INSN(), 7023 }, 7024 .fixup_map_array_48b = { 1 }, 7025 .result = ACCEPT, 7026 .result_unpriv = REJECT, 7027 .errstr_unpriv = "R2 tried to add from different maps or paths", 7028 .retval = 0, 7029 }, 7030 { 7031 "sanitation: alu with different scalars", 7032 .insns = { 7033 BPF_MOV64_IMM(BPF_REG_0, 1), 7034 BPF_LD_MAP_FD(BPF_REG_ARG1, 0), 7035 BPF_MOV64_REG(BPF_REG_ARG2, BPF_REG_FP), 7036 BPF_ALU64_IMM(BPF_ADD, BPF_REG_ARG2, -16), 7037 BPF_ST_MEM(BPF_DW, BPF_REG_FP, -16, 0), 7038 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7039 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 7040 BPF_EXIT_INSN(), 7041 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7042 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3), 7043 BPF_MOV64_IMM(BPF_REG_2, 0), 7044 BPF_MOV64_IMM(BPF_REG_3, 0x100000), 7045 BPF_JMP_A(2), 7046 BPF_MOV64_IMM(BPF_REG_2, 42), 7047 BPF_MOV64_IMM(BPF_REG_3, 0x100001), 7048 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3), 7049 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 7050 BPF_EXIT_INSN(), 7051 }, 7052 .fixup_map_array_48b = { 1 }, 7053 .result = ACCEPT, 7054 .retval = 0x100000, 7055 }, 7056 { 7057 "map access: value_ptr += known scalar, upper oob arith, test 1", 7058 .insns = { 7059 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7060 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7061 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7062 BPF_LD_MAP_FD(BPF_REG_1, 0), 7063 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7064 BPF_FUNC_map_lookup_elem), 7065 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 7066 BPF_MOV64_IMM(BPF_REG_1, 48), 7067 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7068 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 7069 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 7070 BPF_MOV64_IMM(BPF_REG_0, 1), 7071 BPF_EXIT_INSN(), 7072 }, 7073 .fixup_map_array_48b = { 3 }, 7074 .result = ACCEPT, 7075 .result_unpriv = REJECT, 7076 .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", 7077 .retval = 1, 7078 }, 7079 { 7080 "map access: value_ptr += known scalar, upper oob arith, test 2", 7081 .insns = { 7082 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7083 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7084 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7085 BPF_LD_MAP_FD(BPF_REG_1, 0), 7086 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7087 BPF_FUNC_map_lookup_elem), 7088 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 7089 BPF_MOV64_IMM(BPF_REG_1, 49), 7090 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7091 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 7092 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 7093 BPF_MOV64_IMM(BPF_REG_0, 1), 7094 BPF_EXIT_INSN(), 7095 }, 7096 .fixup_map_array_48b = { 3 }, 7097 .result = ACCEPT, 7098 .result_unpriv = REJECT, 7099 .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", 7100 .retval = 1, 7101 }, 7102 { 7103 "map access: value_ptr += known scalar, upper oob arith, test 3", 7104 .insns = { 7105 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7106 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7107 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7108 BPF_LD_MAP_FD(BPF_REG_1, 0), 7109 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7110 BPF_FUNC_map_lookup_elem), 7111 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 7112 BPF_MOV64_IMM(BPF_REG_1, 47), 7113 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7114 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 7115 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 7116 BPF_MOV64_IMM(BPF_REG_0, 1), 7117 BPF_EXIT_INSN(), 7118 }, 7119 .fixup_map_array_48b = { 3 }, 7120 .result = ACCEPT, 7121 .result_unpriv = REJECT, 7122 .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", 7123 .retval = 1, 7124 }, 7125 { 7126 "map access: value_ptr -= known scalar, lower oob arith, test 1", 7127 .insns = { 7128 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7129 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7130 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7131 BPF_LD_MAP_FD(BPF_REG_1, 0), 7132 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7133 BPF_FUNC_map_lookup_elem), 7134 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 7135 BPF_MOV64_IMM(BPF_REG_1, 47), 7136 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7137 BPF_MOV64_IMM(BPF_REG_1, 48), 7138 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 7139 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 7140 BPF_MOV64_IMM(BPF_REG_0, 1), 7141 BPF_EXIT_INSN(), 7142 }, 7143 .fixup_map_array_48b = { 3 }, 7144 .result = REJECT, 7145 .errstr = "R0 min value is outside of the array range", 7146 .result_unpriv = REJECT, 7147 .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", 7148 }, 7149 { 7150 "map access: value_ptr -= known scalar, lower oob arith, test 2", 7151 .insns = { 7152 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7153 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7154 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7155 BPF_LD_MAP_FD(BPF_REG_1, 0), 7156 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7157 BPF_FUNC_map_lookup_elem), 7158 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 7159 BPF_MOV64_IMM(BPF_REG_1, 47), 7160 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7161 BPF_MOV64_IMM(BPF_REG_1, 48), 7162 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 7163 BPF_MOV64_IMM(BPF_REG_1, 1), 7164 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7165 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 7166 BPF_MOV64_IMM(BPF_REG_0, 1), 7167 BPF_EXIT_INSN(), 7168 }, 7169 .fixup_map_array_48b = { 3 }, 7170 .result = ACCEPT, 7171 .result_unpriv = REJECT, 7172 .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", 7173 .retval = 1, 7174 }, 7175 { 7176 "map access: value_ptr -= known scalar, lower oob arith, test 3", 7177 .insns = { 7178 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7179 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7180 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7181 BPF_LD_MAP_FD(BPF_REG_1, 0), 7182 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7183 BPF_FUNC_map_lookup_elem), 7184 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 7185 BPF_MOV64_IMM(BPF_REG_1, 47), 7186 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7187 BPF_MOV64_IMM(BPF_REG_1, 47), 7188 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 7189 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 7190 BPF_MOV64_IMM(BPF_REG_0, 1), 7191 BPF_EXIT_INSN(), 7192 }, 7193 .fixup_map_array_48b = { 3 }, 7194 .result = ACCEPT, 7195 .result_unpriv = REJECT, 7196 .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", 7197 .retval = 1, 7198 }, 7199 { 7200 "map access: known scalar += value_ptr", 7201 .insns = { 7202 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7203 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7204 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7205 BPF_LD_MAP_FD(BPF_REG_1, 0), 7206 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7207 BPF_FUNC_map_lookup_elem), 7208 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 7209 BPF_MOV64_IMM(BPF_REG_1, 4), 7210 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), 7211 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 7212 BPF_MOV64_IMM(BPF_REG_0, 1), 7213 BPF_EXIT_INSN(), 7214 }, 7215 .fixup_map_array_48b = { 3 }, 7216 .result = ACCEPT, 7217 .retval = 1, 7218 }, 7219 { 7220 "map access: value_ptr += known scalar, 1", 7221 .insns = { 7222 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7223 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7224 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7225 BPF_LD_MAP_FD(BPF_REG_1, 0), 7226 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7227 BPF_FUNC_map_lookup_elem), 7228 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 7229 BPF_MOV64_IMM(BPF_REG_1, 4), 7230 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7231 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7232 BPF_MOV64_IMM(BPF_REG_0, 1), 7233 BPF_EXIT_INSN(), 7234 }, 7235 .fixup_map_array_48b = { 3 }, 7236 .result = ACCEPT, 7237 .retval = 1, 7238 }, 7239 { 7240 "map access: value_ptr += known scalar, 2", 7241 .insns = { 7242 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7243 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7244 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7245 BPF_LD_MAP_FD(BPF_REG_1, 0), 7246 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7247 BPF_FUNC_map_lookup_elem), 7248 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 7249 BPF_MOV64_IMM(BPF_REG_1, 49), 7250 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7251 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7252 BPF_MOV64_IMM(BPF_REG_0, 1), 7253 BPF_EXIT_INSN(), 7254 }, 7255 .fixup_map_array_48b = { 3 }, 7256 .result = REJECT, 7257 .errstr = "invalid access to map value", 7258 }, 7259 { 7260 "map access: value_ptr += known scalar, 3", 7261 .insns = { 7262 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7263 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7264 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7265 BPF_LD_MAP_FD(BPF_REG_1, 0), 7266 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7267 BPF_FUNC_map_lookup_elem), 7268 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 7269 BPF_MOV64_IMM(BPF_REG_1, -1), 7270 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7271 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7272 BPF_MOV64_IMM(BPF_REG_0, 1), 7273 BPF_EXIT_INSN(), 7274 }, 7275 .fixup_map_array_48b = { 3 }, 7276 .result = REJECT, 7277 .errstr = "invalid access to map value", 7278 }, 7279 { 7280 "map access: value_ptr += known scalar, 4", 7281 .insns = { 7282 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7283 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7284 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7285 BPF_LD_MAP_FD(BPF_REG_1, 0), 7286 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7287 BPF_FUNC_map_lookup_elem), 7288 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 7289 BPF_MOV64_IMM(BPF_REG_1, 5), 7290 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7291 BPF_MOV64_IMM(BPF_REG_1, -2), 7292 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7293 BPF_MOV64_IMM(BPF_REG_1, -1), 7294 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7295 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7296 BPF_MOV64_IMM(BPF_REG_0, 1), 7297 BPF_EXIT_INSN(), 7298 }, 7299 .fixup_map_array_48b = { 3 }, 7300 .result = ACCEPT, 7301 .result_unpriv = REJECT, 7302 .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", 7303 .retval = 1, 7304 }, 7305 { 7306 "map access: value_ptr += known scalar, 5", 7307 .insns = { 7308 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7309 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7310 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7311 BPF_LD_MAP_FD(BPF_REG_1, 0), 7312 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7313 BPF_FUNC_map_lookup_elem), 7314 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 7315 BPF_MOV64_IMM(BPF_REG_1, (6 + 1) * sizeof(int)), 7316 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), 7317 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 7318 BPF_EXIT_INSN(), 7319 }, 7320 .fixup_map_array_48b = { 3 }, 7321 .result = ACCEPT, 7322 .retval = 0xabcdef12, 7323 }, 7324 { 7325 "map access: value_ptr += known scalar, 6", 7326 .insns = { 7327 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7328 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7329 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7330 BPF_LD_MAP_FD(BPF_REG_1, 0), 7331 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7332 BPF_FUNC_map_lookup_elem), 7333 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 7334 BPF_MOV64_IMM(BPF_REG_1, (3 + 1) * sizeof(int)), 7335 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7336 BPF_MOV64_IMM(BPF_REG_1, 3 * sizeof(int)), 7337 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7338 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 0), 7339 BPF_EXIT_INSN(), 7340 }, 7341 .fixup_map_array_48b = { 3 }, 7342 .result = ACCEPT, 7343 .retval = 0xabcdef12, 7344 }, 7345 { 7346 "map access: unknown scalar += value_ptr, 1", 7347 .insns = { 7348 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7349 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7350 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7351 BPF_LD_MAP_FD(BPF_REG_1, 0), 7352 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7353 BPF_FUNC_map_lookup_elem), 7354 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 7355 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7356 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xf), 7357 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), 7358 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 7359 BPF_MOV64_IMM(BPF_REG_0, 1), 7360 BPF_EXIT_INSN(), 7361 }, 7362 .fixup_map_array_48b = { 3 }, 7363 .result = ACCEPT, 7364 .retval = 1, 7365 }, 7366 { 7367 "map access: unknown scalar += value_ptr, 2", 7368 .insns = { 7369 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7370 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7371 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7372 BPF_LD_MAP_FD(BPF_REG_1, 0), 7373 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7374 BPF_FUNC_map_lookup_elem), 7375 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 7376 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 7377 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 31), 7378 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), 7379 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 7380 BPF_EXIT_INSN(), 7381 }, 7382 .fixup_map_array_48b = { 3 }, 7383 .result = ACCEPT, 7384 .retval = 0xabcdef12, 7385 }, 7386 { 7387 "map access: unknown scalar += value_ptr, 3", 7388 .insns = { 7389 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7390 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7391 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7392 BPF_LD_MAP_FD(BPF_REG_1, 0), 7393 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7394 BPF_FUNC_map_lookup_elem), 7395 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8), 7396 BPF_MOV64_IMM(BPF_REG_1, -1), 7397 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7398 BPF_MOV64_IMM(BPF_REG_1, 1), 7399 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7400 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 7401 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 31), 7402 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), 7403 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 7404 BPF_EXIT_INSN(), 7405 }, 7406 .fixup_map_array_48b = { 3 }, 7407 .result = ACCEPT, 7408 .result_unpriv = REJECT, 7409 .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", 7410 .retval = 0xabcdef12, 7411 }, 7412 { 7413 "map access: unknown scalar += value_ptr, 4", 7414 .insns = { 7415 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7416 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7417 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7418 BPF_LD_MAP_FD(BPF_REG_1, 0), 7419 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7420 BPF_FUNC_map_lookup_elem), 7421 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 7422 BPF_MOV64_IMM(BPF_REG_1, 19), 7423 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7424 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 7425 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 31), 7426 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), 7427 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 7428 BPF_EXIT_INSN(), 7429 }, 7430 .fixup_map_array_48b = { 3 }, 7431 .result = REJECT, 7432 .errstr = "R1 max value is outside of the array range", 7433 .errstr_unpriv = "R1 pointer arithmetic of map value goes out of range", 7434 }, 7435 { 7436 "map access: value_ptr += unknown scalar, 1", 7437 .insns = { 7438 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7439 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7440 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7441 BPF_LD_MAP_FD(BPF_REG_1, 0), 7442 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7443 BPF_FUNC_map_lookup_elem), 7444 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 7445 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7446 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xf), 7447 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7448 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7449 BPF_MOV64_IMM(BPF_REG_0, 1), 7450 BPF_EXIT_INSN(), 7451 }, 7452 .fixup_map_array_48b = { 3 }, 7453 .result = ACCEPT, 7454 .retval = 1, 7455 }, 7456 { 7457 "map access: value_ptr += unknown scalar, 2", 7458 .insns = { 7459 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7460 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7461 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7462 BPF_LD_MAP_FD(BPF_REG_1, 0), 7463 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7464 BPF_FUNC_map_lookup_elem), 7465 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 7466 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 7467 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 31), 7468 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7469 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 0), 7470 BPF_EXIT_INSN(), 7471 }, 7472 .fixup_map_array_48b = { 3 }, 7473 .result = ACCEPT, 7474 .retval = 0xabcdef12, 7475 }, 7476 { 7477 "map access: value_ptr += unknown scalar, 3", 7478 .insns = { 7479 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7480 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7481 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7482 BPF_LD_MAP_FD(BPF_REG_1, 0), 7483 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7484 BPF_FUNC_map_lookup_elem), 7485 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11), 7486 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), 7487 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 8), 7488 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 16), 7489 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xf), 7490 BPF_ALU64_IMM(BPF_AND, BPF_REG_3, 1), 7491 BPF_ALU64_IMM(BPF_OR, BPF_REG_3, 1), 7492 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_3, 4), 7493 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_3), 7494 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 7495 BPF_MOV64_IMM(BPF_REG_0, 1), 7496 BPF_EXIT_INSN(), 7497 BPF_MOV64_IMM(BPF_REG_0, 2), 7498 BPF_JMP_IMM(BPF_JA, 0, 0, -3), 7499 }, 7500 .fixup_map_array_48b = { 3 }, 7501 .result = ACCEPT, 7502 .retval = 1, 7503 }, 7504 { 7505 "map access: value_ptr += value_ptr", 7506 .insns = { 7507 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7508 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7509 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7510 BPF_LD_MAP_FD(BPF_REG_1, 0), 7511 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7512 BPF_FUNC_map_lookup_elem), 7513 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 7514 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_0), 7515 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7516 BPF_MOV64_IMM(BPF_REG_0, 1), 7517 BPF_EXIT_INSN(), 7518 }, 7519 .fixup_map_array_48b = { 3 }, 7520 .result = REJECT, 7521 .errstr = "R0 pointer += pointer prohibited", 7522 }, 7523 { 7524 "map access: known scalar -= value_ptr", 7525 .insns = { 7526 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7527 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7528 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7529 BPF_LD_MAP_FD(BPF_REG_1, 0), 7530 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7531 BPF_FUNC_map_lookup_elem), 7532 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 7533 BPF_MOV64_IMM(BPF_REG_1, 4), 7534 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0), 7535 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 7536 BPF_MOV64_IMM(BPF_REG_0, 1), 7537 BPF_EXIT_INSN(), 7538 }, 7539 .fixup_map_array_48b = { 3 }, 7540 .result = REJECT, 7541 .errstr = "R1 tried to subtract pointer from scalar", 7542 }, 7543 { 7544 "map access: value_ptr -= known scalar", 7545 .insns = { 7546 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7547 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7548 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7549 BPF_LD_MAP_FD(BPF_REG_1, 0), 7550 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7551 BPF_FUNC_map_lookup_elem), 7552 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 7553 BPF_MOV64_IMM(BPF_REG_1, 4), 7554 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 7555 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7556 BPF_MOV64_IMM(BPF_REG_0, 1), 7557 BPF_EXIT_INSN(), 7558 }, 7559 .fixup_map_array_48b = { 3 }, 7560 .result = REJECT, 7561 .errstr = "R0 min value is outside of the array range", 7562 }, 7563 { 7564 "map access: value_ptr -= known scalar, 2", 7565 .insns = { 7566 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7567 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7568 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7569 BPF_LD_MAP_FD(BPF_REG_1, 0), 7570 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7571 BPF_FUNC_map_lookup_elem), 7572 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 7573 BPF_MOV64_IMM(BPF_REG_1, 6), 7574 BPF_MOV64_IMM(BPF_REG_2, 4), 7575 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7576 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_2), 7577 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7578 BPF_MOV64_IMM(BPF_REG_0, 1), 7579 BPF_EXIT_INSN(), 7580 }, 7581 .fixup_map_array_48b = { 3 }, 7582 .result = ACCEPT, 7583 .result_unpriv = REJECT, 7584 .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", 7585 .retval = 1, 7586 }, 7587 { 7588 "map access: unknown scalar -= value_ptr", 7589 .insns = { 7590 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7591 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7592 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7593 BPF_LD_MAP_FD(BPF_REG_1, 0), 7594 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7595 BPF_FUNC_map_lookup_elem), 7596 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 7597 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7598 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xf), 7599 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0), 7600 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 7601 BPF_MOV64_IMM(BPF_REG_0, 1), 7602 BPF_EXIT_INSN(), 7603 }, 7604 .fixup_map_array_48b = { 3 }, 7605 .result = REJECT, 7606 .errstr = "R1 tried to subtract pointer from scalar", 7607 }, 7608 { 7609 "map access: value_ptr -= unknown scalar", 7610 .insns = { 7611 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7612 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7613 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7614 BPF_LD_MAP_FD(BPF_REG_1, 0), 7615 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7616 BPF_FUNC_map_lookup_elem), 7617 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 7618 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7619 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xf), 7620 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 7621 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7622 BPF_MOV64_IMM(BPF_REG_0, 1), 7623 BPF_EXIT_INSN(), 7624 }, 7625 .fixup_map_array_48b = { 3 }, 7626 .result = REJECT, 7627 .errstr = "R0 min value is negative", 7628 }, 7629 { 7630 "map access: value_ptr -= unknown scalar, 2", 7631 .insns = { 7632 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7633 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7634 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7635 BPF_LD_MAP_FD(BPF_REG_1, 0), 7636 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7637 BPF_FUNC_map_lookup_elem), 7638 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8), 7639 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7640 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xf), 7641 BPF_ALU64_IMM(BPF_OR, BPF_REG_1, 0x7), 7642 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7643 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7644 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0x7), 7645 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 7646 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7647 BPF_MOV64_IMM(BPF_REG_0, 1), 7648 BPF_EXIT_INSN(), 7649 }, 7650 .fixup_map_array_48b = { 3 }, 7651 .result = ACCEPT, 7652 .result_unpriv = REJECT, 7653 .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", 7654 .retval = 1, 7655 }, 7656 { 7657 "map access: value_ptr -= value_ptr", 7658 .insns = { 7659 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7660 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7661 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7662 BPF_LD_MAP_FD(BPF_REG_1, 0), 7663 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7664 BPF_FUNC_map_lookup_elem), 7665 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 7666 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_0), 7667 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7668 BPF_MOV64_IMM(BPF_REG_0, 1), 7669 BPF_EXIT_INSN(), 7670 }, 7671 .fixup_map_array_48b = { 3 }, 7672 .result = REJECT, 7673 .errstr = "R0 invalid mem access 'inv'", 7674 .errstr_unpriv = "R0 pointer -= pointer prohibited", 7675 }, 7676 { 7677 "map lookup helper access to map", 7678 .insns = { 7679 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7680 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7681 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7682 BPF_LD_MAP_FD(BPF_REG_1, 0), 7683 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7684 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 7685 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7686 BPF_LD_MAP_FD(BPF_REG_1, 0), 7687 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7688 BPF_EXIT_INSN(), 7689 }, 7690 .fixup_map_hash_16b = { 3, 8 }, 7691 .result = ACCEPT, 7692 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7693 }, 7694 { 7695 "map update helper access to map", 7696 .insns = { 7697 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7698 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7699 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7700 BPF_LD_MAP_FD(BPF_REG_1, 0), 7701 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7702 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 7703 BPF_MOV64_IMM(BPF_REG_4, 0), 7704 BPF_MOV64_REG(BPF_REG_3, BPF_REG_0), 7705 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7706 BPF_LD_MAP_FD(BPF_REG_1, 0), 7707 BPF_EMIT_CALL(BPF_FUNC_map_update_elem), 7708 BPF_EXIT_INSN(), 7709 }, 7710 .fixup_map_hash_16b = { 3, 10 }, 7711 .result = ACCEPT, 7712 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7713 }, 7714 { 7715 "map update helper access to map: wrong size", 7716 .insns = { 7717 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7718 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7719 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7720 BPF_LD_MAP_FD(BPF_REG_1, 0), 7721 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7722 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 7723 BPF_MOV64_IMM(BPF_REG_4, 0), 7724 BPF_MOV64_REG(BPF_REG_3, BPF_REG_0), 7725 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7726 BPF_LD_MAP_FD(BPF_REG_1, 0), 7727 BPF_EMIT_CALL(BPF_FUNC_map_update_elem), 7728 BPF_EXIT_INSN(), 7729 }, 7730 .fixup_map_hash_8b = { 3 }, 7731 .fixup_map_hash_16b = { 10 }, 7732 .result = REJECT, 7733 .errstr = "invalid access to map value, value_size=8 off=0 size=16", 7734 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7735 }, 7736 { 7737 "map helper access to adjusted map (via const imm)", 7738 .insns = { 7739 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7740 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7741 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7742 BPF_LD_MAP_FD(BPF_REG_1, 0), 7743 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7744 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 7745 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7746 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 7747 offsetof(struct other_val, bar)), 7748 BPF_LD_MAP_FD(BPF_REG_1, 0), 7749 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7750 BPF_EXIT_INSN(), 7751 }, 7752 .fixup_map_hash_16b = { 3, 9 }, 7753 .result = ACCEPT, 7754 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7755 }, 7756 { 7757 "map helper access to adjusted map (via const imm): out-of-bound 1", 7758 .insns = { 7759 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7760 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7761 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7762 BPF_LD_MAP_FD(BPF_REG_1, 0), 7763 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7764 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 7765 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7766 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 7767 sizeof(struct other_val) - 4), 7768 BPF_LD_MAP_FD(BPF_REG_1, 0), 7769 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7770 BPF_EXIT_INSN(), 7771 }, 7772 .fixup_map_hash_16b = { 3, 9 }, 7773 .result = REJECT, 7774 .errstr = "invalid access to map value, value_size=16 off=12 size=8", 7775 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7776 }, 7777 { 7778 "map helper access to adjusted map (via const imm): out-of-bound 2", 7779 .insns = { 7780 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7781 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7782 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7783 BPF_LD_MAP_FD(BPF_REG_1, 0), 7784 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7785 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 7786 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7787 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 7788 BPF_LD_MAP_FD(BPF_REG_1, 0), 7789 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7790 BPF_EXIT_INSN(), 7791 }, 7792 .fixup_map_hash_16b = { 3, 9 }, 7793 .result = REJECT, 7794 .errstr = "invalid access to map value, value_size=16 off=-4 size=8", 7795 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7796 }, 7797 { 7798 "map helper access to adjusted map (via const reg)", 7799 .insns = { 7800 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7801 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7802 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7803 BPF_LD_MAP_FD(BPF_REG_1, 0), 7804 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7805 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 7806 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7807 BPF_MOV64_IMM(BPF_REG_3, 7808 offsetof(struct other_val, bar)), 7809 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3), 7810 BPF_LD_MAP_FD(BPF_REG_1, 0), 7811 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7812 BPF_EXIT_INSN(), 7813 }, 7814 .fixup_map_hash_16b = { 3, 10 }, 7815 .result = ACCEPT, 7816 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7817 }, 7818 { 7819 "map helper access to adjusted map (via const reg): out-of-bound 1", 7820 .insns = { 7821 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7822 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7823 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7824 BPF_LD_MAP_FD(BPF_REG_1, 0), 7825 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7826 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 7827 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7828 BPF_MOV64_IMM(BPF_REG_3, 7829 sizeof(struct other_val) - 4), 7830 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3), 7831 BPF_LD_MAP_FD(BPF_REG_1, 0), 7832 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7833 BPF_EXIT_INSN(), 7834 }, 7835 .fixup_map_hash_16b = { 3, 10 }, 7836 .result = REJECT, 7837 .errstr = "invalid access to map value, value_size=16 off=12 size=8", 7838 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7839 }, 7840 { 7841 "map helper access to adjusted map (via const reg): out-of-bound 2", 7842 .insns = { 7843 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7844 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7845 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7846 BPF_LD_MAP_FD(BPF_REG_1, 0), 7847 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7848 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 7849 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7850 BPF_MOV64_IMM(BPF_REG_3, -4), 7851 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3), 7852 BPF_LD_MAP_FD(BPF_REG_1, 0), 7853 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7854 BPF_EXIT_INSN(), 7855 }, 7856 .fixup_map_hash_16b = { 3, 10 }, 7857 .result = REJECT, 7858 .errstr = "invalid access to map value, value_size=16 off=-4 size=8", 7859 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7860 }, 7861 { 7862 "map helper access to adjusted map (via variable)", 7863 .insns = { 7864 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7865 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7866 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7867 BPF_LD_MAP_FD(BPF_REG_1, 0), 7868 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7869 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 7870 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7871 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 7872 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 7873 offsetof(struct other_val, bar), 4), 7874 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3), 7875 BPF_LD_MAP_FD(BPF_REG_1, 0), 7876 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7877 BPF_EXIT_INSN(), 7878 }, 7879 .fixup_map_hash_16b = { 3, 11 }, 7880 .result = ACCEPT, 7881 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7882 }, 7883 { 7884 "map helper access to adjusted map (via variable): no max check", 7885 .insns = { 7886 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7887 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7888 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7889 BPF_LD_MAP_FD(BPF_REG_1, 0), 7890 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7891 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 7892 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7893 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 7894 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3), 7895 BPF_LD_MAP_FD(BPF_REG_1, 0), 7896 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7897 BPF_EXIT_INSN(), 7898 }, 7899 .fixup_map_hash_16b = { 3, 10 }, 7900 .result = REJECT, 7901 .errstr = "R2 unbounded memory access, make sure to bounds check any array access into a map", 7902 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7903 }, 7904 { 7905 "map helper access to adjusted map (via variable): wrong max check", 7906 .insns = { 7907 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7908 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7909 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7910 BPF_LD_MAP_FD(BPF_REG_1, 0), 7911 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7912 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 7913 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7914 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 7915 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 7916 offsetof(struct other_val, bar) + 1, 4), 7917 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3), 7918 BPF_LD_MAP_FD(BPF_REG_1, 0), 7919 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7920 BPF_EXIT_INSN(), 7921 }, 7922 .fixup_map_hash_16b = { 3, 11 }, 7923 .result = REJECT, 7924 .errstr = "invalid access to map value, value_size=16 off=9 size=8", 7925 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7926 }, 7927 { 7928 "map element value is preserved across register spilling", 7929 .insns = { 7930 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7931 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7932 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7933 BPF_LD_MAP_FD(BPF_REG_1, 0), 7934 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7935 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 7936 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42), 7937 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 7938 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -184), 7939 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), 7940 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 0), 7941 BPF_ST_MEM(BPF_DW, BPF_REG_3, 0, 42), 7942 BPF_EXIT_INSN(), 7943 }, 7944 .fixup_map_hash_48b = { 3 }, 7945 .errstr_unpriv = "R0 leaks addr", 7946 .result = ACCEPT, 7947 .result_unpriv = REJECT, 7948 }, 7949 { 7950 "map element value or null is marked on register spilling", 7951 .insns = { 7952 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7953 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7954 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7955 BPF_LD_MAP_FD(BPF_REG_1, 0), 7956 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7957 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 7958 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -152), 7959 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), 7960 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 7961 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 0), 7962 BPF_ST_MEM(BPF_DW, BPF_REG_3, 0, 42), 7963 BPF_EXIT_INSN(), 7964 }, 7965 .fixup_map_hash_48b = { 3 }, 7966 .errstr_unpriv = "R0 leaks addr", 7967 .result = ACCEPT, 7968 .result_unpriv = REJECT, 7969 }, 7970 { 7971 "map element value store of cleared call register", 7972 .insns = { 7973 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7974 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7975 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7976 BPF_LD_MAP_FD(BPF_REG_1, 0), 7977 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7978 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 7979 BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 7980 BPF_EXIT_INSN(), 7981 }, 7982 .fixup_map_hash_48b = { 3 }, 7983 .errstr_unpriv = "R1 !read_ok", 7984 .errstr = "R1 !read_ok", 7985 .result = REJECT, 7986 .result_unpriv = REJECT, 7987 }, 7988 { 7989 "map element value with unaligned store", 7990 .insns = { 7991 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7992 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7993 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7994 BPF_LD_MAP_FD(BPF_REG_1, 0), 7995 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7996 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 17), 7997 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 3), 7998 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42), 7999 BPF_ST_MEM(BPF_DW, BPF_REG_0, 2, 43), 8000 BPF_ST_MEM(BPF_DW, BPF_REG_0, -2, 44), 8001 BPF_MOV64_REG(BPF_REG_8, BPF_REG_0), 8002 BPF_ST_MEM(BPF_DW, BPF_REG_8, 0, 32), 8003 BPF_ST_MEM(BPF_DW, BPF_REG_8, 2, 33), 8004 BPF_ST_MEM(BPF_DW, BPF_REG_8, -2, 34), 8005 BPF_ALU64_IMM(BPF_ADD, BPF_REG_8, 5), 8006 BPF_ST_MEM(BPF_DW, BPF_REG_8, 0, 22), 8007 BPF_ST_MEM(BPF_DW, BPF_REG_8, 4, 23), 8008 BPF_ST_MEM(BPF_DW, BPF_REG_8, -7, 24), 8009 BPF_MOV64_REG(BPF_REG_7, BPF_REG_8), 8010 BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, 3), 8011 BPF_ST_MEM(BPF_DW, BPF_REG_7, 0, 22), 8012 BPF_ST_MEM(BPF_DW, BPF_REG_7, 4, 23), 8013 BPF_ST_MEM(BPF_DW, BPF_REG_7, -4, 24), 8014 BPF_EXIT_INSN(), 8015 }, 8016 .fixup_map_hash_48b = { 3 }, 8017 .errstr_unpriv = "R0 leaks addr", 8018 .result = ACCEPT, 8019 .result_unpriv = REJECT, 8020 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 8021 }, 8022 { 8023 "map element value with unaligned load", 8024 .insns = { 8025 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8026 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8027 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 8028 BPF_LD_MAP_FD(BPF_REG_1, 0), 8029 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 8030 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11), 8031 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 8032 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, MAX_ENTRIES, 9), 8033 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 3), 8034 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 8035 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 2), 8036 BPF_MOV64_REG(BPF_REG_8, BPF_REG_0), 8037 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_8, 0), 8038 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_8, 2), 8039 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 5), 8040 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 8041 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 4), 8042 BPF_EXIT_INSN(), 8043 }, 8044 .fixup_map_hash_48b = { 3 }, 8045 .errstr_unpriv = "R0 leaks addr", 8046 .result = ACCEPT, 8047 .result_unpriv = REJECT, 8048 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 8049 }, 8050 { 8051 "map element value illegal alu op, 1", 8052 .insns = { 8053 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8054 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8055 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 8056 BPF_LD_MAP_FD(BPF_REG_1, 0), 8057 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 8058 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 8059 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 8), 8060 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22), 8061 BPF_EXIT_INSN(), 8062 }, 8063 .fixup_map_hash_48b = { 3 }, 8064 .errstr = "R0 bitwise operator &= on pointer", 8065 .result = REJECT, 8066 }, 8067 { 8068 "map element value illegal alu op, 2", 8069 .insns = { 8070 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8071 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8072 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 8073 BPF_LD_MAP_FD(BPF_REG_1, 0), 8074 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 8075 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 8076 BPF_ALU32_IMM(BPF_ADD, BPF_REG_0, 0), 8077 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22), 8078 BPF_EXIT_INSN(), 8079 }, 8080 .fixup_map_hash_48b = { 3 }, 8081 .errstr = "R0 32-bit pointer arithmetic prohibited", 8082 .result = REJECT, 8083 }, 8084 { 8085 "map element value illegal alu op, 3", 8086 .insns = { 8087 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8088 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8089 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 8090 BPF_LD_MAP_FD(BPF_REG_1, 0), 8091 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 8092 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 8093 BPF_ALU64_IMM(BPF_DIV, BPF_REG_0, 42), 8094 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22), 8095 BPF_EXIT_INSN(), 8096 }, 8097 .fixup_map_hash_48b = { 3 }, 8098 .errstr = "R0 pointer arithmetic with /= operator", 8099 .result = REJECT, 8100 }, 8101 { 8102 "map element value illegal alu op, 4", 8103 .insns = { 8104 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8105 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8106 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 8107 BPF_LD_MAP_FD(BPF_REG_1, 0), 8108 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 8109 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 8110 BPF_ENDIAN(BPF_FROM_BE, BPF_REG_0, 64), 8111 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22), 8112 BPF_EXIT_INSN(), 8113 }, 8114 .fixup_map_hash_48b = { 3 }, 8115 .errstr_unpriv = "R0 pointer arithmetic prohibited", 8116 .errstr = "invalid mem access 'inv'", 8117 .result = REJECT, 8118 .result_unpriv = REJECT, 8119 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 8120 }, 8121 { 8122 "map element value illegal alu op, 5", 8123 .insns = { 8124 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8125 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8126 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 8127 BPF_LD_MAP_FD(BPF_REG_1, 0), 8128 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 8129 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 8130 BPF_MOV64_IMM(BPF_REG_3, 4096), 8131 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8132 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8133 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 8134 BPF_STX_XADD(BPF_DW, BPF_REG_2, BPF_REG_3, 0), 8135 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, 0), 8136 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22), 8137 BPF_EXIT_INSN(), 8138 }, 8139 .fixup_map_hash_48b = { 3 }, 8140 .errstr = "R0 invalid mem access 'inv'", 8141 .result = REJECT, 8142 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 8143 }, 8144 { 8145 "map element value is preserved across register spilling", 8146 .insns = { 8147 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8148 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8149 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 8150 BPF_LD_MAP_FD(BPF_REG_1, 0), 8151 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 8152 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 8153 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8154 offsetof(struct test_val, foo)), 8155 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42), 8156 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8157 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -184), 8158 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), 8159 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 0), 8160 BPF_ST_MEM(BPF_DW, BPF_REG_3, 0, 42), 8161 BPF_EXIT_INSN(), 8162 }, 8163 .fixup_map_hash_48b = { 3 }, 8164 .errstr_unpriv = "R0 leaks addr", 8165 .result = ACCEPT, 8166 .result_unpriv = REJECT, 8167 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 8168 }, 8169 { 8170 "helper access to variable memory: stack, bitwise AND + JMP, correct bounds", 8171 .insns = { 8172 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8173 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 8174 BPF_MOV64_IMM(BPF_REG_0, 0), 8175 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64), 8176 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56), 8177 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48), 8178 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40), 8179 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32), 8180 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24), 8181 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16), 8182 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 8183 BPF_MOV64_IMM(BPF_REG_2, 16), 8184 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 8185 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 8186 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 64), 8187 BPF_MOV64_IMM(BPF_REG_4, 0), 8188 BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2), 8189 BPF_MOV64_IMM(BPF_REG_3, 0), 8190 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8191 BPF_MOV64_IMM(BPF_REG_0, 0), 8192 BPF_EXIT_INSN(), 8193 }, 8194 .result = ACCEPT, 8195 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8196 }, 8197 { 8198 "helper access to variable memory: stack, bitwise AND, zero included", 8199 .insns = { 8200 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8201 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 8202 BPF_MOV64_IMM(BPF_REG_2, 16), 8203 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 8204 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 8205 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 64), 8206 BPF_MOV64_IMM(BPF_REG_3, 0), 8207 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8208 BPF_EXIT_INSN(), 8209 }, 8210 .errstr = "invalid indirect read from stack off -64+0 size 64", 8211 .result = REJECT, 8212 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8213 }, 8214 { 8215 "helper access to variable memory: stack, bitwise AND + JMP, wrong max", 8216 .insns = { 8217 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8218 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 8219 BPF_MOV64_IMM(BPF_REG_2, 16), 8220 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 8221 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 8222 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 65), 8223 BPF_MOV64_IMM(BPF_REG_4, 0), 8224 BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2), 8225 BPF_MOV64_IMM(BPF_REG_3, 0), 8226 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8227 BPF_MOV64_IMM(BPF_REG_0, 0), 8228 BPF_EXIT_INSN(), 8229 }, 8230 .errstr = "invalid stack type R1 off=-64 access_size=65", 8231 .result = REJECT, 8232 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8233 }, 8234 { 8235 "helper access to variable memory: stack, JMP, correct bounds", 8236 .insns = { 8237 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8238 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 8239 BPF_MOV64_IMM(BPF_REG_0, 0), 8240 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64), 8241 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56), 8242 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48), 8243 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40), 8244 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32), 8245 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24), 8246 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16), 8247 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 8248 BPF_MOV64_IMM(BPF_REG_2, 16), 8249 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 8250 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 8251 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 64, 4), 8252 BPF_MOV64_IMM(BPF_REG_4, 0), 8253 BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2), 8254 BPF_MOV64_IMM(BPF_REG_3, 0), 8255 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8256 BPF_MOV64_IMM(BPF_REG_0, 0), 8257 BPF_EXIT_INSN(), 8258 }, 8259 .result = ACCEPT, 8260 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8261 }, 8262 { 8263 "helper access to variable memory: stack, JMP (signed), correct bounds", 8264 .insns = { 8265 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8266 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 8267 BPF_MOV64_IMM(BPF_REG_0, 0), 8268 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64), 8269 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56), 8270 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48), 8271 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40), 8272 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32), 8273 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24), 8274 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16), 8275 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 8276 BPF_MOV64_IMM(BPF_REG_2, 16), 8277 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 8278 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 8279 BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 64, 4), 8280 BPF_MOV64_IMM(BPF_REG_4, 0), 8281 BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2), 8282 BPF_MOV64_IMM(BPF_REG_3, 0), 8283 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8284 BPF_MOV64_IMM(BPF_REG_0, 0), 8285 BPF_EXIT_INSN(), 8286 }, 8287 .result = ACCEPT, 8288 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8289 }, 8290 { 8291 "helper access to variable memory: stack, JMP, bounds + offset", 8292 .insns = { 8293 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8294 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 8295 BPF_MOV64_IMM(BPF_REG_2, 16), 8296 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 8297 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 8298 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 64, 5), 8299 BPF_MOV64_IMM(BPF_REG_4, 0), 8300 BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 3), 8301 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), 8302 BPF_MOV64_IMM(BPF_REG_3, 0), 8303 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8304 BPF_MOV64_IMM(BPF_REG_0, 0), 8305 BPF_EXIT_INSN(), 8306 }, 8307 .errstr = "invalid stack type R1 off=-64 access_size=65", 8308 .result = REJECT, 8309 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8310 }, 8311 { 8312 "helper access to variable memory: stack, JMP, wrong max", 8313 .insns = { 8314 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8315 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 8316 BPF_MOV64_IMM(BPF_REG_2, 16), 8317 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 8318 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 8319 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 65, 4), 8320 BPF_MOV64_IMM(BPF_REG_4, 0), 8321 BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2), 8322 BPF_MOV64_IMM(BPF_REG_3, 0), 8323 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8324 BPF_MOV64_IMM(BPF_REG_0, 0), 8325 BPF_EXIT_INSN(), 8326 }, 8327 .errstr = "invalid stack type R1 off=-64 access_size=65", 8328 .result = REJECT, 8329 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8330 }, 8331 { 8332 "helper access to variable memory: stack, JMP, no max check", 8333 .insns = { 8334 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8335 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 8336 BPF_MOV64_IMM(BPF_REG_2, 16), 8337 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 8338 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 8339 BPF_MOV64_IMM(BPF_REG_4, 0), 8340 BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2), 8341 BPF_MOV64_IMM(BPF_REG_3, 0), 8342 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8343 BPF_MOV64_IMM(BPF_REG_0, 0), 8344 BPF_EXIT_INSN(), 8345 }, 8346 /* because max wasn't checked, signed min is negative */ 8347 .errstr = "R2 min value is negative, either use unsigned or 'var &= const'", 8348 .result = REJECT, 8349 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8350 }, 8351 { 8352 "helper access to variable memory: stack, JMP, no min check", 8353 .insns = { 8354 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8355 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 8356 BPF_MOV64_IMM(BPF_REG_2, 16), 8357 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 8358 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 8359 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 64, 3), 8360 BPF_MOV64_IMM(BPF_REG_3, 0), 8361 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8362 BPF_MOV64_IMM(BPF_REG_0, 0), 8363 BPF_EXIT_INSN(), 8364 }, 8365 .errstr = "invalid indirect read from stack off -64+0 size 64", 8366 .result = REJECT, 8367 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8368 }, 8369 { 8370 "helper access to variable memory: stack, JMP (signed), no min check", 8371 .insns = { 8372 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8373 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 8374 BPF_MOV64_IMM(BPF_REG_2, 16), 8375 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 8376 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 8377 BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 64, 3), 8378 BPF_MOV64_IMM(BPF_REG_3, 0), 8379 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8380 BPF_MOV64_IMM(BPF_REG_0, 0), 8381 BPF_EXIT_INSN(), 8382 }, 8383 .errstr = "R2 min value is negative", 8384 .result = REJECT, 8385 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8386 }, 8387 { 8388 "helper access to variable memory: map, JMP, correct bounds", 8389 .insns = { 8390 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8391 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8392 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 8393 BPF_LD_MAP_FD(BPF_REG_1, 0), 8394 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 8395 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10), 8396 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 8397 BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)), 8398 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128), 8399 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128), 8400 BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 8401 sizeof(struct test_val), 4), 8402 BPF_MOV64_IMM(BPF_REG_4, 0), 8403 BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2), 8404 BPF_MOV64_IMM(BPF_REG_3, 0), 8405 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8406 BPF_MOV64_IMM(BPF_REG_0, 0), 8407 BPF_EXIT_INSN(), 8408 }, 8409 .fixup_map_hash_48b = { 3 }, 8410 .result = ACCEPT, 8411 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8412 }, 8413 { 8414 "helper access to variable memory: map, JMP, wrong max", 8415 .insns = { 8416 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8417 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8418 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 8419 BPF_LD_MAP_FD(BPF_REG_1, 0), 8420 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 8421 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10), 8422 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 8423 BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)), 8424 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128), 8425 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128), 8426 BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 8427 sizeof(struct test_val) + 1, 4), 8428 BPF_MOV64_IMM(BPF_REG_4, 0), 8429 BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2), 8430 BPF_MOV64_IMM(BPF_REG_3, 0), 8431 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8432 BPF_MOV64_IMM(BPF_REG_0, 0), 8433 BPF_EXIT_INSN(), 8434 }, 8435 .fixup_map_hash_48b = { 3 }, 8436 .errstr = "invalid access to map value, value_size=48 off=0 size=49", 8437 .result = REJECT, 8438 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8439 }, 8440 { 8441 "helper access to variable memory: map adjusted, JMP, correct bounds", 8442 .insns = { 8443 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8444 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8445 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 8446 BPF_LD_MAP_FD(BPF_REG_1, 0), 8447 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 8448 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11), 8449 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 8450 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 20), 8451 BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)), 8452 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128), 8453 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128), 8454 BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 8455 sizeof(struct test_val) - 20, 4), 8456 BPF_MOV64_IMM(BPF_REG_4, 0), 8457 BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2), 8458 BPF_MOV64_IMM(BPF_REG_3, 0), 8459 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8460 BPF_MOV64_IMM(BPF_REG_0, 0), 8461 BPF_EXIT_INSN(), 8462 }, 8463 .fixup_map_hash_48b = { 3 }, 8464 .result = ACCEPT, 8465 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8466 }, 8467 { 8468 "helper access to variable memory: map adjusted, JMP, wrong max", 8469 .insns = { 8470 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8471 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8472 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 8473 BPF_LD_MAP_FD(BPF_REG_1, 0), 8474 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 8475 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11), 8476 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 8477 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 20), 8478 BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)), 8479 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128), 8480 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128), 8481 BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 8482 sizeof(struct test_val) - 19, 4), 8483 BPF_MOV64_IMM(BPF_REG_4, 0), 8484 BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2), 8485 BPF_MOV64_IMM(BPF_REG_3, 0), 8486 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8487 BPF_MOV64_IMM(BPF_REG_0, 0), 8488 BPF_EXIT_INSN(), 8489 }, 8490 .fixup_map_hash_48b = { 3 }, 8491 .errstr = "R1 min value is outside of the array range", 8492 .result = REJECT, 8493 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8494 }, 8495 { 8496 "helper access to variable memory: size = 0 allowed on NULL (ARG_PTR_TO_MEM_OR_NULL)", 8497 .insns = { 8498 BPF_MOV64_IMM(BPF_REG_1, 0), 8499 BPF_MOV64_IMM(BPF_REG_2, 0), 8500 BPF_MOV64_IMM(BPF_REG_3, 0), 8501 BPF_MOV64_IMM(BPF_REG_4, 0), 8502 BPF_MOV64_IMM(BPF_REG_5, 0), 8503 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 8504 BPF_EXIT_INSN(), 8505 }, 8506 .result = ACCEPT, 8507 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 8508 }, 8509 { 8510 "helper access to variable memory: size > 0 not allowed on NULL (ARG_PTR_TO_MEM_OR_NULL)", 8511 .insns = { 8512 BPF_MOV64_IMM(BPF_REG_1, 0), 8513 BPF_MOV64_IMM(BPF_REG_2, 1), 8514 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128), 8515 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128), 8516 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 64), 8517 BPF_MOV64_IMM(BPF_REG_3, 0), 8518 BPF_MOV64_IMM(BPF_REG_4, 0), 8519 BPF_MOV64_IMM(BPF_REG_5, 0), 8520 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 8521 BPF_EXIT_INSN(), 8522 }, 8523 .errstr = "R1 type=inv expected=fp", 8524 .result = REJECT, 8525 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 8526 }, 8527 { 8528 "helper access to variable memory: size = 0 allowed on != NULL stack pointer (ARG_PTR_TO_MEM_OR_NULL)", 8529 .insns = { 8530 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8531 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 8532 BPF_MOV64_IMM(BPF_REG_2, 0), 8533 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, 0), 8534 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 8), 8535 BPF_MOV64_IMM(BPF_REG_3, 0), 8536 BPF_MOV64_IMM(BPF_REG_4, 0), 8537 BPF_MOV64_IMM(BPF_REG_5, 0), 8538 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 8539 BPF_EXIT_INSN(), 8540 }, 8541 .result = ACCEPT, 8542 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 8543 }, 8544 { 8545 "helper access to variable memory: size = 0 allowed on != NULL map pointer (ARG_PTR_TO_MEM_OR_NULL)", 8546 .insns = { 8547 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8548 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8549 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8550 BPF_LD_MAP_FD(BPF_REG_1, 0), 8551 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8552 BPF_FUNC_map_lookup_elem), 8553 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 8554 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 8555 BPF_MOV64_IMM(BPF_REG_2, 0), 8556 BPF_MOV64_IMM(BPF_REG_3, 0), 8557 BPF_MOV64_IMM(BPF_REG_4, 0), 8558 BPF_MOV64_IMM(BPF_REG_5, 0), 8559 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 8560 BPF_EXIT_INSN(), 8561 }, 8562 .fixup_map_hash_8b = { 3 }, 8563 .result = ACCEPT, 8564 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 8565 }, 8566 { 8567 "helper access to variable memory: size possible = 0 allowed on != NULL stack pointer (ARG_PTR_TO_MEM_OR_NULL)", 8568 .insns = { 8569 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8570 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8571 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8572 BPF_LD_MAP_FD(BPF_REG_1, 0), 8573 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8574 BPF_FUNC_map_lookup_elem), 8575 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 8576 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 8577 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 7), 8578 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8579 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 8580 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, 0), 8581 BPF_MOV64_IMM(BPF_REG_3, 0), 8582 BPF_MOV64_IMM(BPF_REG_4, 0), 8583 BPF_MOV64_IMM(BPF_REG_5, 0), 8584 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 8585 BPF_EXIT_INSN(), 8586 }, 8587 .fixup_map_hash_8b = { 3 }, 8588 .result = ACCEPT, 8589 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 8590 }, 8591 { 8592 "helper access to variable memory: size possible = 0 allowed on != NULL map pointer (ARG_PTR_TO_MEM_OR_NULL)", 8593 .insns = { 8594 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8595 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8596 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8597 BPF_LD_MAP_FD(BPF_REG_1, 0), 8598 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8599 BPF_FUNC_map_lookup_elem), 8600 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 8601 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 8602 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 8603 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 4), 8604 BPF_MOV64_IMM(BPF_REG_3, 0), 8605 BPF_MOV64_IMM(BPF_REG_4, 0), 8606 BPF_MOV64_IMM(BPF_REG_5, 0), 8607 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 8608 BPF_EXIT_INSN(), 8609 }, 8610 .fixup_map_hash_8b = { 3 }, 8611 .result = ACCEPT, 8612 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 8613 }, 8614 { 8615 "helper access to variable memory: size possible = 0 allowed on != NULL packet pointer (ARG_PTR_TO_MEM_OR_NULL)", 8616 .insns = { 8617 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 8618 offsetof(struct __sk_buff, data)), 8619 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8620 offsetof(struct __sk_buff, data_end)), 8621 BPF_MOV64_REG(BPF_REG_0, BPF_REG_6), 8622 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 8623 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 7), 8624 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 8625 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6, 0), 8626 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 4), 8627 BPF_MOV64_IMM(BPF_REG_3, 0), 8628 BPF_MOV64_IMM(BPF_REG_4, 0), 8629 BPF_MOV64_IMM(BPF_REG_5, 0), 8630 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 8631 BPF_EXIT_INSN(), 8632 }, 8633 .result = ACCEPT, 8634 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 8635 .retval = 0 /* csum_diff of 64-byte packet */, 8636 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 8637 }, 8638 { 8639 "helper access to variable memory: size = 0 not allowed on NULL (!ARG_PTR_TO_MEM_OR_NULL)", 8640 .insns = { 8641 BPF_MOV64_IMM(BPF_REG_1, 0), 8642 BPF_MOV64_IMM(BPF_REG_2, 0), 8643 BPF_MOV64_IMM(BPF_REG_3, 0), 8644 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8645 BPF_EXIT_INSN(), 8646 }, 8647 .errstr = "R1 type=inv expected=fp", 8648 .result = REJECT, 8649 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8650 }, 8651 { 8652 "helper access to variable memory: size > 0 not allowed on NULL (!ARG_PTR_TO_MEM_OR_NULL)", 8653 .insns = { 8654 BPF_MOV64_IMM(BPF_REG_1, 0), 8655 BPF_MOV64_IMM(BPF_REG_2, 1), 8656 BPF_MOV64_IMM(BPF_REG_3, 0), 8657 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8658 BPF_EXIT_INSN(), 8659 }, 8660 .errstr = "R1 type=inv expected=fp", 8661 .result = REJECT, 8662 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8663 }, 8664 { 8665 "helper access to variable memory: size = 0 allowed on != NULL stack pointer (!ARG_PTR_TO_MEM_OR_NULL)", 8666 .insns = { 8667 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8668 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 8669 BPF_MOV64_IMM(BPF_REG_2, 0), 8670 BPF_MOV64_IMM(BPF_REG_3, 0), 8671 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8672 BPF_EXIT_INSN(), 8673 }, 8674 .result = ACCEPT, 8675 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8676 }, 8677 { 8678 "helper access to variable memory: size = 0 allowed on != NULL map pointer (!ARG_PTR_TO_MEM_OR_NULL)", 8679 .insns = { 8680 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8681 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8682 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8683 BPF_LD_MAP_FD(BPF_REG_1, 0), 8684 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 8685 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 8686 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 8687 BPF_MOV64_IMM(BPF_REG_2, 0), 8688 BPF_MOV64_IMM(BPF_REG_3, 0), 8689 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8690 BPF_EXIT_INSN(), 8691 }, 8692 .fixup_map_hash_8b = { 3 }, 8693 .result = ACCEPT, 8694 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8695 }, 8696 { 8697 "helper access to variable memory: size possible = 0 allowed on != NULL stack pointer (!ARG_PTR_TO_MEM_OR_NULL)", 8698 .insns = { 8699 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8700 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8701 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8702 BPF_LD_MAP_FD(BPF_REG_1, 0), 8703 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 8704 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 8705 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 8706 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 4), 8707 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8708 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 8709 BPF_MOV64_IMM(BPF_REG_3, 0), 8710 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8711 BPF_EXIT_INSN(), 8712 }, 8713 .fixup_map_hash_8b = { 3 }, 8714 .result = ACCEPT, 8715 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8716 }, 8717 { 8718 "helper access to variable memory: size possible = 0 allowed on != NULL map pointer (!ARG_PTR_TO_MEM_OR_NULL)", 8719 .insns = { 8720 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8721 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8722 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8723 BPF_LD_MAP_FD(BPF_REG_1, 0), 8724 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 8725 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 8726 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 8727 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 8728 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 2), 8729 BPF_MOV64_IMM(BPF_REG_3, 0), 8730 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8731 BPF_EXIT_INSN(), 8732 }, 8733 .fixup_map_hash_8b = { 3 }, 8734 .result = ACCEPT, 8735 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8736 }, 8737 { 8738 "helper access to variable memory: 8 bytes leak", 8739 .insns = { 8740 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8741 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 8742 BPF_MOV64_IMM(BPF_REG_0, 0), 8743 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64), 8744 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56), 8745 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48), 8746 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40), 8747 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24), 8748 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16), 8749 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 8750 BPF_MOV64_IMM(BPF_REG_2, 1), 8751 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128), 8752 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128), 8753 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 63), 8754 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), 8755 BPF_MOV64_IMM(BPF_REG_3, 0), 8756 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8757 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 8758 BPF_EXIT_INSN(), 8759 }, 8760 .errstr = "invalid indirect read from stack off -64+32 size 64", 8761 .result = REJECT, 8762 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8763 }, 8764 { 8765 "helper access to variable memory: 8 bytes no leak (init memory)", 8766 .insns = { 8767 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8768 BPF_MOV64_IMM(BPF_REG_0, 0), 8769 BPF_MOV64_IMM(BPF_REG_0, 0), 8770 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64), 8771 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56), 8772 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48), 8773 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40), 8774 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32), 8775 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24), 8776 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16), 8777 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 8778 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 8779 BPF_MOV64_IMM(BPF_REG_2, 0), 8780 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 32), 8781 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 32), 8782 BPF_MOV64_IMM(BPF_REG_3, 0), 8783 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8784 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 8785 BPF_EXIT_INSN(), 8786 }, 8787 .result = ACCEPT, 8788 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8789 }, 8790 { 8791 "invalid and of negative number", 8792 .insns = { 8793 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8794 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8795 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8796 BPF_LD_MAP_FD(BPF_REG_1, 0), 8797 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8798 BPF_FUNC_map_lookup_elem), 8799 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 8800 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 8801 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, -4), 8802 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2), 8803 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 8804 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 8805 offsetof(struct test_val, foo)), 8806 BPF_EXIT_INSN(), 8807 }, 8808 .fixup_map_hash_48b = { 3 }, 8809 .errstr = "R0 max value is outside of the array range", 8810 .result = REJECT, 8811 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 8812 }, 8813 { 8814 "invalid range check", 8815 .insns = { 8816 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8817 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8818 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8819 BPF_LD_MAP_FD(BPF_REG_1, 0), 8820 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8821 BPF_FUNC_map_lookup_elem), 8822 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 12), 8823 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 8824 BPF_MOV64_IMM(BPF_REG_9, 1), 8825 BPF_ALU32_IMM(BPF_MOD, BPF_REG_1, 2), 8826 BPF_ALU32_IMM(BPF_ADD, BPF_REG_1, 1), 8827 BPF_ALU32_REG(BPF_AND, BPF_REG_9, BPF_REG_1), 8828 BPF_ALU32_IMM(BPF_ADD, BPF_REG_9, 1), 8829 BPF_ALU32_IMM(BPF_RSH, BPF_REG_9, 1), 8830 BPF_MOV32_IMM(BPF_REG_3, 1), 8831 BPF_ALU32_REG(BPF_SUB, BPF_REG_3, BPF_REG_9), 8832 BPF_ALU32_IMM(BPF_MUL, BPF_REG_3, 0x10000000), 8833 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_3), 8834 BPF_STX_MEM(BPF_W, BPF_REG_0, BPF_REG_3, 0), 8835 BPF_MOV64_REG(BPF_REG_0, 0), 8836 BPF_EXIT_INSN(), 8837 }, 8838 .fixup_map_hash_48b = { 3 }, 8839 .errstr = "R0 max value is outside of the array range", 8840 .result = REJECT, 8841 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 8842 }, 8843 { 8844 "map in map access", 8845 .insns = { 8846 BPF_ST_MEM(0, BPF_REG_10, -4, 0), 8847 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8848 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 8849 BPF_LD_MAP_FD(BPF_REG_1, 0), 8850 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8851 BPF_FUNC_map_lookup_elem), 8852 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 8853 BPF_ST_MEM(0, BPF_REG_10, -4, 0), 8854 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8855 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 8856 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 8857 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8858 BPF_FUNC_map_lookup_elem), 8859 BPF_MOV64_IMM(BPF_REG_0, 0), 8860 BPF_EXIT_INSN(), 8861 }, 8862 .fixup_map_in_map = { 3 }, 8863 .result = ACCEPT, 8864 }, 8865 { 8866 "invalid inner map pointer", 8867 .insns = { 8868 BPF_ST_MEM(0, BPF_REG_10, -4, 0), 8869 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8870 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 8871 BPF_LD_MAP_FD(BPF_REG_1, 0), 8872 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8873 BPF_FUNC_map_lookup_elem), 8874 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 8875 BPF_ST_MEM(0, BPF_REG_10, -4, 0), 8876 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8877 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 8878 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 8879 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8880 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8881 BPF_FUNC_map_lookup_elem), 8882 BPF_MOV64_IMM(BPF_REG_0, 0), 8883 BPF_EXIT_INSN(), 8884 }, 8885 .fixup_map_in_map = { 3 }, 8886 .errstr = "R1 pointer arithmetic on map_ptr prohibited", 8887 .result = REJECT, 8888 }, 8889 { 8890 "forgot null checking on the inner map pointer", 8891 .insns = { 8892 BPF_ST_MEM(0, BPF_REG_10, -4, 0), 8893 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8894 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 8895 BPF_LD_MAP_FD(BPF_REG_1, 0), 8896 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8897 BPF_FUNC_map_lookup_elem), 8898 BPF_ST_MEM(0, BPF_REG_10, -4, 0), 8899 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8900 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 8901 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 8902 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8903 BPF_FUNC_map_lookup_elem), 8904 BPF_MOV64_IMM(BPF_REG_0, 0), 8905 BPF_EXIT_INSN(), 8906 }, 8907 .fixup_map_in_map = { 3 }, 8908 .errstr = "R1 type=map_value_or_null expected=map_ptr", 8909 .result = REJECT, 8910 }, 8911 { 8912 "ld_abs: check calling conv, r1", 8913 .insns = { 8914 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8915 BPF_MOV64_IMM(BPF_REG_1, 0), 8916 BPF_LD_ABS(BPF_W, -0x200000), 8917 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 8918 BPF_EXIT_INSN(), 8919 }, 8920 .errstr = "R1 !read_ok", 8921 .result = REJECT, 8922 }, 8923 { 8924 "ld_abs: check calling conv, r2", 8925 .insns = { 8926 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8927 BPF_MOV64_IMM(BPF_REG_2, 0), 8928 BPF_LD_ABS(BPF_W, -0x200000), 8929 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 8930 BPF_EXIT_INSN(), 8931 }, 8932 .errstr = "R2 !read_ok", 8933 .result = REJECT, 8934 }, 8935 { 8936 "ld_abs: check calling conv, r3", 8937 .insns = { 8938 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8939 BPF_MOV64_IMM(BPF_REG_3, 0), 8940 BPF_LD_ABS(BPF_W, -0x200000), 8941 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3), 8942 BPF_EXIT_INSN(), 8943 }, 8944 .errstr = "R3 !read_ok", 8945 .result = REJECT, 8946 }, 8947 { 8948 "ld_abs: check calling conv, r4", 8949 .insns = { 8950 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8951 BPF_MOV64_IMM(BPF_REG_4, 0), 8952 BPF_LD_ABS(BPF_W, -0x200000), 8953 BPF_MOV64_REG(BPF_REG_0, BPF_REG_4), 8954 BPF_EXIT_INSN(), 8955 }, 8956 .errstr = "R4 !read_ok", 8957 .result = REJECT, 8958 }, 8959 { 8960 "ld_abs: check calling conv, r5", 8961 .insns = { 8962 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8963 BPF_MOV64_IMM(BPF_REG_5, 0), 8964 BPF_LD_ABS(BPF_W, -0x200000), 8965 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 8966 BPF_EXIT_INSN(), 8967 }, 8968 .errstr = "R5 !read_ok", 8969 .result = REJECT, 8970 }, 8971 { 8972 "ld_abs: check calling conv, r7", 8973 .insns = { 8974 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8975 BPF_MOV64_IMM(BPF_REG_7, 0), 8976 BPF_LD_ABS(BPF_W, -0x200000), 8977 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 8978 BPF_EXIT_INSN(), 8979 }, 8980 .result = ACCEPT, 8981 }, 8982 { 8983 "ld_abs: tests on r6 and skb data reload helper", 8984 .insns = { 8985 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8986 BPF_LD_ABS(BPF_B, 0), 8987 BPF_LD_ABS(BPF_H, 0), 8988 BPF_LD_ABS(BPF_W, 0), 8989 BPF_MOV64_REG(BPF_REG_7, BPF_REG_6), 8990 BPF_MOV64_IMM(BPF_REG_6, 0), 8991 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 8992 BPF_MOV64_IMM(BPF_REG_2, 1), 8993 BPF_MOV64_IMM(BPF_REG_3, 2), 8994 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8995 BPF_FUNC_skb_vlan_push), 8996 BPF_MOV64_REG(BPF_REG_6, BPF_REG_7), 8997 BPF_LD_ABS(BPF_B, 0), 8998 BPF_LD_ABS(BPF_H, 0), 8999 BPF_LD_ABS(BPF_W, 0), 9000 BPF_MOV64_IMM(BPF_REG_0, 42), 9001 BPF_EXIT_INSN(), 9002 }, 9003 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 9004 .result = ACCEPT, 9005 .retval = 42 /* ultimate return value */, 9006 }, 9007 { 9008 "ld_ind: check calling conv, r1", 9009 .insns = { 9010 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 9011 BPF_MOV64_IMM(BPF_REG_1, 1), 9012 BPF_LD_IND(BPF_W, BPF_REG_1, -0x200000), 9013 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 9014 BPF_EXIT_INSN(), 9015 }, 9016 .errstr = "R1 !read_ok", 9017 .result = REJECT, 9018 }, 9019 { 9020 "ld_ind: check calling conv, r2", 9021 .insns = { 9022 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 9023 BPF_MOV64_IMM(BPF_REG_2, 1), 9024 BPF_LD_IND(BPF_W, BPF_REG_2, -0x200000), 9025 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 9026 BPF_EXIT_INSN(), 9027 }, 9028 .errstr = "R2 !read_ok", 9029 .result = REJECT, 9030 }, 9031 { 9032 "ld_ind: check calling conv, r3", 9033 .insns = { 9034 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 9035 BPF_MOV64_IMM(BPF_REG_3, 1), 9036 BPF_LD_IND(BPF_W, BPF_REG_3, -0x200000), 9037 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3), 9038 BPF_EXIT_INSN(), 9039 }, 9040 .errstr = "R3 !read_ok", 9041 .result = REJECT, 9042 }, 9043 { 9044 "ld_ind: check calling conv, r4", 9045 .insns = { 9046 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 9047 BPF_MOV64_IMM(BPF_REG_4, 1), 9048 BPF_LD_IND(BPF_W, BPF_REG_4, -0x200000), 9049 BPF_MOV64_REG(BPF_REG_0, BPF_REG_4), 9050 BPF_EXIT_INSN(), 9051 }, 9052 .errstr = "R4 !read_ok", 9053 .result = REJECT, 9054 }, 9055 { 9056 "ld_ind: check calling conv, r5", 9057 .insns = { 9058 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 9059 BPF_MOV64_IMM(BPF_REG_5, 1), 9060 BPF_LD_IND(BPF_W, BPF_REG_5, -0x200000), 9061 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 9062 BPF_EXIT_INSN(), 9063 }, 9064 .errstr = "R5 !read_ok", 9065 .result = REJECT, 9066 }, 9067 { 9068 "ld_ind: check calling conv, r7", 9069 .insns = { 9070 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 9071 BPF_MOV64_IMM(BPF_REG_7, 1), 9072 BPF_LD_IND(BPF_W, BPF_REG_7, -0x200000), 9073 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 9074 BPF_EXIT_INSN(), 9075 }, 9076 .result = ACCEPT, 9077 .retval = 1, 9078 }, 9079 { 9080 "check bpf_perf_event_data->sample_period byte load permitted", 9081 .insns = { 9082 BPF_MOV64_IMM(BPF_REG_0, 0), 9083 #if __BYTE_ORDER == __LITTLE_ENDIAN 9084 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 9085 offsetof(struct bpf_perf_event_data, sample_period)), 9086 #else 9087 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 9088 offsetof(struct bpf_perf_event_data, sample_period) + 7), 9089 #endif 9090 BPF_EXIT_INSN(), 9091 }, 9092 .result = ACCEPT, 9093 .prog_type = BPF_PROG_TYPE_PERF_EVENT, 9094 }, 9095 { 9096 "check bpf_perf_event_data->sample_period half load permitted", 9097 .insns = { 9098 BPF_MOV64_IMM(BPF_REG_0, 0), 9099 #if __BYTE_ORDER == __LITTLE_ENDIAN 9100 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 9101 offsetof(struct bpf_perf_event_data, sample_period)), 9102 #else 9103 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 9104 offsetof(struct bpf_perf_event_data, sample_period) + 6), 9105 #endif 9106 BPF_EXIT_INSN(), 9107 }, 9108 .result = ACCEPT, 9109 .prog_type = BPF_PROG_TYPE_PERF_EVENT, 9110 }, 9111 { 9112 "check bpf_perf_event_data->sample_period word load permitted", 9113 .insns = { 9114 BPF_MOV64_IMM(BPF_REG_0, 0), 9115 #if __BYTE_ORDER == __LITTLE_ENDIAN 9116 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 9117 offsetof(struct bpf_perf_event_data, sample_period)), 9118 #else 9119 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 9120 offsetof(struct bpf_perf_event_data, sample_period) + 4), 9121 #endif 9122 BPF_EXIT_INSN(), 9123 }, 9124 .result = ACCEPT, 9125 .prog_type = BPF_PROG_TYPE_PERF_EVENT, 9126 }, 9127 { 9128 "check bpf_perf_event_data->sample_period dword load permitted", 9129 .insns = { 9130 BPF_MOV64_IMM(BPF_REG_0, 0), 9131 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 9132 offsetof(struct bpf_perf_event_data, sample_period)), 9133 BPF_EXIT_INSN(), 9134 }, 9135 .result = ACCEPT, 9136 .prog_type = BPF_PROG_TYPE_PERF_EVENT, 9137 }, 9138 { 9139 "check skb->data half load not permitted", 9140 .insns = { 9141 BPF_MOV64_IMM(BPF_REG_0, 0), 9142 #if __BYTE_ORDER == __LITTLE_ENDIAN 9143 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 9144 offsetof(struct __sk_buff, data)), 9145 #else 9146 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 9147 offsetof(struct __sk_buff, data) + 2), 9148 #endif 9149 BPF_EXIT_INSN(), 9150 }, 9151 .result = REJECT, 9152 .errstr = "invalid bpf_context access", 9153 }, 9154 { 9155 "check skb->tc_classid half load not permitted for lwt prog", 9156 .insns = { 9157 BPF_MOV64_IMM(BPF_REG_0, 0), 9158 #if __BYTE_ORDER == __LITTLE_ENDIAN 9159 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 9160 offsetof(struct __sk_buff, tc_classid)), 9161 #else 9162 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 9163 offsetof(struct __sk_buff, tc_classid) + 2), 9164 #endif 9165 BPF_EXIT_INSN(), 9166 }, 9167 .result = REJECT, 9168 .errstr = "invalid bpf_context access", 9169 .prog_type = BPF_PROG_TYPE_LWT_IN, 9170 }, 9171 { 9172 "bounds checks mixing signed and unsigned, positive bounds", 9173 .insns = { 9174 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9175 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9176 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9177 BPF_LD_MAP_FD(BPF_REG_1, 0), 9178 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9179 BPF_FUNC_map_lookup_elem), 9180 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 9181 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9182 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9183 BPF_MOV64_IMM(BPF_REG_2, 2), 9184 BPF_JMP_REG(BPF_JGE, BPF_REG_2, BPF_REG_1, 3), 9185 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 4, 2), 9186 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9187 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 9188 BPF_MOV64_IMM(BPF_REG_0, 0), 9189 BPF_EXIT_INSN(), 9190 }, 9191 .fixup_map_hash_8b = { 3 }, 9192 .errstr = "unbounded min value", 9193 .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", 9194 .result = REJECT, 9195 }, 9196 { 9197 "bounds checks mixing signed and unsigned", 9198 .insns = { 9199 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9200 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9201 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9202 BPF_LD_MAP_FD(BPF_REG_1, 0), 9203 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9204 BPF_FUNC_map_lookup_elem), 9205 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 9206 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9207 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9208 BPF_MOV64_IMM(BPF_REG_2, -1), 9209 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, 3), 9210 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 9211 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9212 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 9213 BPF_MOV64_IMM(BPF_REG_0, 0), 9214 BPF_EXIT_INSN(), 9215 }, 9216 .fixup_map_hash_8b = { 3 }, 9217 .errstr = "unbounded min value", 9218 .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", 9219 .result = REJECT, 9220 }, 9221 { 9222 "bounds checks mixing signed and unsigned, variant 2", 9223 .insns = { 9224 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9225 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9226 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9227 BPF_LD_MAP_FD(BPF_REG_1, 0), 9228 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9229 BPF_FUNC_map_lookup_elem), 9230 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 9231 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9232 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9233 BPF_MOV64_IMM(BPF_REG_2, -1), 9234 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, 5), 9235 BPF_MOV64_IMM(BPF_REG_8, 0), 9236 BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_1), 9237 BPF_JMP_IMM(BPF_JSGT, BPF_REG_8, 1, 2), 9238 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_8), 9239 BPF_ST_MEM(BPF_B, BPF_REG_8, 0, 0), 9240 BPF_MOV64_IMM(BPF_REG_0, 0), 9241 BPF_EXIT_INSN(), 9242 }, 9243 .fixup_map_hash_8b = { 3 }, 9244 .errstr = "unbounded min value", 9245 .errstr_unpriv = "R8 has unknown scalar with mixed signed bounds", 9246 .result = REJECT, 9247 }, 9248 { 9249 "bounds checks mixing signed and unsigned, variant 3", 9250 .insns = { 9251 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9252 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9253 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9254 BPF_LD_MAP_FD(BPF_REG_1, 0), 9255 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9256 BPF_FUNC_map_lookup_elem), 9257 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8), 9258 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9259 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9260 BPF_MOV64_IMM(BPF_REG_2, -1), 9261 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, 4), 9262 BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 9263 BPF_JMP_IMM(BPF_JSGT, BPF_REG_8, 1, 2), 9264 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_8), 9265 BPF_ST_MEM(BPF_B, BPF_REG_8, 0, 0), 9266 BPF_MOV64_IMM(BPF_REG_0, 0), 9267 BPF_EXIT_INSN(), 9268 }, 9269 .fixup_map_hash_8b = { 3 }, 9270 .errstr = "unbounded min value", 9271 .errstr_unpriv = "R8 has unknown scalar with mixed signed bounds", 9272 .result = REJECT, 9273 }, 9274 { 9275 "bounds checks mixing signed and unsigned, variant 4", 9276 .insns = { 9277 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9278 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9279 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9280 BPF_LD_MAP_FD(BPF_REG_1, 0), 9281 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9282 BPF_FUNC_map_lookup_elem), 9283 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 9284 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9285 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9286 BPF_MOV64_IMM(BPF_REG_2, 1), 9287 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 9288 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 9289 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9290 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 9291 BPF_MOV64_IMM(BPF_REG_0, 0), 9292 BPF_EXIT_INSN(), 9293 }, 9294 .fixup_map_hash_8b = { 3 }, 9295 .result = ACCEPT, 9296 }, 9297 { 9298 "bounds checks mixing signed and unsigned, variant 5", 9299 .insns = { 9300 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9301 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9302 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9303 BPF_LD_MAP_FD(BPF_REG_1, 0), 9304 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9305 BPF_FUNC_map_lookup_elem), 9306 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 9307 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9308 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9309 BPF_MOV64_IMM(BPF_REG_2, -1), 9310 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, 5), 9311 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 4), 9312 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 4), 9313 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 9314 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 9315 BPF_MOV64_IMM(BPF_REG_0, 0), 9316 BPF_EXIT_INSN(), 9317 }, 9318 .fixup_map_hash_8b = { 3 }, 9319 .errstr = "unbounded min value", 9320 .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", 9321 .result = REJECT, 9322 }, 9323 { 9324 "bounds checks mixing signed and unsigned, variant 6", 9325 .insns = { 9326 BPF_MOV64_IMM(BPF_REG_2, 0), 9327 BPF_MOV64_REG(BPF_REG_3, BPF_REG_10), 9328 BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, -512), 9329 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9330 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -16), 9331 BPF_MOV64_IMM(BPF_REG_6, -1), 9332 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_6, 5), 9333 BPF_JMP_IMM(BPF_JSGT, BPF_REG_4, 1, 4), 9334 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 1), 9335 BPF_MOV64_IMM(BPF_REG_5, 0), 9336 BPF_ST_MEM(BPF_H, BPF_REG_10, -512, 0), 9337 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9338 BPF_FUNC_skb_load_bytes), 9339 BPF_MOV64_IMM(BPF_REG_0, 0), 9340 BPF_EXIT_INSN(), 9341 }, 9342 .errstr = "R4 min value is negative, either use unsigned", 9343 .result = REJECT, 9344 }, 9345 { 9346 "bounds checks mixing signed and unsigned, variant 7", 9347 .insns = { 9348 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9349 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9350 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9351 BPF_LD_MAP_FD(BPF_REG_1, 0), 9352 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9353 BPF_FUNC_map_lookup_elem), 9354 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 9355 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9356 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9357 BPF_MOV64_IMM(BPF_REG_2, 1024 * 1024 * 1024), 9358 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, 3), 9359 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 9360 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9361 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 9362 BPF_MOV64_IMM(BPF_REG_0, 0), 9363 BPF_EXIT_INSN(), 9364 }, 9365 .fixup_map_hash_8b = { 3 }, 9366 .result = ACCEPT, 9367 }, 9368 { 9369 "bounds checks mixing signed and unsigned, variant 8", 9370 .insns = { 9371 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9372 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9373 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9374 BPF_LD_MAP_FD(BPF_REG_1, 0), 9375 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9376 BPF_FUNC_map_lookup_elem), 9377 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 9378 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9379 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9380 BPF_MOV64_IMM(BPF_REG_2, -1), 9381 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 2), 9382 BPF_MOV64_IMM(BPF_REG_0, 0), 9383 BPF_EXIT_INSN(), 9384 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 9385 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9386 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 9387 BPF_MOV64_IMM(BPF_REG_0, 0), 9388 BPF_EXIT_INSN(), 9389 }, 9390 .fixup_map_hash_8b = { 3 }, 9391 .errstr = "unbounded min value", 9392 .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", 9393 .result = REJECT, 9394 }, 9395 { 9396 "bounds checks mixing signed and unsigned, variant 9", 9397 .insns = { 9398 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9399 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9400 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9401 BPF_LD_MAP_FD(BPF_REG_1, 0), 9402 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9403 BPF_FUNC_map_lookup_elem), 9404 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10), 9405 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9406 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9407 BPF_LD_IMM64(BPF_REG_2, -9223372036854775808ULL), 9408 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 2), 9409 BPF_MOV64_IMM(BPF_REG_0, 0), 9410 BPF_EXIT_INSN(), 9411 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 9412 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9413 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 9414 BPF_MOV64_IMM(BPF_REG_0, 0), 9415 BPF_EXIT_INSN(), 9416 }, 9417 .fixup_map_hash_8b = { 3 }, 9418 .result = ACCEPT, 9419 }, 9420 { 9421 "bounds checks mixing signed and unsigned, variant 10", 9422 .insns = { 9423 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9424 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9425 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9426 BPF_LD_MAP_FD(BPF_REG_1, 0), 9427 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9428 BPF_FUNC_map_lookup_elem), 9429 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 9430 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9431 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9432 BPF_MOV64_IMM(BPF_REG_2, 0), 9433 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 2), 9434 BPF_MOV64_IMM(BPF_REG_0, 0), 9435 BPF_EXIT_INSN(), 9436 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 9437 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9438 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 9439 BPF_MOV64_IMM(BPF_REG_0, 0), 9440 BPF_EXIT_INSN(), 9441 }, 9442 .fixup_map_hash_8b = { 3 }, 9443 .errstr = "unbounded min value", 9444 .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", 9445 .result = REJECT, 9446 }, 9447 { 9448 "bounds checks mixing signed and unsigned, variant 11", 9449 .insns = { 9450 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9451 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9452 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9453 BPF_LD_MAP_FD(BPF_REG_1, 0), 9454 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9455 BPF_FUNC_map_lookup_elem), 9456 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 9457 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9458 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9459 BPF_MOV64_IMM(BPF_REG_2, -1), 9460 BPF_JMP_REG(BPF_JGE, BPF_REG_2, BPF_REG_1, 2), 9461 /* Dead branch. */ 9462 BPF_MOV64_IMM(BPF_REG_0, 0), 9463 BPF_EXIT_INSN(), 9464 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 9465 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9466 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 9467 BPF_MOV64_IMM(BPF_REG_0, 0), 9468 BPF_EXIT_INSN(), 9469 }, 9470 .fixup_map_hash_8b = { 3 }, 9471 .errstr = "unbounded min value", 9472 .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", 9473 .result = REJECT, 9474 }, 9475 { 9476 "bounds checks mixing signed and unsigned, variant 12", 9477 .insns = { 9478 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9479 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9480 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9481 BPF_LD_MAP_FD(BPF_REG_1, 0), 9482 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9483 BPF_FUNC_map_lookup_elem), 9484 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 9485 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9486 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9487 BPF_MOV64_IMM(BPF_REG_2, -6), 9488 BPF_JMP_REG(BPF_JGE, BPF_REG_2, BPF_REG_1, 2), 9489 BPF_MOV64_IMM(BPF_REG_0, 0), 9490 BPF_EXIT_INSN(), 9491 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 9492 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9493 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 9494 BPF_MOV64_IMM(BPF_REG_0, 0), 9495 BPF_EXIT_INSN(), 9496 }, 9497 .fixup_map_hash_8b = { 3 }, 9498 .errstr = "unbounded min value", 9499 .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", 9500 .result = REJECT, 9501 }, 9502 { 9503 "bounds checks mixing signed and unsigned, variant 13", 9504 .insns = { 9505 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9506 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9507 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9508 BPF_LD_MAP_FD(BPF_REG_1, 0), 9509 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9510 BPF_FUNC_map_lookup_elem), 9511 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 9512 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9513 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9514 BPF_MOV64_IMM(BPF_REG_2, 2), 9515 BPF_JMP_REG(BPF_JGE, BPF_REG_2, BPF_REG_1, 2), 9516 BPF_MOV64_IMM(BPF_REG_7, 1), 9517 BPF_JMP_IMM(BPF_JSGT, BPF_REG_7, 0, 2), 9518 BPF_MOV64_IMM(BPF_REG_0, 0), 9519 BPF_EXIT_INSN(), 9520 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_1), 9521 BPF_JMP_IMM(BPF_JSGT, BPF_REG_7, 4, 2), 9522 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_7), 9523 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 9524 BPF_MOV64_IMM(BPF_REG_0, 0), 9525 BPF_EXIT_INSN(), 9526 }, 9527 .fixup_map_hash_8b = { 3 }, 9528 .errstr = "unbounded min value", 9529 .errstr_unpriv = "R7 has unknown scalar with mixed signed bounds", 9530 .result = REJECT, 9531 }, 9532 { 9533 "bounds checks mixing signed and unsigned, variant 14", 9534 .insns = { 9535 BPF_LDX_MEM(BPF_W, BPF_REG_9, BPF_REG_1, 9536 offsetof(struct __sk_buff, mark)), 9537 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9538 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9539 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9540 BPF_LD_MAP_FD(BPF_REG_1, 0), 9541 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9542 BPF_FUNC_map_lookup_elem), 9543 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8), 9544 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9545 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9546 BPF_MOV64_IMM(BPF_REG_2, -1), 9547 BPF_MOV64_IMM(BPF_REG_8, 2), 9548 BPF_JMP_IMM(BPF_JEQ, BPF_REG_9, 42, 6), 9549 BPF_JMP_REG(BPF_JSGT, BPF_REG_8, BPF_REG_1, 3), 9550 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 9551 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9552 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 9553 BPF_MOV64_IMM(BPF_REG_0, 0), 9554 BPF_EXIT_INSN(), 9555 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, -3), 9556 BPF_JMP_IMM(BPF_JA, 0, 0, -7), 9557 }, 9558 .fixup_map_hash_8b = { 4 }, 9559 .errstr = "unbounded min value", 9560 .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", 9561 .result = REJECT, 9562 }, 9563 { 9564 "bounds checks mixing signed and unsigned, variant 15", 9565 .insns = { 9566 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9567 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9568 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9569 BPF_LD_MAP_FD(BPF_REG_1, 0), 9570 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9571 BPF_FUNC_map_lookup_elem), 9572 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 9573 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9574 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9575 BPF_MOV64_IMM(BPF_REG_2, -6), 9576 BPF_JMP_REG(BPF_JGE, BPF_REG_2, BPF_REG_1, 2), 9577 BPF_MOV64_IMM(BPF_REG_0, 0), 9578 BPF_EXIT_INSN(), 9579 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9580 BPF_JMP_IMM(BPF_JGT, BPF_REG_0, 1, 2), 9581 BPF_MOV64_IMM(BPF_REG_0, 0), 9582 BPF_EXIT_INSN(), 9583 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 9584 BPF_MOV64_IMM(BPF_REG_0, 0), 9585 BPF_EXIT_INSN(), 9586 }, 9587 .fixup_map_hash_8b = { 3 }, 9588 .errstr = "unbounded min value", 9589 .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", 9590 .result = REJECT, 9591 .result_unpriv = REJECT, 9592 }, 9593 { 9594 "subtraction bounds (map value) variant 1", 9595 .insns = { 9596 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9597 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9598 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9599 BPF_LD_MAP_FD(BPF_REG_1, 0), 9600 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9601 BPF_FUNC_map_lookup_elem), 9602 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 9603 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 9604 BPF_JMP_IMM(BPF_JGT, BPF_REG_1, 0xff, 7), 9605 BPF_LDX_MEM(BPF_B, BPF_REG_3, BPF_REG_0, 1), 9606 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 0xff, 5), 9607 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_3), 9608 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 56), 9609 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9610 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9611 BPF_EXIT_INSN(), 9612 BPF_MOV64_IMM(BPF_REG_0, 0), 9613 BPF_EXIT_INSN(), 9614 }, 9615 .fixup_map_hash_8b = { 3 }, 9616 .errstr = "R0 max value is outside of the array range", 9617 .result = REJECT, 9618 }, 9619 { 9620 "subtraction bounds (map value) variant 2", 9621 .insns = { 9622 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9623 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9624 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9625 BPF_LD_MAP_FD(BPF_REG_1, 0), 9626 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9627 BPF_FUNC_map_lookup_elem), 9628 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8), 9629 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 9630 BPF_JMP_IMM(BPF_JGT, BPF_REG_1, 0xff, 6), 9631 BPF_LDX_MEM(BPF_B, BPF_REG_3, BPF_REG_0, 1), 9632 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 0xff, 4), 9633 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_3), 9634 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9635 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9636 BPF_EXIT_INSN(), 9637 BPF_MOV64_IMM(BPF_REG_0, 0), 9638 BPF_EXIT_INSN(), 9639 }, 9640 .fixup_map_hash_8b = { 3 }, 9641 .errstr = "R0 min value is negative, either use unsigned index or do a if (index >=0) check.", 9642 .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", 9643 .result = REJECT, 9644 }, 9645 { 9646 "check subtraction on pointers for unpriv", 9647 .insns = { 9648 BPF_MOV64_IMM(BPF_REG_0, 0), 9649 BPF_LD_MAP_FD(BPF_REG_ARG1, 0), 9650 BPF_MOV64_REG(BPF_REG_ARG2, BPF_REG_FP), 9651 BPF_ALU64_IMM(BPF_ADD, BPF_REG_ARG2, -8), 9652 BPF_ST_MEM(BPF_DW, BPF_REG_ARG2, 0, 9), 9653 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9654 BPF_FUNC_map_lookup_elem), 9655 BPF_MOV64_REG(BPF_REG_9, BPF_REG_FP), 9656 BPF_ALU64_REG(BPF_SUB, BPF_REG_9, BPF_REG_0), 9657 BPF_LD_MAP_FD(BPF_REG_ARG1, 0), 9658 BPF_MOV64_REG(BPF_REG_ARG2, BPF_REG_FP), 9659 BPF_ALU64_IMM(BPF_ADD, BPF_REG_ARG2, -8), 9660 BPF_ST_MEM(BPF_DW, BPF_REG_ARG2, 0, 0), 9661 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9662 BPF_FUNC_map_lookup_elem), 9663 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 9664 BPF_EXIT_INSN(), 9665 BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_9, 0), 9666 BPF_MOV64_IMM(BPF_REG_0, 0), 9667 BPF_EXIT_INSN(), 9668 }, 9669 .fixup_map_hash_8b = { 1, 9 }, 9670 .result = ACCEPT, 9671 .result_unpriv = REJECT, 9672 .errstr_unpriv = "R9 pointer -= pointer prohibited", 9673 }, 9674 { 9675 "bounds check based on zero-extended MOV", 9676 .insns = { 9677 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9678 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9679 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9680 BPF_LD_MAP_FD(BPF_REG_1, 0), 9681 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9682 BPF_FUNC_map_lookup_elem), 9683 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 9684 /* r2 = 0x0000'0000'ffff'ffff */ 9685 BPF_MOV32_IMM(BPF_REG_2, 0xffffffff), 9686 /* r2 = 0 */ 9687 BPF_ALU64_IMM(BPF_RSH, BPF_REG_2, 32), 9688 /* no-op */ 9689 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 9690 /* access at offset 0 */ 9691 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9692 /* exit */ 9693 BPF_MOV64_IMM(BPF_REG_0, 0), 9694 BPF_EXIT_INSN(), 9695 }, 9696 .fixup_map_hash_8b = { 3 }, 9697 .result = ACCEPT 9698 }, 9699 { 9700 "bounds check based on sign-extended MOV. test1", 9701 .insns = { 9702 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9703 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9704 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9705 BPF_LD_MAP_FD(BPF_REG_1, 0), 9706 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9707 BPF_FUNC_map_lookup_elem), 9708 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 9709 /* r2 = 0xffff'ffff'ffff'ffff */ 9710 BPF_MOV64_IMM(BPF_REG_2, 0xffffffff), 9711 /* r2 = 0xffff'ffff */ 9712 BPF_ALU64_IMM(BPF_RSH, BPF_REG_2, 32), 9713 /* r0 = <oob pointer> */ 9714 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 9715 /* access to OOB pointer */ 9716 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9717 /* exit */ 9718 BPF_MOV64_IMM(BPF_REG_0, 0), 9719 BPF_EXIT_INSN(), 9720 }, 9721 .fixup_map_hash_8b = { 3 }, 9722 .errstr = "map_value pointer and 4294967295", 9723 .result = REJECT 9724 }, 9725 { 9726 "bounds check based on sign-extended MOV. test2", 9727 .insns = { 9728 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9729 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9730 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9731 BPF_LD_MAP_FD(BPF_REG_1, 0), 9732 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9733 BPF_FUNC_map_lookup_elem), 9734 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 9735 /* r2 = 0xffff'ffff'ffff'ffff */ 9736 BPF_MOV64_IMM(BPF_REG_2, 0xffffffff), 9737 /* r2 = 0xfff'ffff */ 9738 BPF_ALU64_IMM(BPF_RSH, BPF_REG_2, 36), 9739 /* r0 = <oob pointer> */ 9740 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 9741 /* access to OOB pointer */ 9742 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9743 /* exit */ 9744 BPF_MOV64_IMM(BPF_REG_0, 0), 9745 BPF_EXIT_INSN(), 9746 }, 9747 .fixup_map_hash_8b = { 3 }, 9748 .errstr = "R0 min value is outside of the array range", 9749 .result = REJECT 9750 }, 9751 { 9752 "bounds check based on reg_off + var_off + insn_off. test1", 9753 .insns = { 9754 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 9755 offsetof(struct __sk_buff, mark)), 9756 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9757 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9758 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9759 BPF_LD_MAP_FD(BPF_REG_1, 0), 9760 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9761 BPF_FUNC_map_lookup_elem), 9762 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 9763 BPF_ALU64_IMM(BPF_AND, BPF_REG_6, 1), 9764 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, (1 << 29) - 1), 9765 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_6), 9766 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, (1 << 29) - 1), 9767 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 3), 9768 BPF_MOV64_IMM(BPF_REG_0, 0), 9769 BPF_EXIT_INSN(), 9770 }, 9771 .fixup_map_hash_8b = { 4 }, 9772 .errstr = "value_size=8 off=1073741825", 9773 .result = REJECT, 9774 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 9775 }, 9776 { 9777 "bounds check based on reg_off + var_off + insn_off. test2", 9778 .insns = { 9779 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 9780 offsetof(struct __sk_buff, mark)), 9781 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9782 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9783 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9784 BPF_LD_MAP_FD(BPF_REG_1, 0), 9785 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9786 BPF_FUNC_map_lookup_elem), 9787 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 9788 BPF_ALU64_IMM(BPF_AND, BPF_REG_6, 1), 9789 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, (1 << 30) - 1), 9790 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_6), 9791 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, (1 << 29) - 1), 9792 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 3), 9793 BPF_MOV64_IMM(BPF_REG_0, 0), 9794 BPF_EXIT_INSN(), 9795 }, 9796 .fixup_map_hash_8b = { 4 }, 9797 .errstr = "value 1073741823", 9798 .result = REJECT, 9799 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 9800 }, 9801 { 9802 "bounds check after truncation of non-boundary-crossing range", 9803 .insns = { 9804 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9805 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9806 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9807 BPF_LD_MAP_FD(BPF_REG_1, 0), 9808 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9809 BPF_FUNC_map_lookup_elem), 9810 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 9811 /* r1 = [0x00, 0xff] */ 9812 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 9813 BPF_MOV64_IMM(BPF_REG_2, 1), 9814 /* r2 = 0x10'0000'0000 */ 9815 BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 36), 9816 /* r1 = [0x10'0000'0000, 0x10'0000'00ff] */ 9817 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 9818 /* r1 = [0x10'7fff'ffff, 0x10'8000'00fe] */ 9819 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x7fffffff), 9820 /* r1 = [0x00, 0xff] */ 9821 BPF_ALU32_IMM(BPF_SUB, BPF_REG_1, 0x7fffffff), 9822 /* r1 = 0 */ 9823 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8), 9824 /* no-op */ 9825 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9826 /* access at offset 0 */ 9827 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9828 /* exit */ 9829 BPF_MOV64_IMM(BPF_REG_0, 0), 9830 BPF_EXIT_INSN(), 9831 }, 9832 .fixup_map_hash_8b = { 3 }, 9833 .result = ACCEPT 9834 }, 9835 { 9836 "bounds check after truncation of boundary-crossing range (1)", 9837 .insns = { 9838 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9839 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9840 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9841 BPF_LD_MAP_FD(BPF_REG_1, 0), 9842 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9843 BPF_FUNC_map_lookup_elem), 9844 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 9845 /* r1 = [0x00, 0xff] */ 9846 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 9847 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0xffffff80 >> 1), 9848 /* r1 = [0xffff'ff80, 0x1'0000'007f] */ 9849 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0xffffff80 >> 1), 9850 /* r1 = [0xffff'ff80, 0xffff'ffff] or 9851 * [0x0000'0000, 0x0000'007f] 9852 */ 9853 BPF_ALU32_IMM(BPF_ADD, BPF_REG_1, 0), 9854 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 0xffffff80 >> 1), 9855 /* r1 = [0x00, 0xff] or 9856 * [0xffff'ffff'0000'0080, 0xffff'ffff'ffff'ffff] 9857 */ 9858 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 0xffffff80 >> 1), 9859 /* r1 = 0 or 9860 * [0x00ff'ffff'ff00'0000, 0x00ff'ffff'ffff'ffff] 9861 */ 9862 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8), 9863 /* no-op or OOB pointer computation */ 9864 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9865 /* potentially OOB access */ 9866 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9867 /* exit */ 9868 BPF_MOV64_IMM(BPF_REG_0, 0), 9869 BPF_EXIT_INSN(), 9870 }, 9871 .fixup_map_hash_8b = { 3 }, 9872 /* not actually fully unbounded, but the bound is very high */ 9873 .errstr = "R0 unbounded memory access", 9874 .result = REJECT 9875 }, 9876 { 9877 "bounds check after truncation of boundary-crossing range (2)", 9878 .insns = { 9879 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9880 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9881 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9882 BPF_LD_MAP_FD(BPF_REG_1, 0), 9883 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9884 BPF_FUNC_map_lookup_elem), 9885 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 9886 /* r1 = [0x00, 0xff] */ 9887 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 9888 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0xffffff80 >> 1), 9889 /* r1 = [0xffff'ff80, 0x1'0000'007f] */ 9890 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0xffffff80 >> 1), 9891 /* r1 = [0xffff'ff80, 0xffff'ffff] or 9892 * [0x0000'0000, 0x0000'007f] 9893 * difference to previous test: truncation via MOV32 9894 * instead of ALU32. 9895 */ 9896 BPF_MOV32_REG(BPF_REG_1, BPF_REG_1), 9897 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 0xffffff80 >> 1), 9898 /* r1 = [0x00, 0xff] or 9899 * [0xffff'ffff'0000'0080, 0xffff'ffff'ffff'ffff] 9900 */ 9901 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 0xffffff80 >> 1), 9902 /* r1 = 0 or 9903 * [0x00ff'ffff'ff00'0000, 0x00ff'ffff'ffff'ffff] 9904 */ 9905 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8), 9906 /* no-op or OOB pointer computation */ 9907 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9908 /* potentially OOB access */ 9909 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9910 /* exit */ 9911 BPF_MOV64_IMM(BPF_REG_0, 0), 9912 BPF_EXIT_INSN(), 9913 }, 9914 .fixup_map_hash_8b = { 3 }, 9915 /* not actually fully unbounded, but the bound is very high */ 9916 .errstr = "R0 unbounded memory access", 9917 .result = REJECT 9918 }, 9919 { 9920 "bounds check after wrapping 32-bit addition", 9921 .insns = { 9922 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9923 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9924 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9925 BPF_LD_MAP_FD(BPF_REG_1, 0), 9926 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9927 BPF_FUNC_map_lookup_elem), 9928 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 9929 /* r1 = 0x7fff'ffff */ 9930 BPF_MOV64_IMM(BPF_REG_1, 0x7fffffff), 9931 /* r1 = 0xffff'fffe */ 9932 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x7fffffff), 9933 /* r1 = 0 */ 9934 BPF_ALU32_IMM(BPF_ADD, BPF_REG_1, 2), 9935 /* no-op */ 9936 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9937 /* access at offset 0 */ 9938 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9939 /* exit */ 9940 BPF_MOV64_IMM(BPF_REG_0, 0), 9941 BPF_EXIT_INSN(), 9942 }, 9943 .fixup_map_hash_8b = { 3 }, 9944 .result = ACCEPT 9945 }, 9946 { 9947 "bounds check after shift with oversized count operand", 9948 .insns = { 9949 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9950 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9951 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9952 BPF_LD_MAP_FD(BPF_REG_1, 0), 9953 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9954 BPF_FUNC_map_lookup_elem), 9955 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 9956 BPF_MOV64_IMM(BPF_REG_2, 32), 9957 BPF_MOV64_IMM(BPF_REG_1, 1), 9958 /* r1 = (u32)1 << (u32)32 = ? */ 9959 BPF_ALU32_REG(BPF_LSH, BPF_REG_1, BPF_REG_2), 9960 /* r1 = [0x0000, 0xffff] */ 9961 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xffff), 9962 /* computes unknown pointer, potentially OOB */ 9963 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9964 /* potentially OOB access */ 9965 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9966 /* exit */ 9967 BPF_MOV64_IMM(BPF_REG_0, 0), 9968 BPF_EXIT_INSN(), 9969 }, 9970 .fixup_map_hash_8b = { 3 }, 9971 .errstr = "R0 max value is outside of the array range", 9972 .result = REJECT 9973 }, 9974 { 9975 "bounds check after right shift of maybe-negative number", 9976 .insns = { 9977 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9978 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9979 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9980 BPF_LD_MAP_FD(BPF_REG_1, 0), 9981 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9982 BPF_FUNC_map_lookup_elem), 9983 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 9984 /* r1 = [0x00, 0xff] */ 9985 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 9986 /* r1 = [-0x01, 0xfe] */ 9987 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 1), 9988 /* r1 = 0 or 0xff'ffff'ffff'ffff */ 9989 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8), 9990 /* r1 = 0 or 0xffff'ffff'ffff */ 9991 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8), 9992 /* computes unknown pointer, potentially OOB */ 9993 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9994 /* potentially OOB access */ 9995 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9996 /* exit */ 9997 BPF_MOV64_IMM(BPF_REG_0, 0), 9998 BPF_EXIT_INSN(), 9999 }, 10000 .fixup_map_hash_8b = { 3 }, 10001 .errstr = "R0 unbounded memory access", 10002 .result = REJECT 10003 }, 10004 { 10005 "bounds check after 32-bit right shift with 64-bit input", 10006 .insns = { 10007 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 10008 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10009 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 10010 BPF_LD_MAP_FD(BPF_REG_1, 0), 10011 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 10012 BPF_FUNC_map_lookup_elem), 10013 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 10014 /* r1 = 2 */ 10015 BPF_MOV64_IMM(BPF_REG_1, 2), 10016 /* r1 = 1<<32 */ 10017 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 31), 10018 /* r1 = 0 (NOT 2!) */ 10019 BPF_ALU32_IMM(BPF_RSH, BPF_REG_1, 31), 10020 /* r1 = 0xffff'fffe (NOT 0!) */ 10021 BPF_ALU32_IMM(BPF_SUB, BPF_REG_1, 2), 10022 /* computes OOB pointer */ 10023 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 10024 /* OOB access */ 10025 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 10026 /* exit */ 10027 BPF_MOV64_IMM(BPF_REG_0, 0), 10028 BPF_EXIT_INSN(), 10029 }, 10030 .fixup_map_hash_8b = { 3 }, 10031 .errstr = "R0 invalid mem access", 10032 .result = REJECT, 10033 }, 10034 { 10035 "bounds check map access with off+size signed 32bit overflow. test1", 10036 .insns = { 10037 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 10038 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10039 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 10040 BPF_LD_MAP_FD(BPF_REG_1, 0), 10041 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 10042 BPF_FUNC_map_lookup_elem), 10043 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 10044 BPF_EXIT_INSN(), 10045 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x7ffffffe), 10046 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0), 10047 BPF_JMP_A(0), 10048 BPF_EXIT_INSN(), 10049 }, 10050 .fixup_map_hash_8b = { 3 }, 10051 .errstr = "map_value pointer and 2147483646", 10052 .result = REJECT 10053 }, 10054 { 10055 "bounds check map access with off+size signed 32bit overflow. test2", 10056 .insns = { 10057 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 10058 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10059 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 10060 BPF_LD_MAP_FD(BPF_REG_1, 0), 10061 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 10062 BPF_FUNC_map_lookup_elem), 10063 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 10064 BPF_EXIT_INSN(), 10065 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x1fffffff), 10066 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x1fffffff), 10067 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x1fffffff), 10068 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0), 10069 BPF_JMP_A(0), 10070 BPF_EXIT_INSN(), 10071 }, 10072 .fixup_map_hash_8b = { 3 }, 10073 .errstr = "pointer offset 1073741822", 10074 .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", 10075 .result = REJECT 10076 }, 10077 { 10078 "bounds check map access with off+size signed 32bit overflow. test3", 10079 .insns = { 10080 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 10081 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10082 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 10083 BPF_LD_MAP_FD(BPF_REG_1, 0), 10084 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 10085 BPF_FUNC_map_lookup_elem), 10086 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 10087 BPF_EXIT_INSN(), 10088 BPF_ALU64_IMM(BPF_SUB, BPF_REG_0, 0x1fffffff), 10089 BPF_ALU64_IMM(BPF_SUB, BPF_REG_0, 0x1fffffff), 10090 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 2), 10091 BPF_JMP_A(0), 10092 BPF_EXIT_INSN(), 10093 }, 10094 .fixup_map_hash_8b = { 3 }, 10095 .errstr = "pointer offset -1073741822", 10096 .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", 10097 .result = REJECT 10098 }, 10099 { 10100 "bounds check map access with off+size signed 32bit overflow. test4", 10101 .insns = { 10102 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 10103 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10104 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 10105 BPF_LD_MAP_FD(BPF_REG_1, 0), 10106 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 10107 BPF_FUNC_map_lookup_elem), 10108 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 10109 BPF_EXIT_INSN(), 10110 BPF_MOV64_IMM(BPF_REG_1, 1000000), 10111 BPF_ALU64_IMM(BPF_MUL, BPF_REG_1, 1000000), 10112 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 10113 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 2), 10114 BPF_JMP_A(0), 10115 BPF_EXIT_INSN(), 10116 }, 10117 .fixup_map_hash_8b = { 3 }, 10118 .errstr = "map_value pointer and 1000000000000", 10119 .result = REJECT 10120 }, 10121 { 10122 "pointer/scalar confusion in state equality check (way 1)", 10123 .insns = { 10124 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 10125 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10126 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 10127 BPF_LD_MAP_FD(BPF_REG_1, 0), 10128 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 10129 BPF_FUNC_map_lookup_elem), 10130 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 10131 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0), 10132 BPF_JMP_A(1), 10133 BPF_MOV64_REG(BPF_REG_0, BPF_REG_10), 10134 BPF_JMP_A(0), 10135 BPF_EXIT_INSN(), 10136 }, 10137 .fixup_map_hash_8b = { 3 }, 10138 .result = ACCEPT, 10139 .retval = POINTER_VALUE, 10140 .result_unpriv = REJECT, 10141 .errstr_unpriv = "R0 leaks addr as return value" 10142 }, 10143 { 10144 "pointer/scalar confusion in state equality check (way 2)", 10145 .insns = { 10146 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 10147 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10148 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 10149 BPF_LD_MAP_FD(BPF_REG_1, 0), 10150 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 10151 BPF_FUNC_map_lookup_elem), 10152 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 10153 BPF_MOV64_REG(BPF_REG_0, BPF_REG_10), 10154 BPF_JMP_A(1), 10155 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0), 10156 BPF_EXIT_INSN(), 10157 }, 10158 .fixup_map_hash_8b = { 3 }, 10159 .result = ACCEPT, 10160 .retval = POINTER_VALUE, 10161 .result_unpriv = REJECT, 10162 .errstr_unpriv = "R0 leaks addr as return value" 10163 }, 10164 { 10165 "variable-offset ctx access", 10166 .insns = { 10167 /* Get an unknown value */ 10168 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0), 10169 /* Make it small and 4-byte aligned */ 10170 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4), 10171 /* add it to skb. We now have either &skb->len or 10172 * &skb->pkt_type, but we don't know which 10173 */ 10174 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 10175 /* dereference it */ 10176 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 10177 BPF_EXIT_INSN(), 10178 }, 10179 .errstr = "variable ctx access var_off=(0x0; 0x4)", 10180 .result = REJECT, 10181 .prog_type = BPF_PROG_TYPE_LWT_IN, 10182 }, 10183 { 10184 "variable-offset stack access", 10185 .insns = { 10186 /* Fill the top 8 bytes of the stack */ 10187 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 10188 /* Get an unknown value */ 10189 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0), 10190 /* Make it small and 4-byte aligned */ 10191 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4), 10192 BPF_ALU64_IMM(BPF_SUB, BPF_REG_2, 8), 10193 /* add it to fp. We now have either fp-4 or fp-8, but 10194 * we don't know which 10195 */ 10196 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_10), 10197 /* dereference it */ 10198 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_2, 0), 10199 BPF_EXIT_INSN(), 10200 }, 10201 .errstr = "variable stack access var_off=(0xfffffffffffffff8; 0x4)", 10202 .result = REJECT, 10203 .prog_type = BPF_PROG_TYPE_LWT_IN, 10204 }, 10205 { 10206 "indirect variable-offset stack access", 10207 .insns = { 10208 /* Fill the top 8 bytes of the stack */ 10209 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 10210 /* Get an unknown value */ 10211 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0), 10212 /* Make it small and 4-byte aligned */ 10213 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4), 10214 BPF_ALU64_IMM(BPF_SUB, BPF_REG_2, 8), 10215 /* add it to fp. We now have either fp-4 or fp-8, but 10216 * we don't know which 10217 */ 10218 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_10), 10219 /* dereference it indirectly */ 10220 BPF_LD_MAP_FD(BPF_REG_1, 0), 10221 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 10222 BPF_FUNC_map_lookup_elem), 10223 BPF_MOV64_IMM(BPF_REG_0, 0), 10224 BPF_EXIT_INSN(), 10225 }, 10226 .fixup_map_hash_8b = { 5 }, 10227 .errstr = "variable stack read R2", 10228 .result = REJECT, 10229 .prog_type = BPF_PROG_TYPE_LWT_IN, 10230 }, 10231 { 10232 "direct stack access with 32-bit wraparound. test1", 10233 .insns = { 10234 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 10235 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x7fffffff), 10236 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x7fffffff), 10237 BPF_MOV32_IMM(BPF_REG_0, 0), 10238 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 10239 BPF_EXIT_INSN() 10240 }, 10241 .errstr = "fp pointer and 2147483647", 10242 .result = REJECT 10243 }, 10244 { 10245 "direct stack access with 32-bit wraparound. test2", 10246 .insns = { 10247 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 10248 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x3fffffff), 10249 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x3fffffff), 10250 BPF_MOV32_IMM(BPF_REG_0, 0), 10251 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 10252 BPF_EXIT_INSN() 10253 }, 10254 .errstr = "fp pointer and 1073741823", 10255 .result = REJECT 10256 }, 10257 { 10258 "direct stack access with 32-bit wraparound. test3", 10259 .insns = { 10260 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 10261 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x1fffffff), 10262 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x1fffffff), 10263 BPF_MOV32_IMM(BPF_REG_0, 0), 10264 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 10265 BPF_EXIT_INSN() 10266 }, 10267 .errstr = "fp pointer offset 1073741822", 10268 .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", 10269 .result = REJECT 10270 }, 10271 { 10272 "liveness pruning and write screening", 10273 .insns = { 10274 /* Get an unknown value */ 10275 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0), 10276 /* branch conditions teach us nothing about R2 */ 10277 BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1), 10278 BPF_MOV64_IMM(BPF_REG_0, 0), 10279 BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1), 10280 BPF_MOV64_IMM(BPF_REG_0, 0), 10281 BPF_EXIT_INSN(), 10282 }, 10283 .errstr = "R0 !read_ok", 10284 .result = REJECT, 10285 .prog_type = BPF_PROG_TYPE_LWT_IN, 10286 }, 10287 { 10288 "varlen_map_value_access pruning", 10289 .insns = { 10290 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 10291 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10292 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 10293 BPF_LD_MAP_FD(BPF_REG_1, 0), 10294 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 10295 BPF_FUNC_map_lookup_elem), 10296 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8), 10297 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), 10298 BPF_MOV32_IMM(BPF_REG_2, MAX_ENTRIES), 10299 BPF_JMP_REG(BPF_JSGT, BPF_REG_2, BPF_REG_1, 1), 10300 BPF_MOV32_IMM(BPF_REG_1, 0), 10301 BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 2), 10302 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 10303 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 10304 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 10305 offsetof(struct test_val, foo)), 10306 BPF_EXIT_INSN(), 10307 }, 10308 .fixup_map_hash_48b = { 3 }, 10309 .errstr_unpriv = "R0 leaks addr", 10310 .errstr = "R0 unbounded memory access", 10311 .result_unpriv = REJECT, 10312 .result = REJECT, 10313 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10314 }, 10315 { 10316 "invalid 64-bit BPF_END", 10317 .insns = { 10318 BPF_MOV32_IMM(BPF_REG_0, 0), 10319 { 10320 .code = BPF_ALU64 | BPF_END | BPF_TO_LE, 10321 .dst_reg = BPF_REG_0, 10322 .src_reg = 0, 10323 .off = 0, 10324 .imm = 32, 10325 }, 10326 BPF_EXIT_INSN(), 10327 }, 10328 .errstr = "unknown opcode d7", 10329 .result = REJECT, 10330 }, 10331 { 10332 "XDP, using ifindex from netdev", 10333 .insns = { 10334 BPF_MOV64_IMM(BPF_REG_0, 0), 10335 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10336 offsetof(struct xdp_md, ingress_ifindex)), 10337 BPF_JMP_IMM(BPF_JLT, BPF_REG_2, 1, 1), 10338 BPF_MOV64_IMM(BPF_REG_0, 1), 10339 BPF_EXIT_INSN(), 10340 }, 10341 .result = ACCEPT, 10342 .prog_type = BPF_PROG_TYPE_XDP, 10343 .retval = 1, 10344 }, 10345 { 10346 "meta access, test1", 10347 .insns = { 10348 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10349 offsetof(struct xdp_md, data_meta)), 10350 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10351 offsetof(struct xdp_md, data)), 10352 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 10353 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 10354 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 10355 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 10356 BPF_MOV64_IMM(BPF_REG_0, 0), 10357 BPF_EXIT_INSN(), 10358 }, 10359 .result = ACCEPT, 10360 .prog_type = BPF_PROG_TYPE_XDP, 10361 }, 10362 { 10363 "meta access, test2", 10364 .insns = { 10365 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10366 offsetof(struct xdp_md, data_meta)), 10367 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10368 offsetof(struct xdp_md, data)), 10369 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 10370 BPF_ALU64_IMM(BPF_SUB, BPF_REG_0, 8), 10371 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 10372 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8), 10373 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1), 10374 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 10375 BPF_MOV64_IMM(BPF_REG_0, 0), 10376 BPF_EXIT_INSN(), 10377 }, 10378 .result = REJECT, 10379 .errstr = "invalid access to packet, off=-8", 10380 .prog_type = BPF_PROG_TYPE_XDP, 10381 }, 10382 { 10383 "meta access, test3", 10384 .insns = { 10385 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10386 offsetof(struct xdp_md, data_meta)), 10387 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10388 offsetof(struct xdp_md, data_end)), 10389 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 10390 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 10391 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 10392 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 10393 BPF_MOV64_IMM(BPF_REG_0, 0), 10394 BPF_EXIT_INSN(), 10395 }, 10396 .result = REJECT, 10397 .errstr = "invalid access to packet", 10398 .prog_type = BPF_PROG_TYPE_XDP, 10399 }, 10400 { 10401 "meta access, test4", 10402 .insns = { 10403 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10404 offsetof(struct xdp_md, data_meta)), 10405 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10406 offsetof(struct xdp_md, data_end)), 10407 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 10408 offsetof(struct xdp_md, data)), 10409 BPF_MOV64_REG(BPF_REG_0, BPF_REG_4), 10410 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 10411 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 10412 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 10413 BPF_MOV64_IMM(BPF_REG_0, 0), 10414 BPF_EXIT_INSN(), 10415 }, 10416 .result = REJECT, 10417 .errstr = "invalid access to packet", 10418 .prog_type = BPF_PROG_TYPE_XDP, 10419 }, 10420 { 10421 "meta access, test5", 10422 .insns = { 10423 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10424 offsetof(struct xdp_md, data_meta)), 10425 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 10426 offsetof(struct xdp_md, data)), 10427 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3), 10428 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 10429 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_4, 3), 10430 BPF_MOV64_IMM(BPF_REG_2, -8), 10431 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 10432 BPF_FUNC_xdp_adjust_meta), 10433 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_3, 0), 10434 BPF_MOV64_IMM(BPF_REG_0, 0), 10435 BPF_EXIT_INSN(), 10436 }, 10437 .result = REJECT, 10438 .errstr = "R3 !read_ok", 10439 .prog_type = BPF_PROG_TYPE_XDP, 10440 }, 10441 { 10442 "meta access, test6", 10443 .insns = { 10444 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10445 offsetof(struct xdp_md, data_meta)), 10446 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10447 offsetof(struct xdp_md, data)), 10448 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3), 10449 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 10450 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 10451 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8), 10452 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_0, 1), 10453 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 10454 BPF_MOV64_IMM(BPF_REG_0, 0), 10455 BPF_EXIT_INSN(), 10456 }, 10457 .result = REJECT, 10458 .errstr = "invalid access to packet", 10459 .prog_type = BPF_PROG_TYPE_XDP, 10460 }, 10461 { 10462 "meta access, test7", 10463 .insns = { 10464 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10465 offsetof(struct xdp_md, data_meta)), 10466 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10467 offsetof(struct xdp_md, data)), 10468 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3), 10469 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 10470 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 10471 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8), 10472 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1), 10473 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 10474 BPF_MOV64_IMM(BPF_REG_0, 0), 10475 BPF_EXIT_INSN(), 10476 }, 10477 .result = ACCEPT, 10478 .prog_type = BPF_PROG_TYPE_XDP, 10479 }, 10480 { 10481 "meta access, test8", 10482 .insns = { 10483 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10484 offsetof(struct xdp_md, data_meta)), 10485 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10486 offsetof(struct xdp_md, data)), 10487 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 10488 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 0xFFFF), 10489 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1), 10490 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 10491 BPF_MOV64_IMM(BPF_REG_0, 0), 10492 BPF_EXIT_INSN(), 10493 }, 10494 .result = ACCEPT, 10495 .prog_type = BPF_PROG_TYPE_XDP, 10496 }, 10497 { 10498 "meta access, test9", 10499 .insns = { 10500 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10501 offsetof(struct xdp_md, data_meta)), 10502 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10503 offsetof(struct xdp_md, data)), 10504 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 10505 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 0xFFFF), 10506 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 1), 10507 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1), 10508 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 10509 BPF_MOV64_IMM(BPF_REG_0, 0), 10510 BPF_EXIT_INSN(), 10511 }, 10512 .result = REJECT, 10513 .errstr = "invalid access to packet", 10514 .prog_type = BPF_PROG_TYPE_XDP, 10515 }, 10516 { 10517 "meta access, test10", 10518 .insns = { 10519 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10520 offsetof(struct xdp_md, data_meta)), 10521 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10522 offsetof(struct xdp_md, data)), 10523 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 10524 offsetof(struct xdp_md, data_end)), 10525 BPF_MOV64_IMM(BPF_REG_5, 42), 10526 BPF_MOV64_IMM(BPF_REG_6, 24), 10527 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_5, -8), 10528 BPF_STX_XADD(BPF_DW, BPF_REG_10, BPF_REG_6, -8), 10529 BPF_LDX_MEM(BPF_DW, BPF_REG_5, BPF_REG_10, -8), 10530 BPF_JMP_IMM(BPF_JGT, BPF_REG_5, 100, 6), 10531 BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_5), 10532 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3), 10533 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 10534 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 8), 10535 BPF_JMP_REG(BPF_JGT, BPF_REG_6, BPF_REG_5, 1), 10536 BPF_LDX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 10537 BPF_MOV64_IMM(BPF_REG_0, 0), 10538 BPF_EXIT_INSN(), 10539 }, 10540 .result = REJECT, 10541 .errstr = "invalid access to packet", 10542 .prog_type = BPF_PROG_TYPE_XDP, 10543 }, 10544 { 10545 "meta access, test11", 10546 .insns = { 10547 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10548 offsetof(struct xdp_md, data_meta)), 10549 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10550 offsetof(struct xdp_md, data)), 10551 BPF_MOV64_IMM(BPF_REG_5, 42), 10552 BPF_MOV64_IMM(BPF_REG_6, 24), 10553 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_5, -8), 10554 BPF_STX_XADD(BPF_DW, BPF_REG_10, BPF_REG_6, -8), 10555 BPF_LDX_MEM(BPF_DW, BPF_REG_5, BPF_REG_10, -8), 10556 BPF_JMP_IMM(BPF_JGT, BPF_REG_5, 100, 6), 10557 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_5), 10558 BPF_MOV64_REG(BPF_REG_5, BPF_REG_2), 10559 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 10560 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 8), 10561 BPF_JMP_REG(BPF_JGT, BPF_REG_6, BPF_REG_3, 1), 10562 BPF_LDX_MEM(BPF_B, BPF_REG_5, BPF_REG_5, 0), 10563 BPF_MOV64_IMM(BPF_REG_0, 0), 10564 BPF_EXIT_INSN(), 10565 }, 10566 .result = ACCEPT, 10567 .prog_type = BPF_PROG_TYPE_XDP, 10568 }, 10569 { 10570 "meta access, test12", 10571 .insns = { 10572 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10573 offsetof(struct xdp_md, data_meta)), 10574 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10575 offsetof(struct xdp_md, data)), 10576 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 10577 offsetof(struct xdp_md, data_end)), 10578 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3), 10579 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 16), 10580 BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_4, 5), 10581 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_3, 0), 10582 BPF_MOV64_REG(BPF_REG_5, BPF_REG_2), 10583 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 16), 10584 BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_3, 1), 10585 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 10586 BPF_MOV64_IMM(BPF_REG_0, 0), 10587 BPF_EXIT_INSN(), 10588 }, 10589 .result = ACCEPT, 10590 .prog_type = BPF_PROG_TYPE_XDP, 10591 }, 10592 { 10593 "arithmetic ops make PTR_TO_CTX unusable", 10594 .insns = { 10595 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 10596 offsetof(struct __sk_buff, data) - 10597 offsetof(struct __sk_buff, mark)), 10598 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 10599 offsetof(struct __sk_buff, mark)), 10600 BPF_EXIT_INSN(), 10601 }, 10602 .errstr = "dereference of modified ctx ptr", 10603 .result = REJECT, 10604 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 10605 }, 10606 { 10607 "pkt_end - pkt_start is allowed", 10608 .insns = { 10609 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 10610 offsetof(struct __sk_buff, data_end)), 10611 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10612 offsetof(struct __sk_buff, data)), 10613 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_2), 10614 BPF_EXIT_INSN(), 10615 }, 10616 .result = ACCEPT, 10617 .retval = TEST_DATA_LEN, 10618 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 10619 }, 10620 { 10621 "XDP pkt read, pkt_end mangling, bad access 1", 10622 .insns = { 10623 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10624 offsetof(struct xdp_md, data)), 10625 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10626 offsetof(struct xdp_md, data_end)), 10627 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10628 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10629 BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, 8), 10630 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 10631 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10632 BPF_MOV64_IMM(BPF_REG_0, 0), 10633 BPF_EXIT_INSN(), 10634 }, 10635 .errstr = "R3 pointer arithmetic on pkt_end", 10636 .result = REJECT, 10637 .prog_type = BPF_PROG_TYPE_XDP, 10638 }, 10639 { 10640 "XDP pkt read, pkt_end mangling, bad access 2", 10641 .insns = { 10642 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10643 offsetof(struct xdp_md, data)), 10644 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10645 offsetof(struct xdp_md, data_end)), 10646 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10647 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10648 BPF_ALU64_IMM(BPF_SUB, BPF_REG_3, 8), 10649 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 10650 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10651 BPF_MOV64_IMM(BPF_REG_0, 0), 10652 BPF_EXIT_INSN(), 10653 }, 10654 .errstr = "R3 pointer arithmetic on pkt_end", 10655 .result = REJECT, 10656 .prog_type = BPF_PROG_TYPE_XDP, 10657 }, 10658 { 10659 "XDP pkt read, pkt_data' > pkt_end, good access", 10660 .insns = { 10661 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10662 offsetof(struct xdp_md, data)), 10663 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10664 offsetof(struct xdp_md, data_end)), 10665 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10666 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10667 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 10668 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10669 BPF_MOV64_IMM(BPF_REG_0, 0), 10670 BPF_EXIT_INSN(), 10671 }, 10672 .result = ACCEPT, 10673 .prog_type = BPF_PROG_TYPE_XDP, 10674 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10675 }, 10676 { 10677 "XDP pkt read, pkt_data' > pkt_end, bad access 1", 10678 .insns = { 10679 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10680 offsetof(struct xdp_md, data)), 10681 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10682 offsetof(struct xdp_md, data_end)), 10683 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10684 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10685 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 10686 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 10687 BPF_MOV64_IMM(BPF_REG_0, 0), 10688 BPF_EXIT_INSN(), 10689 }, 10690 .errstr = "R1 offset is outside of the packet", 10691 .result = REJECT, 10692 .prog_type = BPF_PROG_TYPE_XDP, 10693 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10694 }, 10695 { 10696 "XDP pkt read, pkt_data' > pkt_end, bad access 2", 10697 .insns = { 10698 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10699 offsetof(struct xdp_md, data)), 10700 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10701 offsetof(struct xdp_md, data_end)), 10702 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10703 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10704 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 0), 10705 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10706 BPF_MOV64_IMM(BPF_REG_0, 0), 10707 BPF_EXIT_INSN(), 10708 }, 10709 .errstr = "R1 offset is outside of the packet", 10710 .result = REJECT, 10711 .prog_type = BPF_PROG_TYPE_XDP, 10712 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10713 }, 10714 { 10715 "XDP pkt read, pkt_end > pkt_data', good access", 10716 .insns = { 10717 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10718 offsetof(struct xdp_md, data)), 10719 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10720 offsetof(struct xdp_md, data_end)), 10721 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10722 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10723 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 10724 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10725 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 10726 BPF_MOV64_IMM(BPF_REG_0, 0), 10727 BPF_EXIT_INSN(), 10728 }, 10729 .result = ACCEPT, 10730 .prog_type = BPF_PROG_TYPE_XDP, 10731 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10732 }, 10733 { 10734 "XDP pkt read, pkt_end > pkt_data', bad access 1", 10735 .insns = { 10736 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10737 offsetof(struct xdp_md, data)), 10738 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10739 offsetof(struct xdp_md, data_end)), 10740 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10741 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10742 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 10743 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10744 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10745 BPF_MOV64_IMM(BPF_REG_0, 0), 10746 BPF_EXIT_INSN(), 10747 }, 10748 .errstr = "R1 offset is outside of the packet", 10749 .result = REJECT, 10750 .prog_type = BPF_PROG_TYPE_XDP, 10751 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10752 }, 10753 { 10754 "XDP pkt read, pkt_end > pkt_data', bad access 2", 10755 .insns = { 10756 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10757 offsetof(struct xdp_md, data)), 10758 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10759 offsetof(struct xdp_md, data_end)), 10760 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10761 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10762 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 10763 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10764 BPF_MOV64_IMM(BPF_REG_0, 0), 10765 BPF_EXIT_INSN(), 10766 }, 10767 .errstr = "R1 offset is outside of the packet", 10768 .result = REJECT, 10769 .prog_type = BPF_PROG_TYPE_XDP, 10770 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10771 }, 10772 { 10773 "XDP pkt read, pkt_data' < pkt_end, good access", 10774 .insns = { 10775 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10776 offsetof(struct xdp_md, data)), 10777 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10778 offsetof(struct xdp_md, data_end)), 10779 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10780 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10781 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 10782 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10783 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 10784 BPF_MOV64_IMM(BPF_REG_0, 0), 10785 BPF_EXIT_INSN(), 10786 }, 10787 .result = ACCEPT, 10788 .prog_type = BPF_PROG_TYPE_XDP, 10789 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10790 }, 10791 { 10792 "XDP pkt read, pkt_data' < pkt_end, bad access 1", 10793 .insns = { 10794 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10795 offsetof(struct xdp_md, data)), 10796 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10797 offsetof(struct xdp_md, data_end)), 10798 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10799 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10800 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 10801 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10802 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10803 BPF_MOV64_IMM(BPF_REG_0, 0), 10804 BPF_EXIT_INSN(), 10805 }, 10806 .errstr = "R1 offset is outside of the packet", 10807 .result = REJECT, 10808 .prog_type = BPF_PROG_TYPE_XDP, 10809 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10810 }, 10811 { 10812 "XDP pkt read, pkt_data' < pkt_end, bad access 2", 10813 .insns = { 10814 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10815 offsetof(struct xdp_md, data)), 10816 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10817 offsetof(struct xdp_md, data_end)), 10818 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10819 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10820 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 10821 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10822 BPF_MOV64_IMM(BPF_REG_0, 0), 10823 BPF_EXIT_INSN(), 10824 }, 10825 .errstr = "R1 offset is outside of the packet", 10826 .result = REJECT, 10827 .prog_type = BPF_PROG_TYPE_XDP, 10828 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10829 }, 10830 { 10831 "XDP pkt read, pkt_end < pkt_data', good access", 10832 .insns = { 10833 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10834 offsetof(struct xdp_md, data)), 10835 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10836 offsetof(struct xdp_md, data_end)), 10837 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10838 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10839 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1), 10840 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10841 BPF_MOV64_IMM(BPF_REG_0, 0), 10842 BPF_EXIT_INSN(), 10843 }, 10844 .result = ACCEPT, 10845 .prog_type = BPF_PROG_TYPE_XDP, 10846 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10847 }, 10848 { 10849 "XDP pkt read, pkt_end < pkt_data', bad access 1", 10850 .insns = { 10851 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10852 offsetof(struct xdp_md, data)), 10853 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10854 offsetof(struct xdp_md, data_end)), 10855 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10856 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10857 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1), 10858 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 10859 BPF_MOV64_IMM(BPF_REG_0, 0), 10860 BPF_EXIT_INSN(), 10861 }, 10862 .errstr = "R1 offset is outside of the packet", 10863 .result = REJECT, 10864 .prog_type = BPF_PROG_TYPE_XDP, 10865 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10866 }, 10867 { 10868 "XDP pkt read, pkt_end < pkt_data', bad access 2", 10869 .insns = { 10870 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10871 offsetof(struct xdp_md, data)), 10872 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10873 offsetof(struct xdp_md, data_end)), 10874 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10875 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10876 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 0), 10877 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10878 BPF_MOV64_IMM(BPF_REG_0, 0), 10879 BPF_EXIT_INSN(), 10880 }, 10881 .errstr = "R1 offset is outside of the packet", 10882 .result = REJECT, 10883 .prog_type = BPF_PROG_TYPE_XDP, 10884 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10885 }, 10886 { 10887 "XDP pkt read, pkt_data' >= pkt_end, good access", 10888 .insns = { 10889 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10890 offsetof(struct xdp_md, data)), 10891 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10892 offsetof(struct xdp_md, data_end)), 10893 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10894 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10895 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), 10896 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 10897 BPF_MOV64_IMM(BPF_REG_0, 0), 10898 BPF_EXIT_INSN(), 10899 }, 10900 .result = ACCEPT, 10901 .prog_type = BPF_PROG_TYPE_XDP, 10902 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10903 }, 10904 { 10905 "XDP pkt read, pkt_data' >= pkt_end, bad access 1", 10906 .insns = { 10907 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10908 offsetof(struct xdp_md, data)), 10909 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10910 offsetof(struct xdp_md, data_end)), 10911 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10912 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10913 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), 10914 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10915 BPF_MOV64_IMM(BPF_REG_0, 0), 10916 BPF_EXIT_INSN(), 10917 }, 10918 .errstr = "R1 offset is outside of the packet", 10919 .result = REJECT, 10920 .prog_type = BPF_PROG_TYPE_XDP, 10921 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10922 }, 10923 { 10924 "XDP pkt read, pkt_data' >= pkt_end, bad access 2", 10925 .insns = { 10926 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10927 offsetof(struct xdp_md, data)), 10928 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10929 offsetof(struct xdp_md, data_end)), 10930 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10931 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10932 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 0), 10933 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 10934 BPF_MOV64_IMM(BPF_REG_0, 0), 10935 BPF_EXIT_INSN(), 10936 }, 10937 .errstr = "R1 offset is outside of the packet", 10938 .result = REJECT, 10939 .prog_type = BPF_PROG_TYPE_XDP, 10940 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10941 }, 10942 { 10943 "XDP pkt read, pkt_end >= pkt_data', good access", 10944 .insns = { 10945 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10946 offsetof(struct xdp_md, data)), 10947 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10948 offsetof(struct xdp_md, data_end)), 10949 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10950 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10951 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 10952 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10953 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10954 BPF_MOV64_IMM(BPF_REG_0, 0), 10955 BPF_EXIT_INSN(), 10956 }, 10957 .result = ACCEPT, 10958 .prog_type = BPF_PROG_TYPE_XDP, 10959 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10960 }, 10961 { 10962 "XDP pkt read, pkt_end >= pkt_data', bad access 1", 10963 .insns = { 10964 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10965 offsetof(struct xdp_md, data)), 10966 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10967 offsetof(struct xdp_md, data_end)), 10968 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10969 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10970 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 10971 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10972 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 10973 BPF_MOV64_IMM(BPF_REG_0, 0), 10974 BPF_EXIT_INSN(), 10975 }, 10976 .errstr = "R1 offset is outside of the packet", 10977 .result = REJECT, 10978 .prog_type = BPF_PROG_TYPE_XDP, 10979 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10980 }, 10981 { 10982 "XDP pkt read, pkt_end >= pkt_data', bad access 2", 10983 .insns = { 10984 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10985 offsetof(struct xdp_md, data)), 10986 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10987 offsetof(struct xdp_md, data_end)), 10988 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10989 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10990 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 10991 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10992 BPF_MOV64_IMM(BPF_REG_0, 0), 10993 BPF_EXIT_INSN(), 10994 }, 10995 .errstr = "R1 offset is outside of the packet", 10996 .result = REJECT, 10997 .prog_type = BPF_PROG_TYPE_XDP, 10998 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10999 }, 11000 { 11001 "XDP pkt read, pkt_data' <= pkt_end, good access", 11002 .insns = { 11003 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11004 offsetof(struct xdp_md, data)), 11005 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11006 offsetof(struct xdp_md, data_end)), 11007 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11008 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11009 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 11010 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 11011 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11012 BPF_MOV64_IMM(BPF_REG_0, 0), 11013 BPF_EXIT_INSN(), 11014 }, 11015 .result = ACCEPT, 11016 .prog_type = BPF_PROG_TYPE_XDP, 11017 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11018 }, 11019 { 11020 "XDP pkt read, pkt_data' <= pkt_end, bad access 1", 11021 .insns = { 11022 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11023 offsetof(struct xdp_md, data)), 11024 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11025 offsetof(struct xdp_md, data_end)), 11026 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11027 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11028 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 11029 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 11030 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 11031 BPF_MOV64_IMM(BPF_REG_0, 0), 11032 BPF_EXIT_INSN(), 11033 }, 11034 .errstr = "R1 offset is outside of the packet", 11035 .result = REJECT, 11036 .prog_type = BPF_PROG_TYPE_XDP, 11037 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11038 }, 11039 { 11040 "XDP pkt read, pkt_data' <= pkt_end, bad access 2", 11041 .insns = { 11042 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11043 offsetof(struct xdp_md, data)), 11044 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11045 offsetof(struct xdp_md, data_end)), 11046 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11047 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11048 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 11049 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11050 BPF_MOV64_IMM(BPF_REG_0, 0), 11051 BPF_EXIT_INSN(), 11052 }, 11053 .errstr = "R1 offset is outside of the packet", 11054 .result = REJECT, 11055 .prog_type = BPF_PROG_TYPE_XDP, 11056 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11057 }, 11058 { 11059 "XDP pkt read, pkt_end <= pkt_data', good access", 11060 .insns = { 11061 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11062 offsetof(struct xdp_md, data)), 11063 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11064 offsetof(struct xdp_md, data_end)), 11065 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11066 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11067 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), 11068 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 11069 BPF_MOV64_IMM(BPF_REG_0, 0), 11070 BPF_EXIT_INSN(), 11071 }, 11072 .result = ACCEPT, 11073 .prog_type = BPF_PROG_TYPE_XDP, 11074 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11075 }, 11076 { 11077 "XDP pkt read, pkt_end <= pkt_data', bad access 1", 11078 .insns = { 11079 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11080 offsetof(struct xdp_md, data)), 11081 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11082 offsetof(struct xdp_md, data_end)), 11083 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11084 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11085 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), 11086 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11087 BPF_MOV64_IMM(BPF_REG_0, 0), 11088 BPF_EXIT_INSN(), 11089 }, 11090 .errstr = "R1 offset is outside of the packet", 11091 .result = REJECT, 11092 .prog_type = BPF_PROG_TYPE_XDP, 11093 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11094 }, 11095 { 11096 "XDP pkt read, pkt_end <= pkt_data', bad access 2", 11097 .insns = { 11098 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11099 offsetof(struct xdp_md, data)), 11100 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11101 offsetof(struct xdp_md, data_end)), 11102 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11103 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11104 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 0), 11105 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 11106 BPF_MOV64_IMM(BPF_REG_0, 0), 11107 BPF_EXIT_INSN(), 11108 }, 11109 .errstr = "R1 offset is outside of the packet", 11110 .result = REJECT, 11111 .prog_type = BPF_PROG_TYPE_XDP, 11112 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11113 }, 11114 { 11115 "XDP pkt read, pkt_meta' > pkt_data, good access", 11116 .insns = { 11117 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11118 offsetof(struct xdp_md, data_meta)), 11119 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11120 offsetof(struct xdp_md, data)), 11121 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11122 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11123 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 11124 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11125 BPF_MOV64_IMM(BPF_REG_0, 0), 11126 BPF_EXIT_INSN(), 11127 }, 11128 .result = ACCEPT, 11129 .prog_type = BPF_PROG_TYPE_XDP, 11130 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11131 }, 11132 { 11133 "XDP pkt read, pkt_meta' > pkt_data, bad access 1", 11134 .insns = { 11135 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11136 offsetof(struct xdp_md, data_meta)), 11137 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11138 offsetof(struct xdp_md, data)), 11139 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11140 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11141 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 11142 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 11143 BPF_MOV64_IMM(BPF_REG_0, 0), 11144 BPF_EXIT_INSN(), 11145 }, 11146 .errstr = "R1 offset is outside of the packet", 11147 .result = REJECT, 11148 .prog_type = BPF_PROG_TYPE_XDP, 11149 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11150 }, 11151 { 11152 "XDP pkt read, pkt_meta' > pkt_data, bad access 2", 11153 .insns = { 11154 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11155 offsetof(struct xdp_md, data_meta)), 11156 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11157 offsetof(struct xdp_md, data)), 11158 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11159 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11160 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 0), 11161 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11162 BPF_MOV64_IMM(BPF_REG_0, 0), 11163 BPF_EXIT_INSN(), 11164 }, 11165 .errstr = "R1 offset is outside of the packet", 11166 .result = REJECT, 11167 .prog_type = BPF_PROG_TYPE_XDP, 11168 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11169 }, 11170 { 11171 "XDP pkt read, pkt_data > pkt_meta', good access", 11172 .insns = { 11173 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11174 offsetof(struct xdp_md, data_meta)), 11175 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11176 offsetof(struct xdp_md, data)), 11177 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11178 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11179 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 11180 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 11181 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 11182 BPF_MOV64_IMM(BPF_REG_0, 0), 11183 BPF_EXIT_INSN(), 11184 }, 11185 .result = ACCEPT, 11186 .prog_type = BPF_PROG_TYPE_XDP, 11187 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11188 }, 11189 { 11190 "XDP pkt read, pkt_data > pkt_meta', bad access 1", 11191 .insns = { 11192 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11193 offsetof(struct xdp_md, data_meta)), 11194 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11195 offsetof(struct xdp_md, data)), 11196 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11197 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11198 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 11199 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 11200 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11201 BPF_MOV64_IMM(BPF_REG_0, 0), 11202 BPF_EXIT_INSN(), 11203 }, 11204 .errstr = "R1 offset is outside of the packet", 11205 .result = REJECT, 11206 .prog_type = BPF_PROG_TYPE_XDP, 11207 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11208 }, 11209 { 11210 "XDP pkt read, pkt_data > pkt_meta', bad access 2", 11211 .insns = { 11212 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11213 offsetof(struct xdp_md, data_meta)), 11214 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11215 offsetof(struct xdp_md, data)), 11216 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11217 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11218 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 11219 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11220 BPF_MOV64_IMM(BPF_REG_0, 0), 11221 BPF_EXIT_INSN(), 11222 }, 11223 .errstr = "R1 offset is outside of the packet", 11224 .result = REJECT, 11225 .prog_type = BPF_PROG_TYPE_XDP, 11226 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11227 }, 11228 { 11229 "XDP pkt read, pkt_meta' < pkt_data, good access", 11230 .insns = { 11231 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11232 offsetof(struct xdp_md, data_meta)), 11233 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11234 offsetof(struct xdp_md, data)), 11235 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11236 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11237 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 11238 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 11239 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 11240 BPF_MOV64_IMM(BPF_REG_0, 0), 11241 BPF_EXIT_INSN(), 11242 }, 11243 .result = ACCEPT, 11244 .prog_type = BPF_PROG_TYPE_XDP, 11245 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11246 }, 11247 { 11248 "XDP pkt read, pkt_meta' < pkt_data, bad access 1", 11249 .insns = { 11250 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11251 offsetof(struct xdp_md, data_meta)), 11252 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11253 offsetof(struct xdp_md, data)), 11254 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11255 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11256 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 11257 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 11258 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11259 BPF_MOV64_IMM(BPF_REG_0, 0), 11260 BPF_EXIT_INSN(), 11261 }, 11262 .errstr = "R1 offset is outside of the packet", 11263 .result = REJECT, 11264 .prog_type = BPF_PROG_TYPE_XDP, 11265 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11266 }, 11267 { 11268 "XDP pkt read, pkt_meta' < pkt_data, bad access 2", 11269 .insns = { 11270 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11271 offsetof(struct xdp_md, data_meta)), 11272 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11273 offsetof(struct xdp_md, data)), 11274 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11275 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11276 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 11277 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11278 BPF_MOV64_IMM(BPF_REG_0, 0), 11279 BPF_EXIT_INSN(), 11280 }, 11281 .errstr = "R1 offset is outside of the packet", 11282 .result = REJECT, 11283 .prog_type = BPF_PROG_TYPE_XDP, 11284 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11285 }, 11286 { 11287 "XDP pkt read, pkt_data < pkt_meta', good access", 11288 .insns = { 11289 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11290 offsetof(struct xdp_md, data_meta)), 11291 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11292 offsetof(struct xdp_md, data)), 11293 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11294 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11295 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1), 11296 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11297 BPF_MOV64_IMM(BPF_REG_0, 0), 11298 BPF_EXIT_INSN(), 11299 }, 11300 .result = ACCEPT, 11301 .prog_type = BPF_PROG_TYPE_XDP, 11302 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11303 }, 11304 { 11305 "XDP pkt read, pkt_data < pkt_meta', bad access 1", 11306 .insns = { 11307 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11308 offsetof(struct xdp_md, data_meta)), 11309 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11310 offsetof(struct xdp_md, data)), 11311 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11312 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11313 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1), 11314 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 11315 BPF_MOV64_IMM(BPF_REG_0, 0), 11316 BPF_EXIT_INSN(), 11317 }, 11318 .errstr = "R1 offset is outside of the packet", 11319 .result = REJECT, 11320 .prog_type = BPF_PROG_TYPE_XDP, 11321 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11322 }, 11323 { 11324 "XDP pkt read, pkt_data < pkt_meta', bad access 2", 11325 .insns = { 11326 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11327 offsetof(struct xdp_md, data_meta)), 11328 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11329 offsetof(struct xdp_md, data)), 11330 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11331 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11332 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 0), 11333 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11334 BPF_MOV64_IMM(BPF_REG_0, 0), 11335 BPF_EXIT_INSN(), 11336 }, 11337 .errstr = "R1 offset is outside of the packet", 11338 .result = REJECT, 11339 .prog_type = BPF_PROG_TYPE_XDP, 11340 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11341 }, 11342 { 11343 "XDP pkt read, pkt_meta' >= pkt_data, good access", 11344 .insns = { 11345 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11346 offsetof(struct xdp_md, data_meta)), 11347 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11348 offsetof(struct xdp_md, data)), 11349 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11350 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11351 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), 11352 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 11353 BPF_MOV64_IMM(BPF_REG_0, 0), 11354 BPF_EXIT_INSN(), 11355 }, 11356 .result = ACCEPT, 11357 .prog_type = BPF_PROG_TYPE_XDP, 11358 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11359 }, 11360 { 11361 "XDP pkt read, pkt_meta' >= pkt_data, bad access 1", 11362 .insns = { 11363 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11364 offsetof(struct xdp_md, data_meta)), 11365 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11366 offsetof(struct xdp_md, data)), 11367 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11368 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11369 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), 11370 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11371 BPF_MOV64_IMM(BPF_REG_0, 0), 11372 BPF_EXIT_INSN(), 11373 }, 11374 .errstr = "R1 offset is outside of the packet", 11375 .result = REJECT, 11376 .prog_type = BPF_PROG_TYPE_XDP, 11377 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11378 }, 11379 { 11380 "XDP pkt read, pkt_meta' >= pkt_data, bad access 2", 11381 .insns = { 11382 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11383 offsetof(struct xdp_md, data_meta)), 11384 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11385 offsetof(struct xdp_md, data)), 11386 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11387 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11388 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 0), 11389 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 11390 BPF_MOV64_IMM(BPF_REG_0, 0), 11391 BPF_EXIT_INSN(), 11392 }, 11393 .errstr = "R1 offset is outside of the packet", 11394 .result = REJECT, 11395 .prog_type = BPF_PROG_TYPE_XDP, 11396 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11397 }, 11398 { 11399 "XDP pkt read, pkt_data >= pkt_meta', good access", 11400 .insns = { 11401 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11402 offsetof(struct xdp_md, data_meta)), 11403 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11404 offsetof(struct xdp_md, data)), 11405 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11406 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11407 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 11408 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 11409 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11410 BPF_MOV64_IMM(BPF_REG_0, 0), 11411 BPF_EXIT_INSN(), 11412 }, 11413 .result = ACCEPT, 11414 .prog_type = BPF_PROG_TYPE_XDP, 11415 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11416 }, 11417 { 11418 "XDP pkt read, pkt_data >= pkt_meta', bad access 1", 11419 .insns = { 11420 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11421 offsetof(struct xdp_md, data_meta)), 11422 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11423 offsetof(struct xdp_md, data)), 11424 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11425 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11426 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 11427 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 11428 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 11429 BPF_MOV64_IMM(BPF_REG_0, 0), 11430 BPF_EXIT_INSN(), 11431 }, 11432 .errstr = "R1 offset is outside of the packet", 11433 .result = REJECT, 11434 .prog_type = BPF_PROG_TYPE_XDP, 11435 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11436 }, 11437 { 11438 "XDP pkt read, pkt_data >= pkt_meta', bad access 2", 11439 .insns = { 11440 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11441 offsetof(struct xdp_md, data_meta)), 11442 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11443 offsetof(struct xdp_md, data)), 11444 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11445 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11446 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 11447 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11448 BPF_MOV64_IMM(BPF_REG_0, 0), 11449 BPF_EXIT_INSN(), 11450 }, 11451 .errstr = "R1 offset is outside of the packet", 11452 .result = REJECT, 11453 .prog_type = BPF_PROG_TYPE_XDP, 11454 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11455 }, 11456 { 11457 "XDP pkt read, pkt_meta' <= pkt_data, good access", 11458 .insns = { 11459 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11460 offsetof(struct xdp_md, data_meta)), 11461 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11462 offsetof(struct xdp_md, data)), 11463 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11464 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11465 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 11466 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 11467 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11468 BPF_MOV64_IMM(BPF_REG_0, 0), 11469 BPF_EXIT_INSN(), 11470 }, 11471 .result = ACCEPT, 11472 .prog_type = BPF_PROG_TYPE_XDP, 11473 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11474 }, 11475 { 11476 "XDP pkt read, pkt_meta' <= pkt_data, bad access 1", 11477 .insns = { 11478 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11479 offsetof(struct xdp_md, data_meta)), 11480 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11481 offsetof(struct xdp_md, data)), 11482 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11483 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11484 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 11485 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 11486 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 11487 BPF_MOV64_IMM(BPF_REG_0, 0), 11488 BPF_EXIT_INSN(), 11489 }, 11490 .errstr = "R1 offset is outside of the packet", 11491 .result = REJECT, 11492 .prog_type = BPF_PROG_TYPE_XDP, 11493 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11494 }, 11495 { 11496 "XDP pkt read, pkt_meta' <= pkt_data, bad access 2", 11497 .insns = { 11498 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11499 offsetof(struct xdp_md, data_meta)), 11500 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11501 offsetof(struct xdp_md, data)), 11502 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11503 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11504 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 11505 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11506 BPF_MOV64_IMM(BPF_REG_0, 0), 11507 BPF_EXIT_INSN(), 11508 }, 11509 .errstr = "R1 offset is outside of the packet", 11510 .result = REJECT, 11511 .prog_type = BPF_PROG_TYPE_XDP, 11512 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11513 }, 11514 { 11515 "XDP pkt read, pkt_data <= pkt_meta', good access", 11516 .insns = { 11517 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11518 offsetof(struct xdp_md, data_meta)), 11519 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11520 offsetof(struct xdp_md, data)), 11521 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11522 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11523 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), 11524 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 11525 BPF_MOV64_IMM(BPF_REG_0, 0), 11526 BPF_EXIT_INSN(), 11527 }, 11528 .result = ACCEPT, 11529 .prog_type = BPF_PROG_TYPE_XDP, 11530 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11531 }, 11532 { 11533 "XDP pkt read, pkt_data <= pkt_meta', bad access 1", 11534 .insns = { 11535 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11536 offsetof(struct xdp_md, data_meta)), 11537 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11538 offsetof(struct xdp_md, data)), 11539 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11540 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11541 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), 11542 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11543 BPF_MOV64_IMM(BPF_REG_0, 0), 11544 BPF_EXIT_INSN(), 11545 }, 11546 .errstr = "R1 offset is outside of the packet", 11547 .result = REJECT, 11548 .prog_type = BPF_PROG_TYPE_XDP, 11549 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11550 }, 11551 { 11552 "XDP pkt read, pkt_data <= pkt_meta', bad access 2", 11553 .insns = { 11554 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11555 offsetof(struct xdp_md, data_meta)), 11556 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11557 offsetof(struct xdp_md, data)), 11558 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11559 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11560 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 0), 11561 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 11562 BPF_MOV64_IMM(BPF_REG_0, 0), 11563 BPF_EXIT_INSN(), 11564 }, 11565 .errstr = "R1 offset is outside of the packet", 11566 .result = REJECT, 11567 .prog_type = BPF_PROG_TYPE_XDP, 11568 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11569 }, 11570 { 11571 "check deducing bounds from const, 1", 11572 .insns = { 11573 BPF_MOV64_IMM(BPF_REG_0, 1), 11574 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 1, 0), 11575 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 11576 BPF_EXIT_INSN(), 11577 }, 11578 .result = REJECT, 11579 .errstr = "R0 tried to subtract pointer from scalar", 11580 }, 11581 { 11582 "check deducing bounds from const, 2", 11583 .insns = { 11584 BPF_MOV64_IMM(BPF_REG_0, 1), 11585 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 1, 1), 11586 BPF_EXIT_INSN(), 11587 BPF_JMP_IMM(BPF_JSLE, BPF_REG_0, 1, 1), 11588 BPF_EXIT_INSN(), 11589 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0), 11590 BPF_EXIT_INSN(), 11591 }, 11592 .result = ACCEPT, 11593 .retval = 1, 11594 }, 11595 { 11596 "check deducing bounds from const, 3", 11597 .insns = { 11598 BPF_MOV64_IMM(BPF_REG_0, 0), 11599 BPF_JMP_IMM(BPF_JSLE, BPF_REG_0, 0, 0), 11600 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 11601 BPF_EXIT_INSN(), 11602 }, 11603 .result = REJECT, 11604 .errstr = "R0 tried to subtract pointer from scalar", 11605 }, 11606 { 11607 "check deducing bounds from const, 4", 11608 .insns = { 11609 BPF_MOV64_IMM(BPF_REG_0, 0), 11610 BPF_JMP_IMM(BPF_JSLE, BPF_REG_0, 0, 1), 11611 BPF_EXIT_INSN(), 11612 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 1), 11613 BPF_EXIT_INSN(), 11614 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0), 11615 BPF_EXIT_INSN(), 11616 }, 11617 .result = ACCEPT, 11618 }, 11619 { 11620 "check deducing bounds from const, 5", 11621 .insns = { 11622 BPF_MOV64_IMM(BPF_REG_0, 0), 11623 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 1, 1), 11624 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 11625 BPF_EXIT_INSN(), 11626 }, 11627 .result = REJECT, 11628 .errstr = "R0 tried to subtract pointer from scalar", 11629 }, 11630 { 11631 "check deducing bounds from const, 6", 11632 .insns = { 11633 BPF_MOV64_IMM(BPF_REG_0, 0), 11634 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 1), 11635 BPF_EXIT_INSN(), 11636 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 11637 BPF_EXIT_INSN(), 11638 }, 11639 .result = REJECT, 11640 .errstr = "R0 tried to subtract pointer from scalar", 11641 }, 11642 { 11643 "check deducing bounds from const, 7", 11644 .insns = { 11645 BPF_MOV64_IMM(BPF_REG_0, ~0), 11646 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 0), 11647 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0), 11648 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11649 offsetof(struct __sk_buff, mark)), 11650 BPF_EXIT_INSN(), 11651 }, 11652 .result = REJECT, 11653 .errstr = "dereference of modified ctx ptr", 11654 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11655 }, 11656 { 11657 "check deducing bounds from const, 8", 11658 .insns = { 11659 BPF_MOV64_IMM(BPF_REG_0, ~0), 11660 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 1), 11661 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), 11662 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11663 offsetof(struct __sk_buff, mark)), 11664 BPF_EXIT_INSN(), 11665 }, 11666 .result = REJECT, 11667 .errstr = "dereference of modified ctx ptr", 11668 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11669 }, 11670 { 11671 "check deducing bounds from const, 9", 11672 .insns = { 11673 BPF_MOV64_IMM(BPF_REG_0, 0), 11674 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 0), 11675 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 11676 BPF_EXIT_INSN(), 11677 }, 11678 .result = REJECT, 11679 .errstr = "R0 tried to subtract pointer from scalar", 11680 }, 11681 { 11682 "check deducing bounds from const, 10", 11683 .insns = { 11684 BPF_MOV64_IMM(BPF_REG_0, 0), 11685 BPF_JMP_IMM(BPF_JSLE, BPF_REG_0, 0, 0), 11686 /* Marks reg as unknown. */ 11687 BPF_ALU64_IMM(BPF_NEG, BPF_REG_0, 0), 11688 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 11689 BPF_EXIT_INSN(), 11690 }, 11691 .result = REJECT, 11692 .errstr = "math between ctx pointer and register with unbounded min value is not allowed", 11693 }, 11694 { 11695 "bpf_exit with invalid return code. test1", 11696 .insns = { 11697 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 11698 BPF_EXIT_INSN(), 11699 }, 11700 .errstr = "R0 has value (0x0; 0xffffffff)", 11701 .result = REJECT, 11702 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 11703 }, 11704 { 11705 "bpf_exit with invalid return code. test2", 11706 .insns = { 11707 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 11708 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 11709 BPF_EXIT_INSN(), 11710 }, 11711 .result = ACCEPT, 11712 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 11713 }, 11714 { 11715 "bpf_exit with invalid return code. test3", 11716 .insns = { 11717 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 11718 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 3), 11719 BPF_EXIT_INSN(), 11720 }, 11721 .errstr = "R0 has value (0x0; 0x3)", 11722 .result = REJECT, 11723 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 11724 }, 11725 { 11726 "bpf_exit with invalid return code. test4", 11727 .insns = { 11728 BPF_MOV64_IMM(BPF_REG_0, 1), 11729 BPF_EXIT_INSN(), 11730 }, 11731 .result = ACCEPT, 11732 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 11733 }, 11734 { 11735 "bpf_exit with invalid return code. test5", 11736 .insns = { 11737 BPF_MOV64_IMM(BPF_REG_0, 2), 11738 BPF_EXIT_INSN(), 11739 }, 11740 .errstr = "R0 has value (0x2; 0x0)", 11741 .result = REJECT, 11742 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 11743 }, 11744 { 11745 "bpf_exit with invalid return code. test6", 11746 .insns = { 11747 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 11748 BPF_EXIT_INSN(), 11749 }, 11750 .errstr = "R0 is not a known value (ctx)", 11751 .result = REJECT, 11752 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 11753 }, 11754 { 11755 "bpf_exit with invalid return code. test7", 11756 .insns = { 11757 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 11758 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4), 11759 BPF_ALU64_REG(BPF_MUL, BPF_REG_0, BPF_REG_2), 11760 BPF_EXIT_INSN(), 11761 }, 11762 .errstr = "R0 has unknown scalar value", 11763 .result = REJECT, 11764 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 11765 }, 11766 { 11767 "calls: basic sanity", 11768 .insns = { 11769 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 11770 BPF_MOV64_IMM(BPF_REG_0, 1), 11771 BPF_EXIT_INSN(), 11772 BPF_MOV64_IMM(BPF_REG_0, 2), 11773 BPF_EXIT_INSN(), 11774 }, 11775 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11776 .result = ACCEPT, 11777 }, 11778 { 11779 "calls: not on unpriviledged", 11780 .insns = { 11781 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 11782 BPF_MOV64_IMM(BPF_REG_0, 1), 11783 BPF_EXIT_INSN(), 11784 BPF_MOV64_IMM(BPF_REG_0, 2), 11785 BPF_EXIT_INSN(), 11786 }, 11787 .errstr_unpriv = "function calls to other bpf functions are allowed for root only", 11788 .result_unpriv = REJECT, 11789 .result = ACCEPT, 11790 .retval = 1, 11791 }, 11792 { 11793 "calls: div by 0 in subprog", 11794 .insns = { 11795 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11796 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8), 11797 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 11798 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 11799 offsetof(struct __sk_buff, data_end)), 11800 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 11801 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8), 11802 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1), 11803 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 11804 BPF_MOV64_IMM(BPF_REG_0, 1), 11805 BPF_EXIT_INSN(), 11806 BPF_MOV32_IMM(BPF_REG_2, 0), 11807 BPF_MOV32_IMM(BPF_REG_3, 1), 11808 BPF_ALU32_REG(BPF_DIV, BPF_REG_3, BPF_REG_2), 11809 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11810 offsetof(struct __sk_buff, data)), 11811 BPF_EXIT_INSN(), 11812 }, 11813 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11814 .result = ACCEPT, 11815 .retval = 1, 11816 }, 11817 { 11818 "calls: multiple ret types in subprog 1", 11819 .insns = { 11820 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11821 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8), 11822 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 11823 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 11824 offsetof(struct __sk_buff, data_end)), 11825 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 11826 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8), 11827 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1), 11828 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 11829 BPF_MOV64_IMM(BPF_REG_0, 1), 11830 BPF_EXIT_INSN(), 11831 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11832 offsetof(struct __sk_buff, data)), 11833 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 11834 BPF_MOV32_IMM(BPF_REG_0, 42), 11835 BPF_EXIT_INSN(), 11836 }, 11837 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11838 .result = REJECT, 11839 .errstr = "R0 invalid mem access 'inv'", 11840 }, 11841 { 11842 "calls: multiple ret types in subprog 2", 11843 .insns = { 11844 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11845 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8), 11846 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 11847 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 11848 offsetof(struct __sk_buff, data_end)), 11849 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 11850 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8), 11851 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1), 11852 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 11853 BPF_MOV64_IMM(BPF_REG_0, 1), 11854 BPF_EXIT_INSN(), 11855 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11856 offsetof(struct __sk_buff, data)), 11857 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11858 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 9), 11859 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 11860 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11861 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 11862 BPF_LD_MAP_FD(BPF_REG_1, 0), 11863 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 11864 BPF_FUNC_map_lookup_elem), 11865 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 11866 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_6, 11867 offsetof(struct __sk_buff, data)), 11868 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 64), 11869 BPF_EXIT_INSN(), 11870 }, 11871 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11872 .fixup_map_hash_8b = { 16 }, 11873 .result = REJECT, 11874 .errstr = "R0 min value is outside of the array range", 11875 }, 11876 { 11877 "calls: overlapping caller/callee", 11878 .insns = { 11879 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 0), 11880 BPF_MOV64_IMM(BPF_REG_0, 1), 11881 BPF_EXIT_INSN(), 11882 }, 11883 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11884 .errstr = "last insn is not an exit or jmp", 11885 .result = REJECT, 11886 }, 11887 { 11888 "calls: wrong recursive calls", 11889 .insns = { 11890 BPF_JMP_IMM(BPF_JA, 0, 0, 4), 11891 BPF_JMP_IMM(BPF_JA, 0, 0, 4), 11892 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -2), 11893 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -2), 11894 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -2), 11895 BPF_MOV64_IMM(BPF_REG_0, 1), 11896 BPF_EXIT_INSN(), 11897 }, 11898 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11899 .errstr = "jump out of range", 11900 .result = REJECT, 11901 }, 11902 { 11903 "calls: wrong src reg", 11904 .insns = { 11905 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 2, 0, 0), 11906 BPF_MOV64_IMM(BPF_REG_0, 1), 11907 BPF_EXIT_INSN(), 11908 }, 11909 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11910 .errstr = "BPF_CALL uses reserved fields", 11911 .result = REJECT, 11912 }, 11913 { 11914 "calls: wrong off value", 11915 .insns = { 11916 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, -1, 2), 11917 BPF_MOV64_IMM(BPF_REG_0, 1), 11918 BPF_EXIT_INSN(), 11919 BPF_MOV64_IMM(BPF_REG_0, 2), 11920 BPF_EXIT_INSN(), 11921 }, 11922 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11923 .errstr = "BPF_CALL uses reserved fields", 11924 .result = REJECT, 11925 }, 11926 { 11927 "calls: jump back loop", 11928 .insns = { 11929 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -1), 11930 BPF_MOV64_IMM(BPF_REG_0, 1), 11931 BPF_EXIT_INSN(), 11932 }, 11933 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11934 .errstr = "back-edge from insn 0 to 0", 11935 .result = REJECT, 11936 }, 11937 { 11938 "calls: conditional call", 11939 .insns = { 11940 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11941 offsetof(struct __sk_buff, mark)), 11942 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 11943 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 11944 BPF_MOV64_IMM(BPF_REG_0, 1), 11945 BPF_EXIT_INSN(), 11946 BPF_MOV64_IMM(BPF_REG_0, 2), 11947 BPF_EXIT_INSN(), 11948 }, 11949 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11950 .errstr = "jump out of range", 11951 .result = REJECT, 11952 }, 11953 { 11954 "calls: conditional call 2", 11955 .insns = { 11956 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11957 offsetof(struct __sk_buff, mark)), 11958 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 11959 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 11960 BPF_MOV64_IMM(BPF_REG_0, 1), 11961 BPF_EXIT_INSN(), 11962 BPF_MOV64_IMM(BPF_REG_0, 2), 11963 BPF_EXIT_INSN(), 11964 BPF_MOV64_IMM(BPF_REG_0, 3), 11965 BPF_EXIT_INSN(), 11966 }, 11967 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11968 .result = ACCEPT, 11969 }, 11970 { 11971 "calls: conditional call 3", 11972 .insns = { 11973 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11974 offsetof(struct __sk_buff, mark)), 11975 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 11976 BPF_JMP_IMM(BPF_JA, 0, 0, 4), 11977 BPF_MOV64_IMM(BPF_REG_0, 1), 11978 BPF_EXIT_INSN(), 11979 BPF_MOV64_IMM(BPF_REG_0, 1), 11980 BPF_JMP_IMM(BPF_JA, 0, 0, -6), 11981 BPF_MOV64_IMM(BPF_REG_0, 3), 11982 BPF_JMP_IMM(BPF_JA, 0, 0, -6), 11983 }, 11984 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11985 .errstr = "back-edge from insn", 11986 .result = REJECT, 11987 }, 11988 { 11989 "calls: conditional call 4", 11990 .insns = { 11991 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11992 offsetof(struct __sk_buff, mark)), 11993 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 11994 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 11995 BPF_MOV64_IMM(BPF_REG_0, 1), 11996 BPF_EXIT_INSN(), 11997 BPF_MOV64_IMM(BPF_REG_0, 1), 11998 BPF_JMP_IMM(BPF_JA, 0, 0, -5), 11999 BPF_MOV64_IMM(BPF_REG_0, 3), 12000 BPF_EXIT_INSN(), 12001 }, 12002 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12003 .result = ACCEPT, 12004 }, 12005 { 12006 "calls: conditional call 5", 12007 .insns = { 12008 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 12009 offsetof(struct __sk_buff, mark)), 12010 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 12011 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 12012 BPF_MOV64_IMM(BPF_REG_0, 1), 12013 BPF_EXIT_INSN(), 12014 BPF_MOV64_IMM(BPF_REG_0, 1), 12015 BPF_JMP_IMM(BPF_JA, 0, 0, -6), 12016 BPF_MOV64_IMM(BPF_REG_0, 3), 12017 BPF_EXIT_INSN(), 12018 }, 12019 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12020 .errstr = "back-edge from insn", 12021 .result = REJECT, 12022 }, 12023 { 12024 "calls: conditional call 6", 12025 .insns = { 12026 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 12027 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, -2), 12028 BPF_EXIT_INSN(), 12029 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 12030 offsetof(struct __sk_buff, mark)), 12031 BPF_EXIT_INSN(), 12032 }, 12033 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12034 .errstr = "back-edge from insn", 12035 .result = REJECT, 12036 }, 12037 { 12038 "calls: using r0 returned by callee", 12039 .insns = { 12040 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12041 BPF_EXIT_INSN(), 12042 BPF_MOV64_IMM(BPF_REG_0, 2), 12043 BPF_EXIT_INSN(), 12044 }, 12045 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12046 .result = ACCEPT, 12047 }, 12048 { 12049 "calls: using uninit r0 from callee", 12050 .insns = { 12051 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12052 BPF_EXIT_INSN(), 12053 BPF_EXIT_INSN(), 12054 }, 12055 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12056 .errstr = "!read_ok", 12057 .result = REJECT, 12058 }, 12059 { 12060 "calls: callee is using r1", 12061 .insns = { 12062 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12063 BPF_EXIT_INSN(), 12064 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 12065 offsetof(struct __sk_buff, len)), 12066 BPF_EXIT_INSN(), 12067 }, 12068 .prog_type = BPF_PROG_TYPE_SCHED_ACT, 12069 .result = ACCEPT, 12070 .retval = TEST_DATA_LEN, 12071 }, 12072 { 12073 "calls: callee using args1", 12074 .insns = { 12075 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12076 BPF_EXIT_INSN(), 12077 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 12078 BPF_EXIT_INSN(), 12079 }, 12080 .errstr_unpriv = "allowed for root only", 12081 .result_unpriv = REJECT, 12082 .result = ACCEPT, 12083 .retval = POINTER_VALUE, 12084 }, 12085 { 12086 "calls: callee using wrong args2", 12087 .insns = { 12088 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12089 BPF_EXIT_INSN(), 12090 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 12091 BPF_EXIT_INSN(), 12092 }, 12093 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12094 .errstr = "R2 !read_ok", 12095 .result = REJECT, 12096 }, 12097 { 12098 "calls: callee using two args", 12099 .insns = { 12100 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12101 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_6, 12102 offsetof(struct __sk_buff, len)), 12103 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_6, 12104 offsetof(struct __sk_buff, len)), 12105 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12106 BPF_EXIT_INSN(), 12107 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 12108 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 12109 BPF_EXIT_INSN(), 12110 }, 12111 .errstr_unpriv = "allowed for root only", 12112 .result_unpriv = REJECT, 12113 .result = ACCEPT, 12114 .retval = TEST_DATA_LEN + TEST_DATA_LEN - ETH_HLEN - ETH_HLEN, 12115 }, 12116 { 12117 "calls: callee changing pkt pointers", 12118 .insns = { 12119 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 12120 offsetof(struct xdp_md, data)), 12121 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 12122 offsetof(struct xdp_md, data_end)), 12123 BPF_MOV64_REG(BPF_REG_8, BPF_REG_6), 12124 BPF_ALU64_IMM(BPF_ADD, BPF_REG_8, 8), 12125 BPF_JMP_REG(BPF_JGT, BPF_REG_8, BPF_REG_7, 2), 12126 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12127 /* clear_all_pkt_pointers() has to walk all frames 12128 * to make sure that pkt pointers in the caller 12129 * are cleared when callee is calling a helper that 12130 * adjusts packet size 12131 */ 12132 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 12133 BPF_MOV32_IMM(BPF_REG_0, 0), 12134 BPF_EXIT_INSN(), 12135 BPF_MOV64_IMM(BPF_REG_2, 0), 12136 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12137 BPF_FUNC_xdp_adjust_head), 12138 BPF_EXIT_INSN(), 12139 }, 12140 .result = REJECT, 12141 .errstr = "R6 invalid mem access 'inv'", 12142 .prog_type = BPF_PROG_TYPE_XDP, 12143 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 12144 }, 12145 { 12146 "calls: two calls with args", 12147 .insns = { 12148 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12149 BPF_EXIT_INSN(), 12150 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12151 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6), 12152 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0), 12153 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 12154 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12155 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0), 12156 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 12157 BPF_EXIT_INSN(), 12158 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 12159 offsetof(struct __sk_buff, len)), 12160 BPF_EXIT_INSN(), 12161 }, 12162 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12163 .result = ACCEPT, 12164 .retval = TEST_DATA_LEN + TEST_DATA_LEN, 12165 }, 12166 { 12167 "calls: calls with stack arith", 12168 .insns = { 12169 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12170 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -64), 12171 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12172 BPF_EXIT_INSN(), 12173 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -64), 12174 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12175 BPF_EXIT_INSN(), 12176 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -64), 12177 BPF_MOV64_IMM(BPF_REG_0, 42), 12178 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 12179 BPF_EXIT_INSN(), 12180 }, 12181 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12182 .result = ACCEPT, 12183 .retval = 42, 12184 }, 12185 { 12186 "calls: calls with misaligned stack access", 12187 .insns = { 12188 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12189 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -63), 12190 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12191 BPF_EXIT_INSN(), 12192 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -61), 12193 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12194 BPF_EXIT_INSN(), 12195 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -63), 12196 BPF_MOV64_IMM(BPF_REG_0, 42), 12197 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 12198 BPF_EXIT_INSN(), 12199 }, 12200 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12201 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 12202 .errstr = "misaligned stack access", 12203 .result = REJECT, 12204 }, 12205 { 12206 "calls: calls control flow, jump test", 12207 .insns = { 12208 BPF_MOV64_IMM(BPF_REG_0, 42), 12209 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 12210 BPF_MOV64_IMM(BPF_REG_0, 43), 12211 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 12212 BPF_JMP_IMM(BPF_JA, 0, 0, -3), 12213 BPF_EXIT_INSN(), 12214 }, 12215 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12216 .result = ACCEPT, 12217 .retval = 43, 12218 }, 12219 { 12220 "calls: calls control flow, jump test 2", 12221 .insns = { 12222 BPF_MOV64_IMM(BPF_REG_0, 42), 12223 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 12224 BPF_MOV64_IMM(BPF_REG_0, 43), 12225 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 12226 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -3), 12227 BPF_EXIT_INSN(), 12228 }, 12229 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12230 .errstr = "jump out of range from insn 1 to 4", 12231 .result = REJECT, 12232 }, 12233 { 12234 "calls: two calls with bad jump", 12235 .insns = { 12236 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12237 BPF_EXIT_INSN(), 12238 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12239 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6), 12240 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0), 12241 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 12242 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12243 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0), 12244 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 12245 BPF_EXIT_INSN(), 12246 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 12247 offsetof(struct __sk_buff, len)), 12248 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, -3), 12249 BPF_EXIT_INSN(), 12250 }, 12251 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12252 .errstr = "jump out of range from insn 11 to 9", 12253 .result = REJECT, 12254 }, 12255 { 12256 "calls: recursive call. test1", 12257 .insns = { 12258 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12259 BPF_EXIT_INSN(), 12260 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -1), 12261 BPF_EXIT_INSN(), 12262 }, 12263 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12264 .errstr = "back-edge", 12265 .result = REJECT, 12266 }, 12267 { 12268 "calls: recursive call. test2", 12269 .insns = { 12270 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12271 BPF_EXIT_INSN(), 12272 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -3), 12273 BPF_EXIT_INSN(), 12274 }, 12275 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12276 .errstr = "back-edge", 12277 .result = REJECT, 12278 }, 12279 { 12280 "calls: unreachable code", 12281 .insns = { 12282 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12283 BPF_EXIT_INSN(), 12284 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12285 BPF_EXIT_INSN(), 12286 BPF_MOV64_IMM(BPF_REG_0, 0), 12287 BPF_EXIT_INSN(), 12288 BPF_MOV64_IMM(BPF_REG_0, 0), 12289 BPF_EXIT_INSN(), 12290 }, 12291 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12292 .errstr = "unreachable insn 6", 12293 .result = REJECT, 12294 }, 12295 { 12296 "calls: invalid call", 12297 .insns = { 12298 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12299 BPF_EXIT_INSN(), 12300 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -4), 12301 BPF_EXIT_INSN(), 12302 }, 12303 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12304 .errstr = "invalid destination", 12305 .result = REJECT, 12306 }, 12307 { 12308 "calls: invalid call 2", 12309 .insns = { 12310 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12311 BPF_EXIT_INSN(), 12312 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 0x7fffffff), 12313 BPF_EXIT_INSN(), 12314 }, 12315 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12316 .errstr = "invalid destination", 12317 .result = REJECT, 12318 }, 12319 { 12320 "calls: jumping across function bodies. test1", 12321 .insns = { 12322 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 12323 BPF_MOV64_IMM(BPF_REG_0, 0), 12324 BPF_EXIT_INSN(), 12325 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, -3), 12326 BPF_EXIT_INSN(), 12327 }, 12328 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12329 .errstr = "jump out of range", 12330 .result = REJECT, 12331 }, 12332 { 12333 "calls: jumping across function bodies. test2", 12334 .insns = { 12335 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3), 12336 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 12337 BPF_MOV64_IMM(BPF_REG_0, 0), 12338 BPF_EXIT_INSN(), 12339 BPF_EXIT_INSN(), 12340 }, 12341 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12342 .errstr = "jump out of range", 12343 .result = REJECT, 12344 }, 12345 { 12346 "calls: call without exit", 12347 .insns = { 12348 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12349 BPF_EXIT_INSN(), 12350 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12351 BPF_EXIT_INSN(), 12352 BPF_MOV64_IMM(BPF_REG_0, 0), 12353 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, -2), 12354 }, 12355 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12356 .errstr = "not an exit", 12357 .result = REJECT, 12358 }, 12359 { 12360 "calls: call into middle of ld_imm64", 12361 .insns = { 12362 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12363 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12364 BPF_MOV64_IMM(BPF_REG_0, 0), 12365 BPF_EXIT_INSN(), 12366 BPF_LD_IMM64(BPF_REG_0, 0), 12367 BPF_EXIT_INSN(), 12368 }, 12369 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12370 .errstr = "last insn", 12371 .result = REJECT, 12372 }, 12373 { 12374 "calls: call into middle of other call", 12375 .insns = { 12376 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12377 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12378 BPF_MOV64_IMM(BPF_REG_0, 0), 12379 BPF_EXIT_INSN(), 12380 BPF_MOV64_IMM(BPF_REG_0, 0), 12381 BPF_MOV64_IMM(BPF_REG_0, 0), 12382 BPF_EXIT_INSN(), 12383 }, 12384 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12385 .errstr = "last insn", 12386 .result = REJECT, 12387 }, 12388 { 12389 "calls: ld_abs with changing ctx data in callee", 12390 .insns = { 12391 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12392 BPF_LD_ABS(BPF_B, 0), 12393 BPF_LD_ABS(BPF_H, 0), 12394 BPF_LD_ABS(BPF_W, 0), 12395 BPF_MOV64_REG(BPF_REG_7, BPF_REG_6), 12396 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 5), 12397 BPF_MOV64_REG(BPF_REG_6, BPF_REG_7), 12398 BPF_LD_ABS(BPF_B, 0), 12399 BPF_LD_ABS(BPF_H, 0), 12400 BPF_LD_ABS(BPF_W, 0), 12401 BPF_EXIT_INSN(), 12402 BPF_MOV64_IMM(BPF_REG_2, 1), 12403 BPF_MOV64_IMM(BPF_REG_3, 2), 12404 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12405 BPF_FUNC_skb_vlan_push), 12406 BPF_EXIT_INSN(), 12407 }, 12408 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12409 .errstr = "BPF_LD_[ABS|IND] instructions cannot be mixed", 12410 .result = REJECT, 12411 }, 12412 { 12413 "calls: two calls with bad fallthrough", 12414 .insns = { 12415 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12416 BPF_EXIT_INSN(), 12417 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12418 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6), 12419 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0), 12420 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 12421 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12422 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0), 12423 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 12424 BPF_MOV64_REG(BPF_REG_0, BPF_REG_0), 12425 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 12426 offsetof(struct __sk_buff, len)), 12427 BPF_EXIT_INSN(), 12428 }, 12429 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12430 .errstr = "not an exit", 12431 .result = REJECT, 12432 }, 12433 { 12434 "calls: two calls with stack read", 12435 .insns = { 12436 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 12437 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 12438 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 12439 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12440 BPF_EXIT_INSN(), 12441 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12442 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6), 12443 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0), 12444 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 12445 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12446 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0), 12447 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 12448 BPF_EXIT_INSN(), 12449 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 12450 BPF_EXIT_INSN(), 12451 }, 12452 .prog_type = BPF_PROG_TYPE_XDP, 12453 .result = ACCEPT, 12454 }, 12455 { 12456 "calls: two calls with stack write", 12457 .insns = { 12458 /* main prog */ 12459 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 12460 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 12461 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 12462 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12463 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 12464 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 12465 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -16), 12466 BPF_EXIT_INSN(), 12467 12468 /* subprog 1 */ 12469 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12470 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 12471 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 7), 12472 BPF_MOV64_REG(BPF_REG_8, BPF_REG_0), 12473 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 12474 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 12475 BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_0), 12476 BPF_MOV64_REG(BPF_REG_0, BPF_REG_8), 12477 /* write into stack frame of main prog */ 12478 BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 12479 BPF_EXIT_INSN(), 12480 12481 /* subprog 2 */ 12482 /* read from stack frame of main prog */ 12483 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 12484 BPF_EXIT_INSN(), 12485 }, 12486 .prog_type = BPF_PROG_TYPE_XDP, 12487 .result = ACCEPT, 12488 }, 12489 { 12490 "calls: stack overflow using two frames (pre-call access)", 12491 .insns = { 12492 /* prog 1 */ 12493 BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 12494 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), 12495 BPF_EXIT_INSN(), 12496 12497 /* prog 2 */ 12498 BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 12499 BPF_MOV64_IMM(BPF_REG_0, 0), 12500 BPF_EXIT_INSN(), 12501 }, 12502 .prog_type = BPF_PROG_TYPE_XDP, 12503 .errstr = "combined stack size", 12504 .result = REJECT, 12505 }, 12506 { 12507 "calls: stack overflow using two frames (post-call access)", 12508 .insns = { 12509 /* prog 1 */ 12510 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 2), 12511 BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 12512 BPF_EXIT_INSN(), 12513 12514 /* prog 2 */ 12515 BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 12516 BPF_MOV64_IMM(BPF_REG_0, 0), 12517 BPF_EXIT_INSN(), 12518 }, 12519 .prog_type = BPF_PROG_TYPE_XDP, 12520 .errstr = "combined stack size", 12521 .result = REJECT, 12522 }, 12523 { 12524 "calls: stack depth check using three frames. test1", 12525 .insns = { 12526 /* main */ 12527 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 4), /* call A */ 12528 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 5), /* call B */ 12529 BPF_ST_MEM(BPF_B, BPF_REG_10, -32, 0), 12530 BPF_MOV64_IMM(BPF_REG_0, 0), 12531 BPF_EXIT_INSN(), 12532 /* A */ 12533 BPF_ST_MEM(BPF_B, BPF_REG_10, -256, 0), 12534 BPF_EXIT_INSN(), 12535 /* B */ 12536 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, -3), /* call A */ 12537 BPF_ST_MEM(BPF_B, BPF_REG_10, -64, 0), 12538 BPF_EXIT_INSN(), 12539 }, 12540 .prog_type = BPF_PROG_TYPE_XDP, 12541 /* stack_main=32, stack_A=256, stack_B=64 12542 * and max(main+A, main+A+B) < 512 12543 */ 12544 .result = ACCEPT, 12545 }, 12546 { 12547 "calls: stack depth check using three frames. test2", 12548 .insns = { 12549 /* main */ 12550 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 4), /* call A */ 12551 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 5), /* call B */ 12552 BPF_ST_MEM(BPF_B, BPF_REG_10, -32, 0), 12553 BPF_MOV64_IMM(BPF_REG_0, 0), 12554 BPF_EXIT_INSN(), 12555 /* A */ 12556 BPF_ST_MEM(BPF_B, BPF_REG_10, -64, 0), 12557 BPF_EXIT_INSN(), 12558 /* B */ 12559 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, -3), /* call A */ 12560 BPF_ST_MEM(BPF_B, BPF_REG_10, -256, 0), 12561 BPF_EXIT_INSN(), 12562 }, 12563 .prog_type = BPF_PROG_TYPE_XDP, 12564 /* stack_main=32, stack_A=64, stack_B=256 12565 * and max(main+A, main+A+B) < 512 12566 */ 12567 .result = ACCEPT, 12568 }, 12569 { 12570 "calls: stack depth check using three frames. test3", 12571 .insns = { 12572 /* main */ 12573 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12574 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 6), /* call A */ 12575 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 12576 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 8), /* call B */ 12577 BPF_JMP_IMM(BPF_JGE, BPF_REG_6, 0, 1), 12578 BPF_ST_MEM(BPF_B, BPF_REG_10, -64, 0), 12579 BPF_MOV64_IMM(BPF_REG_0, 0), 12580 BPF_EXIT_INSN(), 12581 /* A */ 12582 BPF_JMP_IMM(BPF_JLT, BPF_REG_1, 10, 1), 12583 BPF_EXIT_INSN(), 12584 BPF_ST_MEM(BPF_B, BPF_REG_10, -224, 0), 12585 BPF_JMP_IMM(BPF_JA, 0, 0, -3), 12586 /* B */ 12587 BPF_JMP_IMM(BPF_JGT, BPF_REG_1, 2, 1), 12588 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, -6), /* call A */ 12589 BPF_ST_MEM(BPF_B, BPF_REG_10, -256, 0), 12590 BPF_EXIT_INSN(), 12591 }, 12592 .prog_type = BPF_PROG_TYPE_XDP, 12593 /* stack_main=64, stack_A=224, stack_B=256 12594 * and max(main+A, main+A+B) > 512 12595 */ 12596 .errstr = "combined stack", 12597 .result = REJECT, 12598 }, 12599 { 12600 "calls: stack depth check using three frames. test4", 12601 /* void main(void) { 12602 * func1(0); 12603 * func1(1); 12604 * func2(1); 12605 * } 12606 * void func1(int alloc_or_recurse) { 12607 * if (alloc_or_recurse) { 12608 * frame_pointer[-300] = 1; 12609 * } else { 12610 * func2(alloc_or_recurse); 12611 * } 12612 * } 12613 * void func2(int alloc_or_recurse) { 12614 * if (alloc_or_recurse) { 12615 * frame_pointer[-300] = 1; 12616 * } 12617 * } 12618 */ 12619 .insns = { 12620 /* main */ 12621 BPF_MOV64_IMM(BPF_REG_1, 0), 12622 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 6), /* call A */ 12623 BPF_MOV64_IMM(BPF_REG_1, 1), 12624 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 4), /* call A */ 12625 BPF_MOV64_IMM(BPF_REG_1, 1), 12626 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 7), /* call B */ 12627 BPF_MOV64_IMM(BPF_REG_0, 0), 12628 BPF_EXIT_INSN(), 12629 /* A */ 12630 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 2), 12631 BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 12632 BPF_EXIT_INSN(), 12633 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call B */ 12634 BPF_EXIT_INSN(), 12635 /* B */ 12636 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 12637 BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 12638 BPF_EXIT_INSN(), 12639 }, 12640 .prog_type = BPF_PROG_TYPE_XDP, 12641 .result = REJECT, 12642 .errstr = "combined stack", 12643 }, 12644 { 12645 "calls: stack depth check using three frames. test5", 12646 .insns = { 12647 /* main */ 12648 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call A */ 12649 BPF_EXIT_INSN(), 12650 /* A */ 12651 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call B */ 12652 BPF_EXIT_INSN(), 12653 /* B */ 12654 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call C */ 12655 BPF_EXIT_INSN(), 12656 /* C */ 12657 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call D */ 12658 BPF_EXIT_INSN(), 12659 /* D */ 12660 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call E */ 12661 BPF_EXIT_INSN(), 12662 /* E */ 12663 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call F */ 12664 BPF_EXIT_INSN(), 12665 /* F */ 12666 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call G */ 12667 BPF_EXIT_INSN(), 12668 /* G */ 12669 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call H */ 12670 BPF_EXIT_INSN(), 12671 /* H */ 12672 BPF_MOV64_IMM(BPF_REG_0, 0), 12673 BPF_EXIT_INSN(), 12674 }, 12675 .prog_type = BPF_PROG_TYPE_XDP, 12676 .errstr = "call stack", 12677 .result = REJECT, 12678 }, 12679 { 12680 "calls: spill into caller stack frame", 12681 .insns = { 12682 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 12683 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 12684 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 12685 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12686 BPF_EXIT_INSN(), 12687 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, 0), 12688 BPF_MOV64_IMM(BPF_REG_0, 0), 12689 BPF_EXIT_INSN(), 12690 }, 12691 .prog_type = BPF_PROG_TYPE_XDP, 12692 .errstr = "cannot spill", 12693 .result = REJECT, 12694 }, 12695 { 12696 "calls: write into caller stack frame", 12697 .insns = { 12698 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 12699 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 12700 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12701 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 12702 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 12703 BPF_EXIT_INSN(), 12704 BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 42), 12705 BPF_MOV64_IMM(BPF_REG_0, 0), 12706 BPF_EXIT_INSN(), 12707 }, 12708 .prog_type = BPF_PROG_TYPE_XDP, 12709 .result = ACCEPT, 12710 .retval = 42, 12711 }, 12712 { 12713 "calls: write into callee stack frame", 12714 .insns = { 12715 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 12716 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42), 12717 BPF_EXIT_INSN(), 12718 BPF_MOV64_REG(BPF_REG_0, BPF_REG_10), 12719 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, -8), 12720 BPF_EXIT_INSN(), 12721 }, 12722 .prog_type = BPF_PROG_TYPE_XDP, 12723 .errstr = "cannot return stack pointer", 12724 .result = REJECT, 12725 }, 12726 { 12727 "calls: two calls with stack write and void return", 12728 .insns = { 12729 /* main prog */ 12730 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 12731 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 12732 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 12733 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12734 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 12735 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 12736 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -16), 12737 BPF_EXIT_INSN(), 12738 12739 /* subprog 1 */ 12740 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12741 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 12742 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12743 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 12744 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12745 BPF_EXIT_INSN(), 12746 12747 /* subprog 2 */ 12748 /* write into stack frame of main prog */ 12749 BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 0), 12750 BPF_EXIT_INSN(), /* void return */ 12751 }, 12752 .prog_type = BPF_PROG_TYPE_XDP, 12753 .result = ACCEPT, 12754 }, 12755 { 12756 "calls: ambiguous return value", 12757 .insns = { 12758 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12759 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 5), 12760 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 12761 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 12762 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 12763 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 12764 BPF_EXIT_INSN(), 12765 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 12766 BPF_MOV64_IMM(BPF_REG_0, 0), 12767 BPF_EXIT_INSN(), 12768 }, 12769 .errstr_unpriv = "allowed for root only", 12770 .result_unpriv = REJECT, 12771 .errstr = "R0 !read_ok", 12772 .result = REJECT, 12773 }, 12774 { 12775 "calls: two calls that return map_value", 12776 .insns = { 12777 /* main prog */ 12778 /* pass fp-16, fp-8 into a function */ 12779 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 12780 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 12781 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12782 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 12783 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8), 12784 12785 /* fetch map_value_ptr from the stack of this function */ 12786 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 12787 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 12788 /* write into map value */ 12789 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 12790 /* fetch secound map_value_ptr from the stack */ 12791 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -16), 12792 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 12793 /* write into map value */ 12794 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 12795 BPF_MOV64_IMM(BPF_REG_0, 0), 12796 BPF_EXIT_INSN(), 12797 12798 /* subprog 1 */ 12799 /* call 3rd function twice */ 12800 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12801 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 12802 /* first time with fp-8 */ 12803 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12804 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 12805 /* second time with fp-16 */ 12806 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12807 BPF_EXIT_INSN(), 12808 12809 /* subprog 2 */ 12810 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12811 /* lookup from map */ 12812 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 12813 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12814 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12815 BPF_LD_MAP_FD(BPF_REG_1, 0), 12816 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12817 BPF_FUNC_map_lookup_elem), 12818 /* write map_value_ptr into stack frame of main prog */ 12819 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 12820 BPF_MOV64_IMM(BPF_REG_0, 0), 12821 BPF_EXIT_INSN(), /* return 0 */ 12822 }, 12823 .prog_type = BPF_PROG_TYPE_XDP, 12824 .fixup_map_hash_8b = { 23 }, 12825 .result = ACCEPT, 12826 }, 12827 { 12828 "calls: two calls that return map_value with bool condition", 12829 .insns = { 12830 /* main prog */ 12831 /* pass fp-16, fp-8 into a function */ 12832 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 12833 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 12834 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12835 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 12836 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 12837 BPF_MOV64_IMM(BPF_REG_0, 0), 12838 BPF_EXIT_INSN(), 12839 12840 /* subprog 1 */ 12841 /* call 3rd function twice */ 12842 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12843 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 12844 /* first time with fp-8 */ 12845 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 9), 12846 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2), 12847 /* fetch map_value_ptr from the stack of this function */ 12848 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 12849 /* write into map value */ 12850 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 12851 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 12852 /* second time with fp-16 */ 12853 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 12854 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2), 12855 /* fetch secound map_value_ptr from the stack */ 12856 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0), 12857 /* write into map value */ 12858 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 12859 BPF_EXIT_INSN(), 12860 12861 /* subprog 2 */ 12862 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12863 /* lookup from map */ 12864 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 12865 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12866 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12867 BPF_LD_MAP_FD(BPF_REG_1, 0), 12868 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12869 BPF_FUNC_map_lookup_elem), 12870 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12871 BPF_MOV64_IMM(BPF_REG_0, 0), 12872 BPF_EXIT_INSN(), /* return 0 */ 12873 /* write map_value_ptr into stack frame of main prog */ 12874 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 12875 BPF_MOV64_IMM(BPF_REG_0, 1), 12876 BPF_EXIT_INSN(), /* return 1 */ 12877 }, 12878 .prog_type = BPF_PROG_TYPE_XDP, 12879 .fixup_map_hash_8b = { 23 }, 12880 .result = ACCEPT, 12881 }, 12882 { 12883 "calls: two calls that return map_value with incorrect bool check", 12884 .insns = { 12885 /* main prog */ 12886 /* pass fp-16, fp-8 into a function */ 12887 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 12888 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 12889 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12890 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 12891 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 12892 BPF_MOV64_IMM(BPF_REG_0, 0), 12893 BPF_EXIT_INSN(), 12894 12895 /* subprog 1 */ 12896 /* call 3rd function twice */ 12897 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12898 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 12899 /* first time with fp-8 */ 12900 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 9), 12901 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2), 12902 /* fetch map_value_ptr from the stack of this function */ 12903 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 12904 /* write into map value */ 12905 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 12906 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 12907 /* second time with fp-16 */ 12908 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 12909 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12910 /* fetch secound map_value_ptr from the stack */ 12911 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0), 12912 /* write into map value */ 12913 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 12914 BPF_EXIT_INSN(), 12915 12916 /* subprog 2 */ 12917 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12918 /* lookup from map */ 12919 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 12920 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12921 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12922 BPF_LD_MAP_FD(BPF_REG_1, 0), 12923 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12924 BPF_FUNC_map_lookup_elem), 12925 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12926 BPF_MOV64_IMM(BPF_REG_0, 0), 12927 BPF_EXIT_INSN(), /* return 0 */ 12928 /* write map_value_ptr into stack frame of main prog */ 12929 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 12930 BPF_MOV64_IMM(BPF_REG_0, 1), 12931 BPF_EXIT_INSN(), /* return 1 */ 12932 }, 12933 .prog_type = BPF_PROG_TYPE_XDP, 12934 .fixup_map_hash_8b = { 23 }, 12935 .result = REJECT, 12936 .errstr = "invalid read from stack off -16+0 size 8", 12937 }, 12938 { 12939 "calls: two calls that receive map_value via arg=ptr_stack_of_caller. test1", 12940 .insns = { 12941 /* main prog */ 12942 /* pass fp-16, fp-8 into a function */ 12943 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 12944 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 12945 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12946 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 12947 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 12948 BPF_MOV64_IMM(BPF_REG_0, 0), 12949 BPF_EXIT_INSN(), 12950 12951 /* subprog 1 */ 12952 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12953 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 12954 /* 1st lookup from map */ 12955 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 12956 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12957 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12958 BPF_LD_MAP_FD(BPF_REG_1, 0), 12959 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12960 BPF_FUNC_map_lookup_elem), 12961 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12962 BPF_MOV64_IMM(BPF_REG_8, 0), 12963 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 12964 /* write map_value_ptr into stack frame of main prog at fp-8 */ 12965 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 12966 BPF_MOV64_IMM(BPF_REG_8, 1), 12967 12968 /* 2nd lookup from map */ 12969 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), /* 20 */ 12970 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12971 BPF_LD_MAP_FD(BPF_REG_1, 0), 12972 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, /* 24 */ 12973 BPF_FUNC_map_lookup_elem), 12974 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12975 BPF_MOV64_IMM(BPF_REG_9, 0), 12976 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 12977 /* write map_value_ptr into stack frame of main prog at fp-16 */ 12978 BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 12979 BPF_MOV64_IMM(BPF_REG_9, 1), 12980 12981 /* call 3rd func with fp-8, 0|1, fp-16, 0|1 */ 12982 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), /* 30 */ 12983 BPF_MOV64_REG(BPF_REG_2, BPF_REG_8), 12984 BPF_MOV64_REG(BPF_REG_3, BPF_REG_7), 12985 BPF_MOV64_REG(BPF_REG_4, BPF_REG_9), 12986 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), /* 34 */ 12987 BPF_EXIT_INSN(), 12988 12989 /* subprog 2 */ 12990 /* if arg2 == 1 do *arg1 = 0 */ 12991 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2), 12992 /* fetch map_value_ptr from the stack of this function */ 12993 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 12994 /* write into map value */ 12995 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 12996 12997 /* if arg4 == 1 do *arg3 = 0 */ 12998 BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2), 12999 /* fetch map_value_ptr from the stack of this function */ 13000 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 13001 /* write into map value */ 13002 BPF_ST_MEM(BPF_DW, BPF_REG_0, 2, 0), 13003 BPF_EXIT_INSN(), 13004 }, 13005 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13006 .fixup_map_hash_8b = { 12, 22 }, 13007 .result = REJECT, 13008 .errstr = "invalid access to map value, value_size=8 off=2 size=8", 13009 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 13010 }, 13011 { 13012 "calls: two calls that receive map_value via arg=ptr_stack_of_caller. test2", 13013 .insns = { 13014 /* main prog */ 13015 /* pass fp-16, fp-8 into a function */ 13016 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 13017 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 13018 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13019 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 13020 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 13021 BPF_MOV64_IMM(BPF_REG_0, 0), 13022 BPF_EXIT_INSN(), 13023 13024 /* subprog 1 */ 13025 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 13026 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 13027 /* 1st lookup from map */ 13028 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 13029 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13030 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13031 BPF_LD_MAP_FD(BPF_REG_1, 0), 13032 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13033 BPF_FUNC_map_lookup_elem), 13034 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 13035 BPF_MOV64_IMM(BPF_REG_8, 0), 13036 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 13037 /* write map_value_ptr into stack frame of main prog at fp-8 */ 13038 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 13039 BPF_MOV64_IMM(BPF_REG_8, 1), 13040 13041 /* 2nd lookup from map */ 13042 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), /* 20 */ 13043 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13044 BPF_LD_MAP_FD(BPF_REG_1, 0), 13045 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, /* 24 */ 13046 BPF_FUNC_map_lookup_elem), 13047 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 13048 BPF_MOV64_IMM(BPF_REG_9, 0), 13049 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 13050 /* write map_value_ptr into stack frame of main prog at fp-16 */ 13051 BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 13052 BPF_MOV64_IMM(BPF_REG_9, 1), 13053 13054 /* call 3rd func with fp-8, 0|1, fp-16, 0|1 */ 13055 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), /* 30 */ 13056 BPF_MOV64_REG(BPF_REG_2, BPF_REG_8), 13057 BPF_MOV64_REG(BPF_REG_3, BPF_REG_7), 13058 BPF_MOV64_REG(BPF_REG_4, BPF_REG_9), 13059 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), /* 34 */ 13060 BPF_EXIT_INSN(), 13061 13062 /* subprog 2 */ 13063 /* if arg2 == 1 do *arg1 = 0 */ 13064 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2), 13065 /* fetch map_value_ptr from the stack of this function */ 13066 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 13067 /* write into map value */ 13068 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 13069 13070 /* if arg4 == 1 do *arg3 = 0 */ 13071 BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2), 13072 /* fetch map_value_ptr from the stack of this function */ 13073 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 13074 /* write into map value */ 13075 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 13076 BPF_EXIT_INSN(), 13077 }, 13078 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13079 .fixup_map_hash_8b = { 12, 22 }, 13080 .result = ACCEPT, 13081 }, 13082 { 13083 "calls: two jumps that receive map_value via arg=ptr_stack_of_jumper. test3", 13084 .insns = { 13085 /* main prog */ 13086 /* pass fp-16, fp-8 into a function */ 13087 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 13088 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 13089 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13090 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 13091 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2), 13092 BPF_MOV64_IMM(BPF_REG_0, 0), 13093 BPF_EXIT_INSN(), 13094 13095 /* subprog 1 */ 13096 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 13097 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 13098 /* 1st lookup from map */ 13099 BPF_ST_MEM(BPF_DW, BPF_REG_10, -24, 0), 13100 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13101 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -24), 13102 BPF_LD_MAP_FD(BPF_REG_1, 0), 13103 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13104 BPF_FUNC_map_lookup_elem), 13105 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 13106 BPF_MOV64_IMM(BPF_REG_8, 0), 13107 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 13108 /* write map_value_ptr into stack frame of main prog at fp-8 */ 13109 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 13110 BPF_MOV64_IMM(BPF_REG_8, 1), 13111 13112 /* 2nd lookup from map */ 13113 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13114 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -24), 13115 BPF_LD_MAP_FD(BPF_REG_1, 0), 13116 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13117 BPF_FUNC_map_lookup_elem), 13118 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 13119 BPF_MOV64_IMM(BPF_REG_9, 0), // 26 13120 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 13121 /* write map_value_ptr into stack frame of main prog at fp-16 */ 13122 BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 13123 BPF_MOV64_IMM(BPF_REG_9, 1), 13124 13125 /* call 3rd func with fp-8, 0|1, fp-16, 0|1 */ 13126 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), // 30 13127 BPF_MOV64_REG(BPF_REG_2, BPF_REG_8), 13128 BPF_MOV64_REG(BPF_REG_3, BPF_REG_7), 13129 BPF_MOV64_REG(BPF_REG_4, BPF_REG_9), 13130 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), // 34 13131 BPF_JMP_IMM(BPF_JA, 0, 0, -30), 13132 13133 /* subprog 2 */ 13134 /* if arg2 == 1 do *arg1 = 0 */ 13135 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2), 13136 /* fetch map_value_ptr from the stack of this function */ 13137 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 13138 /* write into map value */ 13139 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 13140 13141 /* if arg4 == 1 do *arg3 = 0 */ 13142 BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2), 13143 /* fetch map_value_ptr from the stack of this function */ 13144 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 13145 /* write into map value */ 13146 BPF_ST_MEM(BPF_DW, BPF_REG_0, 2, 0), 13147 BPF_JMP_IMM(BPF_JA, 0, 0, -8), 13148 }, 13149 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13150 .fixup_map_hash_8b = { 12, 22 }, 13151 .result = REJECT, 13152 .errstr = "invalid access to map value, value_size=8 off=2 size=8", 13153 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 13154 }, 13155 { 13156 "calls: two calls that receive map_value_ptr_or_null via arg. test1", 13157 .insns = { 13158 /* main prog */ 13159 /* pass fp-16, fp-8 into a function */ 13160 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 13161 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 13162 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13163 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 13164 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 13165 BPF_MOV64_IMM(BPF_REG_0, 0), 13166 BPF_EXIT_INSN(), 13167 13168 /* subprog 1 */ 13169 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 13170 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 13171 /* 1st lookup from map */ 13172 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 13173 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13174 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13175 BPF_LD_MAP_FD(BPF_REG_1, 0), 13176 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13177 BPF_FUNC_map_lookup_elem), 13178 /* write map_value_ptr_or_null into stack frame of main prog at fp-8 */ 13179 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 13180 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 13181 BPF_MOV64_IMM(BPF_REG_8, 0), 13182 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 13183 BPF_MOV64_IMM(BPF_REG_8, 1), 13184 13185 /* 2nd lookup from map */ 13186 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13187 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13188 BPF_LD_MAP_FD(BPF_REG_1, 0), 13189 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13190 BPF_FUNC_map_lookup_elem), 13191 /* write map_value_ptr_or_null into stack frame of main prog at fp-16 */ 13192 BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 13193 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 13194 BPF_MOV64_IMM(BPF_REG_9, 0), 13195 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 13196 BPF_MOV64_IMM(BPF_REG_9, 1), 13197 13198 /* call 3rd func with fp-8, 0|1, fp-16, 0|1 */ 13199 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 13200 BPF_MOV64_REG(BPF_REG_2, BPF_REG_8), 13201 BPF_MOV64_REG(BPF_REG_3, BPF_REG_7), 13202 BPF_MOV64_REG(BPF_REG_4, BPF_REG_9), 13203 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 13204 BPF_EXIT_INSN(), 13205 13206 /* subprog 2 */ 13207 /* if arg2 == 1 do *arg1 = 0 */ 13208 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2), 13209 /* fetch map_value_ptr from the stack of this function */ 13210 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 13211 /* write into map value */ 13212 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 13213 13214 /* if arg4 == 1 do *arg3 = 0 */ 13215 BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2), 13216 /* fetch map_value_ptr from the stack of this function */ 13217 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 13218 /* write into map value */ 13219 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 13220 BPF_EXIT_INSN(), 13221 }, 13222 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13223 .fixup_map_hash_8b = { 12, 22 }, 13224 .result = ACCEPT, 13225 }, 13226 { 13227 "calls: two calls that receive map_value_ptr_or_null via arg. test2", 13228 .insns = { 13229 /* main prog */ 13230 /* pass fp-16, fp-8 into a function */ 13231 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 13232 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 13233 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13234 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 13235 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 13236 BPF_MOV64_IMM(BPF_REG_0, 0), 13237 BPF_EXIT_INSN(), 13238 13239 /* subprog 1 */ 13240 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 13241 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 13242 /* 1st lookup from map */ 13243 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 13244 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13245 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13246 BPF_LD_MAP_FD(BPF_REG_1, 0), 13247 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13248 BPF_FUNC_map_lookup_elem), 13249 /* write map_value_ptr_or_null into stack frame of main prog at fp-8 */ 13250 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 13251 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 13252 BPF_MOV64_IMM(BPF_REG_8, 0), 13253 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 13254 BPF_MOV64_IMM(BPF_REG_8, 1), 13255 13256 /* 2nd lookup from map */ 13257 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13258 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13259 BPF_LD_MAP_FD(BPF_REG_1, 0), 13260 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13261 BPF_FUNC_map_lookup_elem), 13262 /* write map_value_ptr_or_null into stack frame of main prog at fp-16 */ 13263 BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 13264 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 13265 BPF_MOV64_IMM(BPF_REG_9, 0), 13266 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 13267 BPF_MOV64_IMM(BPF_REG_9, 1), 13268 13269 /* call 3rd func with fp-8, 0|1, fp-16, 0|1 */ 13270 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 13271 BPF_MOV64_REG(BPF_REG_2, BPF_REG_8), 13272 BPF_MOV64_REG(BPF_REG_3, BPF_REG_7), 13273 BPF_MOV64_REG(BPF_REG_4, BPF_REG_9), 13274 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 13275 BPF_EXIT_INSN(), 13276 13277 /* subprog 2 */ 13278 /* if arg2 == 1 do *arg1 = 0 */ 13279 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2), 13280 /* fetch map_value_ptr from the stack of this function */ 13281 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 13282 /* write into map value */ 13283 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 13284 13285 /* if arg4 == 0 do *arg3 = 0 */ 13286 BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 0, 2), 13287 /* fetch map_value_ptr from the stack of this function */ 13288 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 13289 /* write into map value */ 13290 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 13291 BPF_EXIT_INSN(), 13292 }, 13293 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13294 .fixup_map_hash_8b = { 12, 22 }, 13295 .result = REJECT, 13296 .errstr = "R0 invalid mem access 'inv'", 13297 }, 13298 { 13299 "calls: pkt_ptr spill into caller stack", 13300 .insns = { 13301 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 13302 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 13303 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 13304 BPF_EXIT_INSN(), 13305 13306 /* subprog 1 */ 13307 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13308 offsetof(struct __sk_buff, data)), 13309 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 13310 offsetof(struct __sk_buff, data_end)), 13311 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 13312 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 13313 /* spill unchecked pkt_ptr into stack of caller */ 13314 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 13315 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 13316 /* now the pkt range is verified, read pkt_ptr from stack */ 13317 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0), 13318 /* write 4 bytes into packet */ 13319 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 13320 BPF_EXIT_INSN(), 13321 }, 13322 .result = ACCEPT, 13323 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13324 .retval = POINTER_VALUE, 13325 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 13326 }, 13327 { 13328 "calls: pkt_ptr spill into caller stack 2", 13329 .insns = { 13330 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 13331 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 13332 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 13333 /* Marking is still kept, but not in all cases safe. */ 13334 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 13335 BPF_ST_MEM(BPF_W, BPF_REG_4, 0, 0), 13336 BPF_EXIT_INSN(), 13337 13338 /* subprog 1 */ 13339 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13340 offsetof(struct __sk_buff, data)), 13341 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 13342 offsetof(struct __sk_buff, data_end)), 13343 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 13344 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 13345 /* spill unchecked pkt_ptr into stack of caller */ 13346 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 13347 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 13348 /* now the pkt range is verified, read pkt_ptr from stack */ 13349 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0), 13350 /* write 4 bytes into packet */ 13351 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 13352 BPF_EXIT_INSN(), 13353 }, 13354 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13355 .errstr = "invalid access to packet", 13356 .result = REJECT, 13357 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 13358 }, 13359 { 13360 "calls: pkt_ptr spill into caller stack 3", 13361 .insns = { 13362 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 13363 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 13364 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 13365 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 13366 /* Marking is still kept and safe here. */ 13367 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 13368 BPF_ST_MEM(BPF_W, BPF_REG_4, 0, 0), 13369 BPF_EXIT_INSN(), 13370 13371 /* subprog 1 */ 13372 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13373 offsetof(struct __sk_buff, data)), 13374 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 13375 offsetof(struct __sk_buff, data_end)), 13376 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 13377 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 13378 /* spill unchecked pkt_ptr into stack of caller */ 13379 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 13380 BPF_MOV64_IMM(BPF_REG_5, 0), 13381 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 13382 BPF_MOV64_IMM(BPF_REG_5, 1), 13383 /* now the pkt range is verified, read pkt_ptr from stack */ 13384 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0), 13385 /* write 4 bytes into packet */ 13386 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 13387 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 13388 BPF_EXIT_INSN(), 13389 }, 13390 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13391 .result = ACCEPT, 13392 .retval = 1, 13393 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 13394 }, 13395 { 13396 "calls: pkt_ptr spill into caller stack 4", 13397 .insns = { 13398 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 13399 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 13400 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 13401 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 13402 /* Check marking propagated. */ 13403 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 13404 BPF_ST_MEM(BPF_W, BPF_REG_4, 0, 0), 13405 BPF_EXIT_INSN(), 13406 13407 /* subprog 1 */ 13408 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13409 offsetof(struct __sk_buff, data)), 13410 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 13411 offsetof(struct __sk_buff, data_end)), 13412 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 13413 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 13414 /* spill unchecked pkt_ptr into stack of caller */ 13415 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 13416 BPF_MOV64_IMM(BPF_REG_5, 0), 13417 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 13418 BPF_MOV64_IMM(BPF_REG_5, 1), 13419 /* don't read back pkt_ptr from stack here */ 13420 /* write 4 bytes into packet */ 13421 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 13422 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 13423 BPF_EXIT_INSN(), 13424 }, 13425 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13426 .result = ACCEPT, 13427 .retval = 1, 13428 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 13429 }, 13430 { 13431 "calls: pkt_ptr spill into caller stack 5", 13432 .insns = { 13433 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 13434 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 13435 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_1, 0), 13436 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 13437 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 13438 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0), 13439 BPF_EXIT_INSN(), 13440 13441 /* subprog 1 */ 13442 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13443 offsetof(struct __sk_buff, data)), 13444 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 13445 offsetof(struct __sk_buff, data_end)), 13446 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 13447 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 13448 BPF_MOV64_IMM(BPF_REG_5, 0), 13449 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 13450 /* spill checked pkt_ptr into stack of caller */ 13451 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 13452 BPF_MOV64_IMM(BPF_REG_5, 1), 13453 /* don't read back pkt_ptr from stack here */ 13454 /* write 4 bytes into packet */ 13455 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 13456 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 13457 BPF_EXIT_INSN(), 13458 }, 13459 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13460 .errstr = "same insn cannot be used with different", 13461 .result = REJECT, 13462 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 13463 }, 13464 { 13465 "calls: pkt_ptr spill into caller stack 6", 13466 .insns = { 13467 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13468 offsetof(struct __sk_buff, data_end)), 13469 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 13470 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 13471 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 13472 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 13473 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 13474 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0), 13475 BPF_EXIT_INSN(), 13476 13477 /* subprog 1 */ 13478 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13479 offsetof(struct __sk_buff, data)), 13480 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 13481 offsetof(struct __sk_buff, data_end)), 13482 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 13483 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 13484 BPF_MOV64_IMM(BPF_REG_5, 0), 13485 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 13486 /* spill checked pkt_ptr into stack of caller */ 13487 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 13488 BPF_MOV64_IMM(BPF_REG_5, 1), 13489 /* don't read back pkt_ptr from stack here */ 13490 /* write 4 bytes into packet */ 13491 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 13492 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 13493 BPF_EXIT_INSN(), 13494 }, 13495 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13496 .errstr = "R4 invalid mem access", 13497 .result = REJECT, 13498 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 13499 }, 13500 { 13501 "calls: pkt_ptr spill into caller stack 7", 13502 .insns = { 13503 BPF_MOV64_IMM(BPF_REG_2, 0), 13504 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 13505 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 13506 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 13507 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 13508 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 13509 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0), 13510 BPF_EXIT_INSN(), 13511 13512 /* subprog 1 */ 13513 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13514 offsetof(struct __sk_buff, data)), 13515 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 13516 offsetof(struct __sk_buff, data_end)), 13517 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 13518 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 13519 BPF_MOV64_IMM(BPF_REG_5, 0), 13520 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 13521 /* spill checked pkt_ptr into stack of caller */ 13522 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 13523 BPF_MOV64_IMM(BPF_REG_5, 1), 13524 /* don't read back pkt_ptr from stack here */ 13525 /* write 4 bytes into packet */ 13526 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 13527 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 13528 BPF_EXIT_INSN(), 13529 }, 13530 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13531 .errstr = "R4 invalid mem access", 13532 .result = REJECT, 13533 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 13534 }, 13535 { 13536 "calls: pkt_ptr spill into caller stack 8", 13537 .insns = { 13538 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13539 offsetof(struct __sk_buff, data)), 13540 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 13541 offsetof(struct __sk_buff, data_end)), 13542 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 13543 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 13544 BPF_JMP_REG(BPF_JLE, BPF_REG_0, BPF_REG_3, 1), 13545 BPF_EXIT_INSN(), 13546 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 13547 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 13548 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 13549 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 13550 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 13551 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0), 13552 BPF_EXIT_INSN(), 13553 13554 /* subprog 1 */ 13555 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13556 offsetof(struct __sk_buff, data)), 13557 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 13558 offsetof(struct __sk_buff, data_end)), 13559 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 13560 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 13561 BPF_MOV64_IMM(BPF_REG_5, 0), 13562 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 13563 /* spill checked pkt_ptr into stack of caller */ 13564 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 13565 BPF_MOV64_IMM(BPF_REG_5, 1), 13566 /* don't read back pkt_ptr from stack here */ 13567 /* write 4 bytes into packet */ 13568 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 13569 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 13570 BPF_EXIT_INSN(), 13571 }, 13572 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13573 .result = ACCEPT, 13574 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 13575 }, 13576 { 13577 "calls: pkt_ptr spill into caller stack 9", 13578 .insns = { 13579 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13580 offsetof(struct __sk_buff, data)), 13581 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 13582 offsetof(struct __sk_buff, data_end)), 13583 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 13584 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 13585 BPF_JMP_REG(BPF_JLE, BPF_REG_0, BPF_REG_3, 1), 13586 BPF_EXIT_INSN(), 13587 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 13588 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 13589 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 13590 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 13591 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 13592 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0), 13593 BPF_EXIT_INSN(), 13594 13595 /* subprog 1 */ 13596 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13597 offsetof(struct __sk_buff, data)), 13598 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 13599 offsetof(struct __sk_buff, data_end)), 13600 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 13601 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 13602 BPF_MOV64_IMM(BPF_REG_5, 0), 13603 /* spill unchecked pkt_ptr into stack of caller */ 13604 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 13605 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 13606 BPF_MOV64_IMM(BPF_REG_5, 1), 13607 /* don't read back pkt_ptr from stack here */ 13608 /* write 4 bytes into packet */ 13609 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 13610 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 13611 BPF_EXIT_INSN(), 13612 }, 13613 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13614 .errstr = "invalid access to packet", 13615 .result = REJECT, 13616 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 13617 }, 13618 { 13619 "calls: caller stack init to zero or map_value_or_null", 13620 .insns = { 13621 BPF_MOV64_IMM(BPF_REG_0, 0), 13622 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 13623 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13624 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13625 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 13626 /* fetch map_value_or_null or const_zero from stack */ 13627 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 13628 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 13629 /* store into map_value */ 13630 BPF_ST_MEM(BPF_W, BPF_REG_0, 0, 0), 13631 BPF_EXIT_INSN(), 13632 13633 /* subprog 1 */ 13634 /* if (ctx == 0) return; */ 13635 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 8), 13636 /* else bpf_map_lookup() and *(fp - 8) = r0 */ 13637 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 13638 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13639 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13640 BPF_LD_MAP_FD(BPF_REG_1, 0), 13641 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 13642 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13643 BPF_FUNC_map_lookup_elem), 13644 /* write map_value_ptr_or_null into stack frame of main prog at fp-8 */ 13645 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 13646 BPF_EXIT_INSN(), 13647 }, 13648 .fixup_map_hash_8b = { 13 }, 13649 .result = ACCEPT, 13650 .prog_type = BPF_PROG_TYPE_XDP, 13651 }, 13652 { 13653 "calls: stack init to zero and pruning", 13654 .insns = { 13655 /* first make allocated_stack 16 byte */ 13656 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, 0), 13657 /* now fork the execution such that the false branch 13658 * of JGT insn will be verified second and it skisp zero 13659 * init of fp-8 stack slot. If stack liveness marking 13660 * is missing live_read marks from call map_lookup 13661 * processing then pruning will incorrectly assume 13662 * that fp-8 stack slot was unused in the fall-through 13663 * branch and will accept the program incorrectly 13664 */ 13665 BPF_JMP_IMM(BPF_JGT, BPF_REG_1, 2, 2), 13666 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 13667 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 13668 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13669 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13670 BPF_LD_MAP_FD(BPF_REG_1, 0), 13671 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13672 BPF_FUNC_map_lookup_elem), 13673 BPF_EXIT_INSN(), 13674 }, 13675 .fixup_map_hash_48b = { 6 }, 13676 .errstr = "invalid indirect read from stack off -8+0 size 8", 13677 .result = REJECT, 13678 .prog_type = BPF_PROG_TYPE_XDP, 13679 }, 13680 { 13681 "calls: two calls returning different map pointers for lookup (hash, array)", 13682 .insns = { 13683 /* main prog */ 13684 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2), 13685 BPF_CALL_REL(11), 13686 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 13687 BPF_CALL_REL(12), 13688 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 13689 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 13690 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13691 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13692 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13693 BPF_FUNC_map_lookup_elem), 13694 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 13695 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 13696 offsetof(struct test_val, foo)), 13697 BPF_MOV64_IMM(BPF_REG_0, 1), 13698 BPF_EXIT_INSN(), 13699 /* subprog 1 */ 13700 BPF_LD_MAP_FD(BPF_REG_0, 0), 13701 BPF_EXIT_INSN(), 13702 /* subprog 2 */ 13703 BPF_LD_MAP_FD(BPF_REG_0, 0), 13704 BPF_EXIT_INSN(), 13705 }, 13706 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13707 .fixup_map_hash_48b = { 13 }, 13708 .fixup_map_array_48b = { 16 }, 13709 .result = ACCEPT, 13710 .retval = 1, 13711 }, 13712 { 13713 "calls: two calls returning different map pointers for lookup (hash, map in map)", 13714 .insns = { 13715 /* main prog */ 13716 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2), 13717 BPF_CALL_REL(11), 13718 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 13719 BPF_CALL_REL(12), 13720 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 13721 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 13722 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13723 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13724 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13725 BPF_FUNC_map_lookup_elem), 13726 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 13727 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 13728 offsetof(struct test_val, foo)), 13729 BPF_MOV64_IMM(BPF_REG_0, 1), 13730 BPF_EXIT_INSN(), 13731 /* subprog 1 */ 13732 BPF_LD_MAP_FD(BPF_REG_0, 0), 13733 BPF_EXIT_INSN(), 13734 /* subprog 2 */ 13735 BPF_LD_MAP_FD(BPF_REG_0, 0), 13736 BPF_EXIT_INSN(), 13737 }, 13738 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13739 .fixup_map_in_map = { 16 }, 13740 .fixup_map_array_48b = { 13 }, 13741 .result = REJECT, 13742 .errstr = "R0 invalid mem access 'map_ptr'", 13743 }, 13744 { 13745 "cond: two branches returning different map pointers for lookup (tail, tail)", 13746 .insns = { 13747 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 13748 offsetof(struct __sk_buff, mark)), 13749 BPF_JMP_IMM(BPF_JNE, BPF_REG_6, 0, 3), 13750 BPF_LD_MAP_FD(BPF_REG_2, 0), 13751 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 13752 BPF_LD_MAP_FD(BPF_REG_2, 0), 13753 BPF_MOV64_IMM(BPF_REG_3, 7), 13754 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13755 BPF_FUNC_tail_call), 13756 BPF_MOV64_IMM(BPF_REG_0, 1), 13757 BPF_EXIT_INSN(), 13758 }, 13759 .fixup_prog1 = { 5 }, 13760 .fixup_prog2 = { 2 }, 13761 .result_unpriv = REJECT, 13762 .errstr_unpriv = "tail_call abusing map_ptr", 13763 .result = ACCEPT, 13764 .retval = 42, 13765 }, 13766 { 13767 "cond: two branches returning same map pointers for lookup (tail, tail)", 13768 .insns = { 13769 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 13770 offsetof(struct __sk_buff, mark)), 13771 BPF_JMP_IMM(BPF_JEQ, BPF_REG_6, 0, 3), 13772 BPF_LD_MAP_FD(BPF_REG_2, 0), 13773 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 13774 BPF_LD_MAP_FD(BPF_REG_2, 0), 13775 BPF_MOV64_IMM(BPF_REG_3, 7), 13776 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13777 BPF_FUNC_tail_call), 13778 BPF_MOV64_IMM(BPF_REG_0, 1), 13779 BPF_EXIT_INSN(), 13780 }, 13781 .fixup_prog2 = { 2, 5 }, 13782 .result_unpriv = ACCEPT, 13783 .result = ACCEPT, 13784 .retval = 42, 13785 }, 13786 { 13787 "search pruning: all branches should be verified (nop operation)", 13788 .insns = { 13789 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13790 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13791 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 13792 BPF_LD_MAP_FD(BPF_REG_1, 0), 13793 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 13794 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11), 13795 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0), 13796 BPF_JMP_IMM(BPF_JEQ, BPF_REG_3, 0xbeef, 2), 13797 BPF_MOV64_IMM(BPF_REG_4, 0), 13798 BPF_JMP_A(1), 13799 BPF_MOV64_IMM(BPF_REG_4, 1), 13800 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_4, -16), 13801 BPF_EMIT_CALL(BPF_FUNC_ktime_get_ns), 13802 BPF_LDX_MEM(BPF_DW, BPF_REG_5, BPF_REG_10, -16), 13803 BPF_JMP_IMM(BPF_JEQ, BPF_REG_5, 0, 2), 13804 BPF_MOV64_IMM(BPF_REG_6, 0), 13805 BPF_ST_MEM(BPF_DW, BPF_REG_6, 0, 0xdead), 13806 BPF_EXIT_INSN(), 13807 }, 13808 .fixup_map_hash_8b = { 3 }, 13809 .errstr = "R6 invalid mem access 'inv'", 13810 .result = REJECT, 13811 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 13812 }, 13813 { 13814 "search pruning: all branches should be verified (invalid stack access)", 13815 .insns = { 13816 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13817 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13818 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 13819 BPF_LD_MAP_FD(BPF_REG_1, 0), 13820 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 13821 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8), 13822 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0), 13823 BPF_MOV64_IMM(BPF_REG_4, 0), 13824 BPF_JMP_IMM(BPF_JEQ, BPF_REG_3, 0xbeef, 2), 13825 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_4, -16), 13826 BPF_JMP_A(1), 13827 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_4, -24), 13828 BPF_EMIT_CALL(BPF_FUNC_ktime_get_ns), 13829 BPF_LDX_MEM(BPF_DW, BPF_REG_5, BPF_REG_10, -16), 13830 BPF_EXIT_INSN(), 13831 }, 13832 .fixup_map_hash_8b = { 3 }, 13833 .errstr = "invalid read from stack off -16+0 size 8", 13834 .result = REJECT, 13835 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 13836 }, 13837 { 13838 "jit: lsh, rsh, arsh by 1", 13839 .insns = { 13840 BPF_MOV64_IMM(BPF_REG_0, 1), 13841 BPF_MOV64_IMM(BPF_REG_1, 0xff), 13842 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 1), 13843 BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 1), 13844 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0x3fc, 1), 13845 BPF_EXIT_INSN(), 13846 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 1), 13847 BPF_ALU32_IMM(BPF_RSH, BPF_REG_1, 1), 13848 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0xff, 1), 13849 BPF_EXIT_INSN(), 13850 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_1, 1), 13851 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0x7f, 1), 13852 BPF_EXIT_INSN(), 13853 BPF_MOV64_IMM(BPF_REG_0, 2), 13854 BPF_EXIT_INSN(), 13855 }, 13856 .result = ACCEPT, 13857 .retval = 2, 13858 }, 13859 { 13860 "jit: mov32 for ldimm64, 1", 13861 .insns = { 13862 BPF_MOV64_IMM(BPF_REG_0, 2), 13863 BPF_LD_IMM64(BPF_REG_1, 0xfeffffffffffffffULL), 13864 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 32), 13865 BPF_LD_IMM64(BPF_REG_2, 0xfeffffffULL), 13866 BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 13867 BPF_MOV64_IMM(BPF_REG_0, 1), 13868 BPF_EXIT_INSN(), 13869 }, 13870 .result = ACCEPT, 13871 .retval = 2, 13872 }, 13873 { 13874 "jit: mov32 for ldimm64, 2", 13875 .insns = { 13876 BPF_MOV64_IMM(BPF_REG_0, 1), 13877 BPF_LD_IMM64(BPF_REG_1, 0x1ffffffffULL), 13878 BPF_LD_IMM64(BPF_REG_2, 0xffffffffULL), 13879 BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 13880 BPF_MOV64_IMM(BPF_REG_0, 2), 13881 BPF_EXIT_INSN(), 13882 }, 13883 .result = ACCEPT, 13884 .retval = 2, 13885 }, 13886 { 13887 "jit: various mul tests", 13888 .insns = { 13889 BPF_LD_IMM64(BPF_REG_2, 0xeeff0d413122ULL), 13890 BPF_LD_IMM64(BPF_REG_0, 0xfefefeULL), 13891 BPF_LD_IMM64(BPF_REG_1, 0xefefefULL), 13892 BPF_ALU64_REG(BPF_MUL, BPF_REG_0, BPF_REG_1), 13893 BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_2, 2), 13894 BPF_MOV64_IMM(BPF_REG_0, 1), 13895 BPF_EXIT_INSN(), 13896 BPF_LD_IMM64(BPF_REG_3, 0xfefefeULL), 13897 BPF_ALU64_REG(BPF_MUL, BPF_REG_3, BPF_REG_1), 13898 BPF_JMP_REG(BPF_JEQ, BPF_REG_3, BPF_REG_2, 2), 13899 BPF_MOV64_IMM(BPF_REG_0, 1), 13900 BPF_EXIT_INSN(), 13901 BPF_MOV32_REG(BPF_REG_2, BPF_REG_2), 13902 BPF_LD_IMM64(BPF_REG_0, 0xfefefeULL), 13903 BPF_ALU32_REG(BPF_MUL, BPF_REG_0, BPF_REG_1), 13904 BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_2, 2), 13905 BPF_MOV64_IMM(BPF_REG_0, 1), 13906 BPF_EXIT_INSN(), 13907 BPF_LD_IMM64(BPF_REG_3, 0xfefefeULL), 13908 BPF_ALU32_REG(BPF_MUL, BPF_REG_3, BPF_REG_1), 13909 BPF_JMP_REG(BPF_JEQ, BPF_REG_3, BPF_REG_2, 2), 13910 BPF_MOV64_IMM(BPF_REG_0, 1), 13911 BPF_EXIT_INSN(), 13912 BPF_LD_IMM64(BPF_REG_0, 0x952a7bbcULL), 13913 BPF_LD_IMM64(BPF_REG_1, 0xfefefeULL), 13914 BPF_LD_IMM64(BPF_REG_2, 0xeeff0d413122ULL), 13915 BPF_ALU32_REG(BPF_MUL, BPF_REG_2, BPF_REG_1), 13916 BPF_JMP_REG(BPF_JEQ, BPF_REG_2, BPF_REG_0, 2), 13917 BPF_MOV64_IMM(BPF_REG_0, 1), 13918 BPF_EXIT_INSN(), 13919 BPF_MOV64_IMM(BPF_REG_0, 2), 13920 BPF_EXIT_INSN(), 13921 }, 13922 .result = ACCEPT, 13923 .retval = 2, 13924 }, 13925 { 13926 "xadd/w check unaligned stack", 13927 .insns = { 13928 BPF_MOV64_IMM(BPF_REG_0, 1), 13929 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 13930 BPF_STX_XADD(BPF_W, BPF_REG_10, BPF_REG_0, -7), 13931 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 13932 BPF_EXIT_INSN(), 13933 }, 13934 .result = REJECT, 13935 .errstr = "misaligned stack access off", 13936 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13937 }, 13938 { 13939 "xadd/w check unaligned map", 13940 .insns = { 13941 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 13942 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13943 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13944 BPF_LD_MAP_FD(BPF_REG_1, 0), 13945 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13946 BPF_FUNC_map_lookup_elem), 13947 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 13948 BPF_EXIT_INSN(), 13949 BPF_MOV64_IMM(BPF_REG_1, 1), 13950 BPF_STX_XADD(BPF_W, BPF_REG_0, BPF_REG_1, 3), 13951 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 3), 13952 BPF_EXIT_INSN(), 13953 }, 13954 .fixup_map_hash_8b = { 3 }, 13955 .result = REJECT, 13956 .errstr = "misaligned value access off", 13957 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13958 }, 13959 { 13960 "xadd/w check unaligned pkt", 13961 .insns = { 13962 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13963 offsetof(struct xdp_md, data)), 13964 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 13965 offsetof(struct xdp_md, data_end)), 13966 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 13967 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 13968 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 2), 13969 BPF_MOV64_IMM(BPF_REG_0, 99), 13970 BPF_JMP_IMM(BPF_JA, 0, 0, 6), 13971 BPF_MOV64_IMM(BPF_REG_0, 1), 13972 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 13973 BPF_ST_MEM(BPF_W, BPF_REG_2, 3, 0), 13974 BPF_STX_XADD(BPF_W, BPF_REG_2, BPF_REG_0, 1), 13975 BPF_STX_XADD(BPF_W, BPF_REG_2, BPF_REG_0, 2), 13976 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_2, 1), 13977 BPF_EXIT_INSN(), 13978 }, 13979 .result = REJECT, 13980 .errstr = "BPF_XADD stores into R2 pkt is not allowed", 13981 .prog_type = BPF_PROG_TYPE_XDP, 13982 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 13983 }, 13984 { 13985 "xadd/w check whether src/dst got mangled, 1", 13986 .insns = { 13987 BPF_MOV64_IMM(BPF_REG_0, 1), 13988 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 13989 BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 13990 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 13991 BPF_STX_XADD(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 13992 BPF_STX_XADD(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 13993 BPF_JMP_REG(BPF_JNE, BPF_REG_6, BPF_REG_0, 3), 13994 BPF_JMP_REG(BPF_JNE, BPF_REG_7, BPF_REG_10, 2), 13995 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 13996 BPF_EXIT_INSN(), 13997 BPF_MOV64_IMM(BPF_REG_0, 42), 13998 BPF_EXIT_INSN(), 13999 }, 14000 .result = ACCEPT, 14001 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14002 .retval = 3, 14003 }, 14004 { 14005 "xadd/w check whether src/dst got mangled, 2", 14006 .insns = { 14007 BPF_MOV64_IMM(BPF_REG_0, 1), 14008 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 14009 BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 14010 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -8), 14011 BPF_STX_XADD(BPF_W, BPF_REG_10, BPF_REG_0, -8), 14012 BPF_STX_XADD(BPF_W, BPF_REG_10, BPF_REG_0, -8), 14013 BPF_JMP_REG(BPF_JNE, BPF_REG_6, BPF_REG_0, 3), 14014 BPF_JMP_REG(BPF_JNE, BPF_REG_7, BPF_REG_10, 2), 14015 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -8), 14016 BPF_EXIT_INSN(), 14017 BPF_MOV64_IMM(BPF_REG_0, 42), 14018 BPF_EXIT_INSN(), 14019 }, 14020 .result = ACCEPT, 14021 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14022 .retval = 3, 14023 }, 14024 { 14025 "bpf_get_stack return R0 within range", 14026 .insns = { 14027 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 14028 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 14029 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 14030 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 14031 BPF_LD_MAP_FD(BPF_REG_1, 0), 14032 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 14033 BPF_FUNC_map_lookup_elem), 14034 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 28), 14035 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0), 14036 BPF_MOV64_IMM(BPF_REG_9, sizeof(struct test_val)), 14037 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 14038 BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 14039 BPF_MOV64_IMM(BPF_REG_3, sizeof(struct test_val)), 14040 BPF_MOV64_IMM(BPF_REG_4, 256), 14041 BPF_EMIT_CALL(BPF_FUNC_get_stack), 14042 BPF_MOV64_IMM(BPF_REG_1, 0), 14043 BPF_MOV64_REG(BPF_REG_8, BPF_REG_0), 14044 BPF_ALU64_IMM(BPF_LSH, BPF_REG_8, 32), 14045 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_8, 32), 14046 BPF_JMP_REG(BPF_JSLT, BPF_REG_1, BPF_REG_8, 16), 14047 BPF_ALU64_REG(BPF_SUB, BPF_REG_9, BPF_REG_8), 14048 BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 14049 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_8), 14050 BPF_MOV64_REG(BPF_REG_1, BPF_REG_9), 14051 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 32), 14052 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_1, 32), 14053 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 14054 BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_1), 14055 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 14056 BPF_MOV64_IMM(BPF_REG_5, sizeof(struct test_val)), 14057 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_5), 14058 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 4), 14059 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 14060 BPF_MOV64_REG(BPF_REG_3, BPF_REG_9), 14061 BPF_MOV64_IMM(BPF_REG_4, 0), 14062 BPF_EMIT_CALL(BPF_FUNC_get_stack), 14063 BPF_EXIT_INSN(), 14064 }, 14065 .fixup_map_hash_48b = { 4 }, 14066 .result = ACCEPT, 14067 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 14068 }, 14069 { 14070 "ld_abs: invalid op 1", 14071 .insns = { 14072 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 14073 BPF_LD_ABS(BPF_DW, 0), 14074 BPF_EXIT_INSN(), 14075 }, 14076 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14077 .result = REJECT, 14078 .errstr = "unknown opcode", 14079 }, 14080 { 14081 "ld_abs: invalid op 2", 14082 .insns = { 14083 BPF_MOV32_IMM(BPF_REG_0, 256), 14084 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 14085 BPF_LD_IND(BPF_DW, BPF_REG_0, 0), 14086 BPF_EXIT_INSN(), 14087 }, 14088 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14089 .result = REJECT, 14090 .errstr = "unknown opcode", 14091 }, 14092 { 14093 "ld_abs: nmap reduced", 14094 .insns = { 14095 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 14096 BPF_LD_ABS(BPF_H, 12), 14097 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x806, 28), 14098 BPF_LD_ABS(BPF_H, 12), 14099 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x806, 26), 14100 BPF_MOV32_IMM(BPF_REG_0, 18), 14101 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -64), 14102 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -64), 14103 BPF_LD_IND(BPF_W, BPF_REG_7, 14), 14104 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -60), 14105 BPF_MOV32_IMM(BPF_REG_0, 280971478), 14106 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -56), 14107 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -56), 14108 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -60), 14109 BPF_ALU32_REG(BPF_SUB, BPF_REG_0, BPF_REG_7), 14110 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 15), 14111 BPF_LD_ABS(BPF_H, 12), 14112 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x806, 13), 14113 BPF_MOV32_IMM(BPF_REG_0, 22), 14114 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -56), 14115 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -56), 14116 BPF_LD_IND(BPF_H, BPF_REG_7, 14), 14117 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -52), 14118 BPF_MOV32_IMM(BPF_REG_0, 17366), 14119 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -48), 14120 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -48), 14121 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -52), 14122 BPF_ALU32_REG(BPF_SUB, BPF_REG_0, BPF_REG_7), 14123 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 14124 BPF_MOV32_IMM(BPF_REG_0, 256), 14125 BPF_EXIT_INSN(), 14126 BPF_MOV32_IMM(BPF_REG_0, 0), 14127 BPF_EXIT_INSN(), 14128 }, 14129 .data = { 14130 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x06, 0, 14131 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14132 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6, 14133 }, 14134 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14135 .result = ACCEPT, 14136 .retval = 256, 14137 }, 14138 { 14139 "ld_abs: div + abs, test 1", 14140 .insns = { 14141 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 14142 BPF_LD_ABS(BPF_B, 3), 14143 BPF_ALU64_IMM(BPF_MOV, BPF_REG_2, 2), 14144 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_2), 14145 BPF_ALU64_REG(BPF_MOV, BPF_REG_8, BPF_REG_0), 14146 BPF_LD_ABS(BPF_B, 4), 14147 BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_0), 14148 BPF_LD_IND(BPF_B, BPF_REG_8, -70), 14149 BPF_EXIT_INSN(), 14150 }, 14151 .data = { 14152 10, 20, 30, 40, 50, 14153 }, 14154 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14155 .result = ACCEPT, 14156 .retval = 10, 14157 }, 14158 { 14159 "ld_abs: div + abs, test 2", 14160 .insns = { 14161 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 14162 BPF_LD_ABS(BPF_B, 3), 14163 BPF_ALU64_IMM(BPF_MOV, BPF_REG_2, 2), 14164 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_2), 14165 BPF_ALU64_REG(BPF_MOV, BPF_REG_8, BPF_REG_0), 14166 BPF_LD_ABS(BPF_B, 128), 14167 BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_0), 14168 BPF_LD_IND(BPF_B, BPF_REG_8, -70), 14169 BPF_EXIT_INSN(), 14170 }, 14171 .data = { 14172 10, 20, 30, 40, 50, 14173 }, 14174 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14175 .result = ACCEPT, 14176 .retval = 0, 14177 }, 14178 { 14179 "ld_abs: div + abs, test 3", 14180 .insns = { 14181 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 14182 BPF_ALU64_IMM(BPF_MOV, BPF_REG_7, 0), 14183 BPF_LD_ABS(BPF_B, 3), 14184 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_7), 14185 BPF_EXIT_INSN(), 14186 }, 14187 .data = { 14188 10, 20, 30, 40, 50, 14189 }, 14190 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14191 .result = ACCEPT, 14192 .retval = 0, 14193 }, 14194 { 14195 "ld_abs: div + abs, test 4", 14196 .insns = { 14197 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 14198 BPF_ALU64_IMM(BPF_MOV, BPF_REG_7, 0), 14199 BPF_LD_ABS(BPF_B, 256), 14200 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_7), 14201 BPF_EXIT_INSN(), 14202 }, 14203 .data = { 14204 10, 20, 30, 40, 50, 14205 }, 14206 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14207 .result = ACCEPT, 14208 .retval = 0, 14209 }, 14210 { 14211 "ld_abs: vlan + abs, test 1", 14212 .insns = { }, 14213 .data = { 14214 0x34, 14215 }, 14216 .fill_helper = bpf_fill_ld_abs_vlan_push_pop, 14217 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14218 .result = ACCEPT, 14219 .retval = 0xbef, 14220 }, 14221 { 14222 "ld_abs: vlan + abs, test 2", 14223 .insns = { 14224 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 14225 BPF_LD_ABS(BPF_B, 0), 14226 BPF_LD_ABS(BPF_H, 0), 14227 BPF_LD_ABS(BPF_W, 0), 14228 BPF_MOV64_REG(BPF_REG_7, BPF_REG_6), 14229 BPF_MOV64_IMM(BPF_REG_6, 0), 14230 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 14231 BPF_MOV64_IMM(BPF_REG_2, 1), 14232 BPF_MOV64_IMM(BPF_REG_3, 2), 14233 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 14234 BPF_FUNC_skb_vlan_push), 14235 BPF_MOV64_REG(BPF_REG_6, BPF_REG_7), 14236 BPF_LD_ABS(BPF_B, 0), 14237 BPF_LD_ABS(BPF_H, 0), 14238 BPF_LD_ABS(BPF_W, 0), 14239 BPF_MOV64_IMM(BPF_REG_0, 42), 14240 BPF_EXIT_INSN(), 14241 }, 14242 .data = { 14243 0x34, 14244 }, 14245 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14246 .result = ACCEPT, 14247 .retval = 42, 14248 }, 14249 { 14250 "ld_abs: jump around ld_abs", 14251 .insns = { }, 14252 .data = { 14253 10, 11, 14254 }, 14255 .fill_helper = bpf_fill_jump_around_ld_abs, 14256 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14257 .result = ACCEPT, 14258 .retval = 10, 14259 }, 14260 { 14261 "ld_dw: xor semi-random 64 bit imms, test 1", 14262 .insns = { }, 14263 .data = { }, 14264 .fill_helper = bpf_fill_rand_ld_dw, 14265 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14266 .result = ACCEPT, 14267 .retval = 4090, 14268 }, 14269 { 14270 "ld_dw: xor semi-random 64 bit imms, test 2", 14271 .insns = { }, 14272 .data = { }, 14273 .fill_helper = bpf_fill_rand_ld_dw, 14274 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14275 .result = ACCEPT, 14276 .retval = 2047, 14277 }, 14278 { 14279 "ld_dw: xor semi-random 64 bit imms, test 3", 14280 .insns = { }, 14281 .data = { }, 14282 .fill_helper = bpf_fill_rand_ld_dw, 14283 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14284 .result = ACCEPT, 14285 .retval = 511, 14286 }, 14287 { 14288 "ld_dw: xor semi-random 64 bit imms, test 4", 14289 .insns = { }, 14290 .data = { }, 14291 .fill_helper = bpf_fill_rand_ld_dw, 14292 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14293 .result = ACCEPT, 14294 .retval = 5, 14295 }, 14296 { 14297 "pass unmodified ctx pointer to helper", 14298 .insns = { 14299 BPF_MOV64_IMM(BPF_REG_2, 0), 14300 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 14301 BPF_FUNC_csum_update), 14302 BPF_MOV64_IMM(BPF_REG_0, 0), 14303 BPF_EXIT_INSN(), 14304 }, 14305 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14306 .result = ACCEPT, 14307 }, 14308 { 14309 "reference tracking: leak potential reference", 14310 .insns = { 14311 BPF_SK_LOOKUP, 14312 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), /* leak reference */ 14313 BPF_EXIT_INSN(), 14314 }, 14315 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14316 .errstr = "Unreleased reference", 14317 .result = REJECT, 14318 }, 14319 { 14320 "reference tracking: leak potential reference on stack", 14321 .insns = { 14322 BPF_SK_LOOKUP, 14323 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 14324 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 14325 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_0, 0), 14326 BPF_MOV64_IMM(BPF_REG_0, 0), 14327 BPF_EXIT_INSN(), 14328 }, 14329 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14330 .errstr = "Unreleased reference", 14331 .result = REJECT, 14332 }, 14333 { 14334 "reference tracking: leak potential reference on stack 2", 14335 .insns = { 14336 BPF_SK_LOOKUP, 14337 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 14338 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 14339 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_0, 0), 14340 BPF_MOV64_IMM(BPF_REG_0, 0), 14341 BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0), 14342 BPF_EXIT_INSN(), 14343 }, 14344 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14345 .errstr = "Unreleased reference", 14346 .result = REJECT, 14347 }, 14348 { 14349 "reference tracking: zero potential reference", 14350 .insns = { 14351 BPF_SK_LOOKUP, 14352 BPF_MOV64_IMM(BPF_REG_0, 0), /* leak reference */ 14353 BPF_EXIT_INSN(), 14354 }, 14355 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14356 .errstr = "Unreleased reference", 14357 .result = REJECT, 14358 }, 14359 { 14360 "reference tracking: copy and zero potential references", 14361 .insns = { 14362 BPF_SK_LOOKUP, 14363 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0), 14364 BPF_MOV64_IMM(BPF_REG_0, 0), 14365 BPF_MOV64_IMM(BPF_REG_7, 0), /* leak reference */ 14366 BPF_EXIT_INSN(), 14367 }, 14368 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14369 .errstr = "Unreleased reference", 14370 .result = REJECT, 14371 }, 14372 { 14373 "reference tracking: release reference without check", 14374 .insns = { 14375 BPF_SK_LOOKUP, 14376 /* reference in r0 may be NULL */ 14377 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 14378 BPF_MOV64_IMM(BPF_REG_2, 0), 14379 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14380 BPF_EXIT_INSN(), 14381 }, 14382 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14383 .errstr = "type=sock_or_null expected=sock", 14384 .result = REJECT, 14385 }, 14386 { 14387 "reference tracking: release reference", 14388 .insns = { 14389 BPF_SK_LOOKUP, 14390 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 14391 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 14392 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14393 BPF_EXIT_INSN(), 14394 }, 14395 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14396 .result = ACCEPT, 14397 }, 14398 { 14399 "reference tracking: release reference 2", 14400 .insns = { 14401 BPF_SK_LOOKUP, 14402 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 14403 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 14404 BPF_EXIT_INSN(), 14405 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14406 BPF_EXIT_INSN(), 14407 }, 14408 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14409 .result = ACCEPT, 14410 }, 14411 { 14412 "reference tracking: release reference twice", 14413 .insns = { 14414 BPF_SK_LOOKUP, 14415 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 14416 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 14417 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 14418 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14419 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 14420 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14421 BPF_EXIT_INSN(), 14422 }, 14423 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14424 .errstr = "type=inv expected=sock", 14425 .result = REJECT, 14426 }, 14427 { 14428 "reference tracking: release reference twice inside branch", 14429 .insns = { 14430 BPF_SK_LOOKUP, 14431 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 14432 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 14433 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), /* goto end */ 14434 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14435 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 14436 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14437 BPF_EXIT_INSN(), 14438 }, 14439 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14440 .errstr = "type=inv expected=sock", 14441 .result = REJECT, 14442 }, 14443 { 14444 "reference tracking: alloc, check, free in one subbranch", 14445 .insns = { 14446 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 14447 offsetof(struct __sk_buff, data)), 14448 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 14449 offsetof(struct __sk_buff, data_end)), 14450 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 14451 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 16), 14452 /* if (offsetof(skb, mark) > data_len) exit; */ 14453 BPF_JMP_REG(BPF_JLE, BPF_REG_0, BPF_REG_3, 1), 14454 BPF_EXIT_INSN(), 14455 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_2, 14456 offsetof(struct __sk_buff, mark)), 14457 BPF_SK_LOOKUP, 14458 BPF_JMP_IMM(BPF_JEQ, BPF_REG_6, 0, 1), /* mark == 0? */ 14459 /* Leak reference in R0 */ 14460 BPF_EXIT_INSN(), 14461 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), /* sk NULL? */ 14462 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 14463 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14464 BPF_EXIT_INSN(), 14465 }, 14466 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14467 .errstr = "Unreleased reference", 14468 .result = REJECT, 14469 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 14470 }, 14471 { 14472 "reference tracking: alloc, check, free in both subbranches", 14473 .insns = { 14474 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 14475 offsetof(struct __sk_buff, data)), 14476 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 14477 offsetof(struct __sk_buff, data_end)), 14478 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 14479 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 16), 14480 /* if (offsetof(skb, mark) > data_len) exit; */ 14481 BPF_JMP_REG(BPF_JLE, BPF_REG_0, BPF_REG_3, 1), 14482 BPF_EXIT_INSN(), 14483 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_2, 14484 offsetof(struct __sk_buff, mark)), 14485 BPF_SK_LOOKUP, 14486 BPF_JMP_IMM(BPF_JEQ, BPF_REG_6, 0, 4), /* mark == 0? */ 14487 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), /* sk NULL? */ 14488 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 14489 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14490 BPF_EXIT_INSN(), 14491 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), /* sk NULL? */ 14492 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 14493 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14494 BPF_EXIT_INSN(), 14495 }, 14496 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14497 .result = ACCEPT, 14498 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 14499 }, 14500 { 14501 "reference tracking in call: free reference in subprog", 14502 .insns = { 14503 BPF_SK_LOOKUP, 14504 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), /* unchecked reference */ 14505 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 14506 BPF_MOV64_IMM(BPF_REG_0, 0), 14507 BPF_EXIT_INSN(), 14508 14509 /* subprog 1 */ 14510 BPF_MOV64_REG(BPF_REG_2, BPF_REG_1), 14511 BPF_JMP_IMM(BPF_JEQ, BPF_REG_2, 0, 1), 14512 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14513 BPF_EXIT_INSN(), 14514 }, 14515 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14516 .result = ACCEPT, 14517 }, 14518 { 14519 "pass modified ctx pointer to helper, 1", 14520 .insns = { 14521 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -612), 14522 BPF_MOV64_IMM(BPF_REG_2, 0), 14523 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 14524 BPF_FUNC_csum_update), 14525 BPF_MOV64_IMM(BPF_REG_0, 0), 14526 BPF_EXIT_INSN(), 14527 }, 14528 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14529 .result = REJECT, 14530 .errstr = "dereference of modified ctx ptr", 14531 }, 14532 { 14533 "pass modified ctx pointer to helper, 2", 14534 .insns = { 14535 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -612), 14536 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 14537 BPF_FUNC_get_socket_cookie), 14538 BPF_MOV64_IMM(BPF_REG_0, 0), 14539 BPF_EXIT_INSN(), 14540 }, 14541 .result_unpriv = REJECT, 14542 .result = REJECT, 14543 .errstr_unpriv = "dereference of modified ctx ptr", 14544 .errstr = "dereference of modified ctx ptr", 14545 }, 14546 { 14547 "pass modified ctx pointer to helper, 3", 14548 .insns = { 14549 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 0), 14550 BPF_ALU64_IMM(BPF_AND, BPF_REG_3, 4), 14551 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 14552 BPF_MOV64_IMM(BPF_REG_2, 0), 14553 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 14554 BPF_FUNC_csum_update), 14555 BPF_MOV64_IMM(BPF_REG_0, 0), 14556 BPF_EXIT_INSN(), 14557 }, 14558 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14559 .result = REJECT, 14560 .errstr = "variable ctx access var_off=(0x0; 0x4)", 14561 }, 14562 { 14563 "mov64 src == dst", 14564 .insns = { 14565 BPF_MOV64_IMM(BPF_REG_2, 0), 14566 BPF_MOV64_REG(BPF_REG_2, BPF_REG_2), 14567 // Check bounds are OK 14568 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 14569 BPF_MOV64_IMM(BPF_REG_0, 0), 14570 BPF_EXIT_INSN(), 14571 }, 14572 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14573 .result = ACCEPT, 14574 }, 14575 { 14576 "mov64 src != dst", 14577 .insns = { 14578 BPF_MOV64_IMM(BPF_REG_3, 0), 14579 BPF_MOV64_REG(BPF_REG_2, BPF_REG_3), 14580 // Check bounds are OK 14581 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 14582 BPF_MOV64_IMM(BPF_REG_0, 0), 14583 BPF_EXIT_INSN(), 14584 }, 14585 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14586 .result = ACCEPT, 14587 }, 14588 { 14589 "allocated_stack", 14590 .insns = { 14591 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 14592 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 14593 BPF_ALU64_REG(BPF_MOV, BPF_REG_7, BPF_REG_0), 14594 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 14595 BPF_MOV64_IMM(BPF_REG_0, 0), 14596 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_6, -8), 14597 BPF_LDX_MEM(BPF_DW, BPF_REG_6, BPF_REG_10, -8), 14598 BPF_STX_MEM(BPF_B, BPF_REG_10, BPF_REG_7, -9), 14599 BPF_LDX_MEM(BPF_B, BPF_REG_7, BPF_REG_10, -9), 14600 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 0), 14601 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 0), 14602 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 0), 14603 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 0), 14604 BPF_EXIT_INSN(), 14605 }, 14606 .result = ACCEPT, 14607 .result_unpriv = ACCEPT, 14608 .insn_processed = 15, 14609 }, 14610 { 14611 "masking, test out of bounds 1", 14612 .insns = { 14613 BPF_MOV32_IMM(BPF_REG_1, 5), 14614 BPF_MOV32_IMM(BPF_REG_2, 5 - 1), 14615 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14616 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14617 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14618 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14619 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14620 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14621 BPF_EXIT_INSN(), 14622 }, 14623 .result = ACCEPT, 14624 .retval = 0, 14625 }, 14626 { 14627 "masking, test out of bounds 2", 14628 .insns = { 14629 BPF_MOV32_IMM(BPF_REG_1, 1), 14630 BPF_MOV32_IMM(BPF_REG_2, 1 - 1), 14631 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14632 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14633 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14634 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14635 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14636 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14637 BPF_EXIT_INSN(), 14638 }, 14639 .result = ACCEPT, 14640 .retval = 0, 14641 }, 14642 { 14643 "masking, test out of bounds 3", 14644 .insns = { 14645 BPF_MOV32_IMM(BPF_REG_1, 0xffffffff), 14646 BPF_MOV32_IMM(BPF_REG_2, 0xffffffff - 1), 14647 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14648 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14649 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14650 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14651 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14652 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14653 BPF_EXIT_INSN(), 14654 }, 14655 .result = ACCEPT, 14656 .retval = 0, 14657 }, 14658 { 14659 "masking, test out of bounds 4", 14660 .insns = { 14661 BPF_MOV32_IMM(BPF_REG_1, 0xffffffff), 14662 BPF_MOV32_IMM(BPF_REG_2, 1 - 1), 14663 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14664 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14665 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14666 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14667 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14668 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14669 BPF_EXIT_INSN(), 14670 }, 14671 .result = ACCEPT, 14672 .retval = 0, 14673 }, 14674 { 14675 "masking, test out of bounds 5", 14676 .insns = { 14677 BPF_MOV32_IMM(BPF_REG_1, -1), 14678 BPF_MOV32_IMM(BPF_REG_2, 1 - 1), 14679 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14680 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14681 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14682 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14683 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14684 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14685 BPF_EXIT_INSN(), 14686 }, 14687 .result = ACCEPT, 14688 .retval = 0, 14689 }, 14690 { 14691 "masking, test out of bounds 6", 14692 .insns = { 14693 BPF_MOV32_IMM(BPF_REG_1, -1), 14694 BPF_MOV32_IMM(BPF_REG_2, 0xffffffff - 1), 14695 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14696 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14697 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14698 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14699 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14700 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14701 BPF_EXIT_INSN(), 14702 }, 14703 .result = ACCEPT, 14704 .retval = 0, 14705 }, 14706 { 14707 "masking, test out of bounds 7", 14708 .insns = { 14709 BPF_MOV64_IMM(BPF_REG_1, 5), 14710 BPF_MOV32_IMM(BPF_REG_2, 5 - 1), 14711 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14712 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14713 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14714 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14715 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14716 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14717 BPF_EXIT_INSN(), 14718 }, 14719 .result = ACCEPT, 14720 .retval = 0, 14721 }, 14722 { 14723 "masking, test out of bounds 8", 14724 .insns = { 14725 BPF_MOV64_IMM(BPF_REG_1, 1), 14726 BPF_MOV32_IMM(BPF_REG_2, 1 - 1), 14727 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14728 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14729 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14730 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14731 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14732 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14733 BPF_EXIT_INSN(), 14734 }, 14735 .result = ACCEPT, 14736 .retval = 0, 14737 }, 14738 { 14739 "masking, test out of bounds 9", 14740 .insns = { 14741 BPF_MOV64_IMM(BPF_REG_1, 0xffffffff), 14742 BPF_MOV32_IMM(BPF_REG_2, 0xffffffff - 1), 14743 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14744 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14745 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14746 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14747 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14748 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14749 BPF_EXIT_INSN(), 14750 }, 14751 .result = ACCEPT, 14752 .retval = 0, 14753 }, 14754 { 14755 "masking, test out of bounds 10", 14756 .insns = { 14757 BPF_MOV64_IMM(BPF_REG_1, 0xffffffff), 14758 BPF_MOV32_IMM(BPF_REG_2, 1 - 1), 14759 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14760 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14761 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14762 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14763 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14764 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14765 BPF_EXIT_INSN(), 14766 }, 14767 .result = ACCEPT, 14768 .retval = 0, 14769 }, 14770 { 14771 "masking, test out of bounds 11", 14772 .insns = { 14773 BPF_MOV64_IMM(BPF_REG_1, -1), 14774 BPF_MOV32_IMM(BPF_REG_2, 1 - 1), 14775 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14776 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14777 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14778 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14779 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14780 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14781 BPF_EXIT_INSN(), 14782 }, 14783 .result = ACCEPT, 14784 .retval = 0, 14785 }, 14786 { 14787 "masking, test out of bounds 12", 14788 .insns = { 14789 BPF_MOV64_IMM(BPF_REG_1, -1), 14790 BPF_MOV32_IMM(BPF_REG_2, 0xffffffff - 1), 14791 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14792 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14793 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14794 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14795 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14796 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14797 BPF_EXIT_INSN(), 14798 }, 14799 .result = ACCEPT, 14800 .retval = 0, 14801 }, 14802 { 14803 "masking, test in bounds 1", 14804 .insns = { 14805 BPF_MOV32_IMM(BPF_REG_1, 4), 14806 BPF_MOV32_IMM(BPF_REG_2, 5 - 1), 14807 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14808 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14809 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14810 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14811 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14812 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14813 BPF_EXIT_INSN(), 14814 }, 14815 .result = ACCEPT, 14816 .retval = 4, 14817 }, 14818 { 14819 "masking, test in bounds 2", 14820 .insns = { 14821 BPF_MOV32_IMM(BPF_REG_1, 0), 14822 BPF_MOV32_IMM(BPF_REG_2, 0xffffffff - 1), 14823 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14824 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14825 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14826 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14827 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14828 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14829 BPF_EXIT_INSN(), 14830 }, 14831 .result = ACCEPT, 14832 .retval = 0, 14833 }, 14834 { 14835 "masking, test in bounds 3", 14836 .insns = { 14837 BPF_MOV32_IMM(BPF_REG_1, 0xfffffffe), 14838 BPF_MOV32_IMM(BPF_REG_2, 0xffffffff - 1), 14839 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14840 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14841 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14842 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14843 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14844 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14845 BPF_EXIT_INSN(), 14846 }, 14847 .result = ACCEPT, 14848 .retval = 0xfffffffe, 14849 }, 14850 { 14851 "masking, test in bounds 4", 14852 .insns = { 14853 BPF_MOV32_IMM(BPF_REG_1, 0xabcde), 14854 BPF_MOV32_IMM(BPF_REG_2, 0xabcdef - 1), 14855 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14856 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14857 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14858 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14859 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14860 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14861 BPF_EXIT_INSN(), 14862 }, 14863 .result = ACCEPT, 14864 .retval = 0xabcde, 14865 }, 14866 { 14867 "masking, test in bounds 5", 14868 .insns = { 14869 BPF_MOV32_IMM(BPF_REG_1, 0), 14870 BPF_MOV32_IMM(BPF_REG_2, 1 - 1), 14871 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14872 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14873 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14874 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14875 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14876 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14877 BPF_EXIT_INSN(), 14878 }, 14879 .result = ACCEPT, 14880 .retval = 0, 14881 }, 14882 { 14883 "masking, test in bounds 6", 14884 .insns = { 14885 BPF_MOV32_IMM(BPF_REG_1, 46), 14886 BPF_MOV32_IMM(BPF_REG_2, 47 - 1), 14887 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14888 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14889 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14890 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14891 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14892 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14893 BPF_EXIT_INSN(), 14894 }, 14895 .result = ACCEPT, 14896 .retval = 46, 14897 }, 14898 { 14899 "masking, test in bounds 7", 14900 .insns = { 14901 BPF_MOV64_IMM(BPF_REG_3, -46), 14902 BPF_ALU64_IMM(BPF_MUL, BPF_REG_3, -1), 14903 BPF_MOV32_IMM(BPF_REG_2, 47 - 1), 14904 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_3), 14905 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_3), 14906 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14907 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14908 BPF_ALU64_REG(BPF_AND, BPF_REG_3, BPF_REG_2), 14909 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3), 14910 BPF_EXIT_INSN(), 14911 }, 14912 .result = ACCEPT, 14913 .retval = 46, 14914 }, 14915 { 14916 "masking, test in bounds 8", 14917 .insns = { 14918 BPF_MOV64_IMM(BPF_REG_3, -47), 14919 BPF_ALU64_IMM(BPF_MUL, BPF_REG_3, -1), 14920 BPF_MOV32_IMM(BPF_REG_2, 47 - 1), 14921 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_3), 14922 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_3), 14923 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14924 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14925 BPF_ALU64_REG(BPF_AND, BPF_REG_3, BPF_REG_2), 14926 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3), 14927 BPF_EXIT_INSN(), 14928 }, 14929 .result = ACCEPT, 14930 .retval = 0, 14931 }, 14932 { 14933 "reference tracking in call: free reference in subprog and outside", 14934 .insns = { 14935 BPF_SK_LOOKUP, 14936 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), /* unchecked reference */ 14937 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 14938 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 14939 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 14940 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14941 BPF_EXIT_INSN(), 14942 14943 /* subprog 1 */ 14944 BPF_MOV64_REG(BPF_REG_2, BPF_REG_1), 14945 BPF_JMP_IMM(BPF_JEQ, BPF_REG_2, 0, 1), 14946 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14947 BPF_EXIT_INSN(), 14948 }, 14949 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14950 .errstr = "type=inv expected=sock", 14951 .result = REJECT, 14952 }, 14953 { 14954 "reference tracking in call: alloc & leak reference in subprog", 14955 .insns = { 14956 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 14957 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 14958 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 14959 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 14960 BPF_MOV64_IMM(BPF_REG_0, 0), 14961 BPF_EXIT_INSN(), 14962 14963 /* subprog 1 */ 14964 BPF_MOV64_REG(BPF_REG_6, BPF_REG_4), 14965 BPF_SK_LOOKUP, 14966 /* spill unchecked sk_ptr into stack of caller */ 14967 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 14968 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 14969 BPF_EXIT_INSN(), 14970 }, 14971 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14972 .errstr = "Unreleased reference", 14973 .result = REJECT, 14974 }, 14975 { 14976 "reference tracking in call: alloc in subprog, release outside", 14977 .insns = { 14978 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 14979 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 14980 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 14981 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 14982 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14983 BPF_EXIT_INSN(), 14984 14985 /* subprog 1 */ 14986 BPF_SK_LOOKUP, 14987 BPF_EXIT_INSN(), /* return sk */ 14988 }, 14989 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14990 .retval = POINTER_VALUE, 14991 .result = ACCEPT, 14992 }, 14993 { 14994 "reference tracking in call: sk_ptr leak into caller stack", 14995 .insns = { 14996 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 14997 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 14998 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 14999 BPF_MOV64_IMM(BPF_REG_0, 0), 15000 BPF_EXIT_INSN(), 15001 15002 /* subprog 1 */ 15003 BPF_MOV64_REG(BPF_REG_5, BPF_REG_10), 15004 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, -8), 15005 BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_4, 0), 15006 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 5), 15007 /* spill unchecked sk_ptr into stack of caller */ 15008 BPF_MOV64_REG(BPF_REG_5, BPF_REG_10), 15009 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, -8), 15010 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_5, 0), 15011 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_0, 0), 15012 BPF_EXIT_INSN(), 15013 15014 /* subprog 2 */ 15015 BPF_SK_LOOKUP, 15016 BPF_EXIT_INSN(), 15017 }, 15018 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15019 .errstr = "Unreleased reference", 15020 .result = REJECT, 15021 }, 15022 { 15023 "reference tracking in call: sk_ptr spill into caller stack", 15024 .insns = { 15025 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 15026 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 15027 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 15028 BPF_MOV64_IMM(BPF_REG_0, 0), 15029 BPF_EXIT_INSN(), 15030 15031 /* subprog 1 */ 15032 BPF_MOV64_REG(BPF_REG_5, BPF_REG_10), 15033 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, -8), 15034 BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_4, 0), 15035 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8), 15036 /* spill unchecked sk_ptr into stack of caller */ 15037 BPF_MOV64_REG(BPF_REG_5, BPF_REG_10), 15038 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, -8), 15039 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_5, 0), 15040 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_0, 0), 15041 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 15042 /* now the sk_ptr is verified, free the reference */ 15043 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_4, 0), 15044 BPF_EMIT_CALL(BPF_FUNC_sk_release), 15045 BPF_EXIT_INSN(), 15046 15047 /* subprog 2 */ 15048 BPF_SK_LOOKUP, 15049 BPF_EXIT_INSN(), 15050 }, 15051 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15052 .result = ACCEPT, 15053 }, 15054 { 15055 "reference tracking: allow LD_ABS", 15056 .insns = { 15057 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 15058 BPF_SK_LOOKUP, 15059 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 15060 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 15061 BPF_EMIT_CALL(BPF_FUNC_sk_release), 15062 BPF_LD_ABS(BPF_B, 0), 15063 BPF_LD_ABS(BPF_H, 0), 15064 BPF_LD_ABS(BPF_W, 0), 15065 BPF_EXIT_INSN(), 15066 }, 15067 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15068 .result = ACCEPT, 15069 }, 15070 { 15071 "reference tracking: forbid LD_ABS while holding reference", 15072 .insns = { 15073 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 15074 BPF_SK_LOOKUP, 15075 BPF_LD_ABS(BPF_B, 0), 15076 BPF_LD_ABS(BPF_H, 0), 15077 BPF_LD_ABS(BPF_W, 0), 15078 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 15079 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 15080 BPF_EMIT_CALL(BPF_FUNC_sk_release), 15081 BPF_EXIT_INSN(), 15082 }, 15083 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15084 .errstr = "BPF_LD_[ABS|IND] cannot be mixed with socket references", 15085 .result = REJECT, 15086 }, 15087 { 15088 "reference tracking: allow LD_IND", 15089 .insns = { 15090 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 15091 BPF_SK_LOOKUP, 15092 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 15093 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 15094 BPF_EMIT_CALL(BPF_FUNC_sk_release), 15095 BPF_MOV64_IMM(BPF_REG_7, 1), 15096 BPF_LD_IND(BPF_W, BPF_REG_7, -0x200000), 15097 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 15098 BPF_EXIT_INSN(), 15099 }, 15100 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15101 .result = ACCEPT, 15102 .retval = 1, 15103 }, 15104 { 15105 "reference tracking: forbid LD_IND while holding reference", 15106 .insns = { 15107 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 15108 BPF_SK_LOOKUP, 15109 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 15110 BPF_MOV64_IMM(BPF_REG_7, 1), 15111 BPF_LD_IND(BPF_W, BPF_REG_7, -0x200000), 15112 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 15113 BPF_MOV64_REG(BPF_REG_1, BPF_REG_4), 15114 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 15115 BPF_EMIT_CALL(BPF_FUNC_sk_release), 15116 BPF_EXIT_INSN(), 15117 }, 15118 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15119 .errstr = "BPF_LD_[ABS|IND] cannot be mixed with socket references", 15120 .result = REJECT, 15121 }, 15122 { 15123 "reference tracking: check reference or tail call", 15124 .insns = { 15125 BPF_MOV64_REG(BPF_REG_7, BPF_REG_1), 15126 BPF_SK_LOOKUP, 15127 /* if (sk) bpf_sk_release() */ 15128 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 15129 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 7), 15130 /* bpf_tail_call() */ 15131 BPF_MOV64_IMM(BPF_REG_3, 2), 15132 BPF_LD_MAP_FD(BPF_REG_2, 0), 15133 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 15134 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 15135 BPF_FUNC_tail_call), 15136 BPF_MOV64_IMM(BPF_REG_0, 0), 15137 BPF_EXIT_INSN(), 15138 BPF_EMIT_CALL(BPF_FUNC_sk_release), 15139 BPF_EXIT_INSN(), 15140 }, 15141 .fixup_prog1 = { 17 }, 15142 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15143 .result = ACCEPT, 15144 }, 15145 { 15146 "reference tracking: release reference then tail call", 15147 .insns = { 15148 BPF_MOV64_REG(BPF_REG_7, BPF_REG_1), 15149 BPF_SK_LOOKUP, 15150 /* if (sk) bpf_sk_release() */ 15151 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 15152 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 15153 BPF_EMIT_CALL(BPF_FUNC_sk_release), 15154 /* bpf_tail_call() */ 15155 BPF_MOV64_IMM(BPF_REG_3, 2), 15156 BPF_LD_MAP_FD(BPF_REG_2, 0), 15157 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 15158 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 15159 BPF_FUNC_tail_call), 15160 BPF_MOV64_IMM(BPF_REG_0, 0), 15161 BPF_EXIT_INSN(), 15162 }, 15163 .fixup_prog1 = { 18 }, 15164 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15165 .result = ACCEPT, 15166 }, 15167 { 15168 "reference tracking: leak possible reference over tail call", 15169 .insns = { 15170 BPF_MOV64_REG(BPF_REG_7, BPF_REG_1), 15171 /* Look up socket and store in REG_6 */ 15172 BPF_SK_LOOKUP, 15173 /* bpf_tail_call() */ 15174 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 15175 BPF_MOV64_IMM(BPF_REG_3, 2), 15176 BPF_LD_MAP_FD(BPF_REG_2, 0), 15177 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 15178 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 15179 BPF_FUNC_tail_call), 15180 BPF_MOV64_IMM(BPF_REG_0, 0), 15181 /* if (sk) bpf_sk_release() */ 15182 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 15183 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 15184 BPF_EMIT_CALL(BPF_FUNC_sk_release), 15185 BPF_EXIT_INSN(), 15186 }, 15187 .fixup_prog1 = { 16 }, 15188 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15189 .errstr = "tail_call would lead to reference leak", 15190 .result = REJECT, 15191 }, 15192 { 15193 "reference tracking: leak checked reference over tail call", 15194 .insns = { 15195 BPF_MOV64_REG(BPF_REG_7, BPF_REG_1), 15196 /* Look up socket and store in REG_6 */ 15197 BPF_SK_LOOKUP, 15198 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 15199 /* if (!sk) goto end */ 15200 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 15201 /* bpf_tail_call() */ 15202 BPF_MOV64_IMM(BPF_REG_3, 0), 15203 BPF_LD_MAP_FD(BPF_REG_2, 0), 15204 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 15205 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 15206 BPF_FUNC_tail_call), 15207 BPF_MOV64_IMM(BPF_REG_0, 0), 15208 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 15209 BPF_EMIT_CALL(BPF_FUNC_sk_release), 15210 BPF_EXIT_INSN(), 15211 }, 15212 .fixup_prog1 = { 17 }, 15213 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15214 .errstr = "tail_call would lead to reference leak", 15215 .result = REJECT, 15216 }, 15217 { 15218 "reference tracking: mangle and release sock_or_null", 15219 .insns = { 15220 BPF_SK_LOOKUP, 15221 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 15222 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 5), 15223 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 15224 BPF_EMIT_CALL(BPF_FUNC_sk_release), 15225 BPF_EXIT_INSN(), 15226 }, 15227 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15228 .errstr = "R1 pointer arithmetic on sock_or_null prohibited", 15229 .result = REJECT, 15230 }, 15231 { 15232 "reference tracking: mangle and release sock", 15233 .insns = { 15234 BPF_SK_LOOKUP, 15235 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 15236 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 15237 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 5), 15238 BPF_EMIT_CALL(BPF_FUNC_sk_release), 15239 BPF_EXIT_INSN(), 15240 }, 15241 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15242 .errstr = "R1 pointer arithmetic on sock prohibited", 15243 .result = REJECT, 15244 }, 15245 { 15246 "reference tracking: access member", 15247 .insns = { 15248 BPF_SK_LOOKUP, 15249 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 15250 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 15251 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_0, 4), 15252 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 15253 BPF_EMIT_CALL(BPF_FUNC_sk_release), 15254 BPF_EXIT_INSN(), 15255 }, 15256 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15257 .result = ACCEPT, 15258 }, 15259 { 15260 "reference tracking: write to member", 15261 .insns = { 15262 BPF_SK_LOOKUP, 15263 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 15264 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 15265 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 15266 BPF_LD_IMM64(BPF_REG_2, 42), 15267 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_2, 15268 offsetof(struct bpf_sock, mark)), 15269 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 15270 BPF_EMIT_CALL(BPF_FUNC_sk_release), 15271 BPF_LD_IMM64(BPF_REG_0, 0), 15272 BPF_EXIT_INSN(), 15273 }, 15274 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15275 .errstr = "cannot write into socket", 15276 .result = REJECT, 15277 }, 15278 { 15279 "reference tracking: invalid 64-bit access of member", 15280 .insns = { 15281 BPF_SK_LOOKUP, 15282 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 15283 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 15284 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 15285 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 15286 BPF_EMIT_CALL(BPF_FUNC_sk_release), 15287 BPF_EXIT_INSN(), 15288 }, 15289 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15290 .errstr = "invalid bpf_sock access off=0 size=8", 15291 .result = REJECT, 15292 }, 15293 { 15294 "reference tracking: access after release", 15295 .insns = { 15296 BPF_SK_LOOKUP, 15297 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 15298 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 15299 BPF_EMIT_CALL(BPF_FUNC_sk_release), 15300 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0), 15301 BPF_EXIT_INSN(), 15302 }, 15303 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15304 .errstr = "!read_ok", 15305 .result = REJECT, 15306 }, 15307 { 15308 "reference tracking: direct access for lookup", 15309 .insns = { 15310 /* Check that the packet is at least 64B long */ 15311 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 15312 offsetof(struct __sk_buff, data)), 15313 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 15314 offsetof(struct __sk_buff, data_end)), 15315 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 15316 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 64), 15317 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 9), 15318 /* sk = sk_lookup_tcp(ctx, skb->data, ...) */ 15319 BPF_MOV64_IMM(BPF_REG_3, sizeof(struct bpf_sock_tuple)), 15320 BPF_MOV64_IMM(BPF_REG_4, 0), 15321 BPF_MOV64_IMM(BPF_REG_5, 0), 15322 BPF_EMIT_CALL(BPF_FUNC_sk_lookup_tcp), 15323 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 15324 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 15325 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_0, 4), 15326 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 15327 BPF_EMIT_CALL(BPF_FUNC_sk_release), 15328 BPF_EXIT_INSN(), 15329 }, 15330 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15331 .result = ACCEPT, 15332 }, 15333 { 15334 "calls: ctx read at start of subprog", 15335 .insns = { 15336 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 15337 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 5), 15338 BPF_JMP_REG(BPF_JSGT, BPF_REG_0, BPF_REG_0, 0), 15339 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 15340 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 15341 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 15342 BPF_EXIT_INSN(), 15343 BPF_LDX_MEM(BPF_B, BPF_REG_9, BPF_REG_1, 0), 15344 BPF_MOV64_IMM(BPF_REG_0, 0), 15345 BPF_EXIT_INSN(), 15346 }, 15347 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 15348 .errstr_unpriv = "function calls to other bpf functions are allowed for root only", 15349 .result_unpriv = REJECT, 15350 .result = ACCEPT, 15351 }, 15352 { 15353 "check wire_len is not readable by sockets", 15354 .insns = { 15355 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 15356 offsetof(struct __sk_buff, wire_len)), 15357 BPF_EXIT_INSN(), 15358 }, 15359 .errstr = "invalid bpf_context access", 15360 .result = REJECT, 15361 }, 15362 { 15363 "check wire_len is readable by tc classifier", 15364 .insns = { 15365 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 15366 offsetof(struct __sk_buff, wire_len)), 15367 BPF_EXIT_INSN(), 15368 }, 15369 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15370 .result = ACCEPT, 15371 }, 15372 { 15373 "check wire_len is not writable by tc classifier", 15374 .insns = { 15375 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 15376 offsetof(struct __sk_buff, wire_len)), 15377 BPF_EXIT_INSN(), 15378 }, 15379 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15380 .errstr = "invalid bpf_context access", 15381 .errstr_unpriv = "R1 leaks addr", 15382 .result = REJECT, 15383 }, 15384 { 15385 "calls: cross frame pruning", 15386 .insns = { 15387 /* r8 = !!random(); 15388 * call pruner() 15389 * if (r8) 15390 * do something bad; 15391 */ 15392 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 15393 BPF_FUNC_get_prandom_u32), 15394 BPF_MOV64_IMM(BPF_REG_8, 0), 15395 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 15396 BPF_MOV64_IMM(BPF_REG_8, 1), 15397 BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 15398 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 15399 BPF_JMP_IMM(BPF_JEQ, BPF_REG_8, 1, 1), 15400 BPF_LDX_MEM(BPF_B, BPF_REG_9, BPF_REG_1, 0), 15401 BPF_MOV64_IMM(BPF_REG_0, 0), 15402 BPF_EXIT_INSN(), 15403 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 0), 15404 BPF_EXIT_INSN(), 15405 }, 15406 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 15407 .errstr_unpriv = "function calls to other bpf functions are allowed for root only", 15408 .errstr = "!read_ok", 15409 .result = REJECT, 15410 }, 15411 { 15412 "jset: functional", 15413 .insns = { 15414 /* r0 = 0 */ 15415 BPF_MOV64_IMM(BPF_REG_0, 0), 15416 /* prep for direct packet access via r2 */ 15417 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 15418 offsetof(struct __sk_buff, data)), 15419 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 15420 offsetof(struct __sk_buff, data_end)), 15421 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 15422 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8), 15423 BPF_JMP_REG(BPF_JLE, BPF_REG_4, BPF_REG_3, 1), 15424 BPF_EXIT_INSN(), 15425 15426 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0), 15427 15428 /* reg, bit 63 or bit 0 set, taken */ 15429 BPF_LD_IMM64(BPF_REG_8, 0x8000000000000001), 15430 BPF_JMP_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1), 15431 BPF_EXIT_INSN(), 15432 15433 /* reg, bit 62, not taken */ 15434 BPF_LD_IMM64(BPF_REG_8, 0x4000000000000000), 15435 BPF_JMP_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1), 15436 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 15437 BPF_EXIT_INSN(), 15438 15439 /* imm, any bit set, taken */ 15440 BPF_JMP_IMM(BPF_JSET, BPF_REG_7, -1, 1), 15441 BPF_EXIT_INSN(), 15442 15443 /* imm, bit 31 set, taken */ 15444 BPF_JMP_IMM(BPF_JSET, BPF_REG_7, 0x80000000, 1), 15445 BPF_EXIT_INSN(), 15446 15447 /* all good - return r0 == 2 */ 15448 BPF_MOV64_IMM(BPF_REG_0, 2), 15449 BPF_EXIT_INSN(), 15450 }, 15451 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15452 .result = ACCEPT, 15453 .runs = 7, 15454 .retvals = { 15455 { .retval = 2, 15456 .data64 = { (1ULL << 63) | (1U << 31) | (1U << 0), } 15457 }, 15458 { .retval = 2, 15459 .data64 = { (1ULL << 63) | (1U << 31), } 15460 }, 15461 { .retval = 2, 15462 .data64 = { (1ULL << 31) | (1U << 0), } 15463 }, 15464 { .retval = 2, 15465 .data64 = { (__u32)-1, } 15466 }, 15467 { .retval = 2, 15468 .data64 = { ~0x4000000000000000ULL, } 15469 }, 15470 { .retval = 0, 15471 .data64 = { 0, } 15472 }, 15473 { .retval = 0, 15474 .data64 = { ~0ULL, } 15475 }, 15476 }, 15477 }, 15478 { 15479 "jset: sign-extend", 15480 .insns = { 15481 /* r0 = 0 */ 15482 BPF_MOV64_IMM(BPF_REG_0, 0), 15483 /* prep for direct packet access via r2 */ 15484 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 15485 offsetof(struct __sk_buff, data)), 15486 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 15487 offsetof(struct __sk_buff, data_end)), 15488 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 15489 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8), 15490 BPF_JMP_REG(BPF_JLE, BPF_REG_4, BPF_REG_3, 1), 15491 BPF_EXIT_INSN(), 15492 15493 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0), 15494 15495 BPF_JMP_IMM(BPF_JSET, BPF_REG_7, 0x80000000, 1), 15496 BPF_EXIT_INSN(), 15497 15498 BPF_MOV64_IMM(BPF_REG_0, 2), 15499 BPF_EXIT_INSN(), 15500 }, 15501 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15502 .result = ACCEPT, 15503 .retval = 2, 15504 .data = { 1, 0, 0, 0, 0, 0, 0, 1, }, 15505 }, 15506 { 15507 "jset: known const compare", 15508 .insns = { 15509 BPF_MOV64_IMM(BPF_REG_0, 1), 15510 BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1), 15511 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0), 15512 BPF_EXIT_INSN(), 15513 }, 15514 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 15515 .retval_unpriv = 1, 15516 .result_unpriv = ACCEPT, 15517 .retval = 1, 15518 .result = ACCEPT, 15519 }, 15520 { 15521 "jset: known const compare bad", 15522 .insns = { 15523 BPF_MOV64_IMM(BPF_REG_0, 0), 15524 BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1), 15525 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0), 15526 BPF_EXIT_INSN(), 15527 }, 15528 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 15529 .errstr_unpriv = "!read_ok", 15530 .result_unpriv = REJECT, 15531 .errstr = "!read_ok", 15532 .result = REJECT, 15533 }, 15534 { 15535 "jset: unknown const compare taken", 15536 .insns = { 15537 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 15538 BPF_FUNC_get_prandom_u32), 15539 BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1), 15540 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 15541 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0), 15542 BPF_EXIT_INSN(), 15543 }, 15544 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 15545 .errstr_unpriv = "!read_ok", 15546 .result_unpriv = REJECT, 15547 .errstr = "!read_ok", 15548 .result = REJECT, 15549 }, 15550 { 15551 "jset: unknown const compare not taken", 15552 .insns = { 15553 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 15554 BPF_FUNC_get_prandom_u32), 15555 BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1), 15556 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0), 15557 BPF_EXIT_INSN(), 15558 }, 15559 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 15560 .errstr_unpriv = "!read_ok", 15561 .result_unpriv = REJECT, 15562 .errstr = "!read_ok", 15563 .result = REJECT, 15564 }, 15565 { 15566 "jset: half-known const compare", 15567 .insns = { 15568 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 15569 BPF_FUNC_get_prandom_u32), 15570 BPF_ALU64_IMM(BPF_OR, BPF_REG_0, 2), 15571 BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 3, 1), 15572 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0), 15573 BPF_MOV64_IMM(BPF_REG_0, 0), 15574 BPF_EXIT_INSN(), 15575 }, 15576 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 15577 .result_unpriv = ACCEPT, 15578 .result = ACCEPT, 15579 }, 15580 { 15581 "jset: range", 15582 .insns = { 15583 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 15584 BPF_FUNC_get_prandom_u32), 15585 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 15586 BPF_MOV64_IMM(BPF_REG_0, 0), 15587 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xff), 15588 BPF_JMP_IMM(BPF_JSET, BPF_REG_1, 0xf0, 3), 15589 BPF_JMP_IMM(BPF_JLT, BPF_REG_1, 0x10, 1), 15590 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0), 15591 BPF_EXIT_INSN(), 15592 BPF_JMP_IMM(BPF_JSET, BPF_REG_1, 0x10, 1), 15593 BPF_EXIT_INSN(), 15594 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0x10, 1), 15595 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0), 15596 BPF_EXIT_INSN(), 15597 }, 15598 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 15599 .result_unpriv = ACCEPT, 15600 .result = ACCEPT, 15601 }, 15602 }; 15603 15604 static int probe_filter_length(const struct bpf_insn *fp) 15605 { 15606 int len; 15607 15608 for (len = MAX_INSNS - 1; len > 0; --len) 15609 if (fp[len].code != 0 || fp[len].imm != 0) 15610 break; 15611 return len + 1; 15612 } 15613 15614 static int create_map(uint32_t type, uint32_t size_key, 15615 uint32_t size_value, uint32_t max_elem) 15616 { 15617 int fd; 15618 15619 fd = bpf_create_map(type, size_key, size_value, max_elem, 15620 type == BPF_MAP_TYPE_HASH ? BPF_F_NO_PREALLOC : 0); 15621 if (fd < 0) 15622 printf("Failed to create hash map '%s'!\n", strerror(errno)); 15623 15624 return fd; 15625 } 15626 15627 static void update_map(int fd, int index) 15628 { 15629 struct test_val value = { 15630 .index = (6 + 1) * sizeof(int), 15631 .foo[6] = 0xabcdef12, 15632 }; 15633 15634 assert(!bpf_map_update_elem(fd, &index, &value, 0)); 15635 } 15636 15637 static int create_prog_dummy1(enum bpf_prog_type prog_type) 15638 { 15639 struct bpf_insn prog[] = { 15640 BPF_MOV64_IMM(BPF_REG_0, 42), 15641 BPF_EXIT_INSN(), 15642 }; 15643 15644 return bpf_load_program(prog_type, prog, 15645 ARRAY_SIZE(prog), "GPL", 0, NULL, 0); 15646 } 15647 15648 static int create_prog_dummy2(enum bpf_prog_type prog_type, int mfd, int idx) 15649 { 15650 struct bpf_insn prog[] = { 15651 BPF_MOV64_IMM(BPF_REG_3, idx), 15652 BPF_LD_MAP_FD(BPF_REG_2, mfd), 15653 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 15654 BPF_FUNC_tail_call), 15655 BPF_MOV64_IMM(BPF_REG_0, 41), 15656 BPF_EXIT_INSN(), 15657 }; 15658 15659 return bpf_load_program(prog_type, prog, 15660 ARRAY_SIZE(prog), "GPL", 0, NULL, 0); 15661 } 15662 15663 static int create_prog_array(enum bpf_prog_type prog_type, uint32_t max_elem, 15664 int p1key) 15665 { 15666 int p2key = 1; 15667 int mfd, p1fd, p2fd; 15668 15669 mfd = bpf_create_map(BPF_MAP_TYPE_PROG_ARRAY, sizeof(int), 15670 sizeof(int), max_elem, 0); 15671 if (mfd < 0) { 15672 printf("Failed to create prog array '%s'!\n", strerror(errno)); 15673 return -1; 15674 } 15675 15676 p1fd = create_prog_dummy1(prog_type); 15677 p2fd = create_prog_dummy2(prog_type, mfd, p2key); 15678 if (p1fd < 0 || p2fd < 0) 15679 goto out; 15680 if (bpf_map_update_elem(mfd, &p1key, &p1fd, BPF_ANY) < 0) 15681 goto out; 15682 if (bpf_map_update_elem(mfd, &p2key, &p2fd, BPF_ANY) < 0) 15683 goto out; 15684 close(p2fd); 15685 close(p1fd); 15686 15687 return mfd; 15688 out: 15689 close(p2fd); 15690 close(p1fd); 15691 close(mfd); 15692 return -1; 15693 } 15694 15695 static int create_map_in_map(void) 15696 { 15697 int inner_map_fd, outer_map_fd; 15698 15699 inner_map_fd = bpf_create_map(BPF_MAP_TYPE_ARRAY, sizeof(int), 15700 sizeof(int), 1, 0); 15701 if (inner_map_fd < 0) { 15702 printf("Failed to create array '%s'!\n", strerror(errno)); 15703 return inner_map_fd; 15704 } 15705 15706 outer_map_fd = bpf_create_map_in_map(BPF_MAP_TYPE_ARRAY_OF_MAPS, NULL, 15707 sizeof(int), inner_map_fd, 1, 0); 15708 if (outer_map_fd < 0) 15709 printf("Failed to create array of maps '%s'!\n", 15710 strerror(errno)); 15711 15712 close(inner_map_fd); 15713 15714 return outer_map_fd; 15715 } 15716 15717 static int create_cgroup_storage(bool percpu) 15718 { 15719 enum bpf_map_type type = percpu ? BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE : 15720 BPF_MAP_TYPE_CGROUP_STORAGE; 15721 int fd; 15722 15723 fd = bpf_create_map(type, sizeof(struct bpf_cgroup_storage_key), 15724 TEST_DATA_LEN, 0, 0); 15725 if (fd < 0) 15726 printf("Failed to create cgroup storage '%s'!\n", 15727 strerror(errno)); 15728 15729 return fd; 15730 } 15731 15732 static char bpf_vlog[UINT_MAX >> 8]; 15733 15734 static void do_test_fixup(struct bpf_test *test, enum bpf_prog_type prog_type, 15735 struct bpf_insn *prog, int *map_fds) 15736 { 15737 int *fixup_map_hash_8b = test->fixup_map_hash_8b; 15738 int *fixup_map_hash_48b = test->fixup_map_hash_48b; 15739 int *fixup_map_hash_16b = test->fixup_map_hash_16b; 15740 int *fixup_map_array_48b = test->fixup_map_array_48b; 15741 int *fixup_map_sockmap = test->fixup_map_sockmap; 15742 int *fixup_map_sockhash = test->fixup_map_sockhash; 15743 int *fixup_map_xskmap = test->fixup_map_xskmap; 15744 int *fixup_map_stacktrace = test->fixup_map_stacktrace; 15745 int *fixup_prog1 = test->fixup_prog1; 15746 int *fixup_prog2 = test->fixup_prog2; 15747 int *fixup_map_in_map = test->fixup_map_in_map; 15748 int *fixup_cgroup_storage = test->fixup_cgroup_storage; 15749 int *fixup_percpu_cgroup_storage = test->fixup_percpu_cgroup_storage; 15750 15751 if (test->fill_helper) 15752 test->fill_helper(test); 15753 15754 /* Allocating HTs with 1 elem is fine here, since we only test 15755 * for verifier and not do a runtime lookup, so the only thing 15756 * that really matters is value size in this case. 15757 */ 15758 if (*fixup_map_hash_8b) { 15759 map_fds[0] = create_map(BPF_MAP_TYPE_HASH, sizeof(long long), 15760 sizeof(long long), 1); 15761 do { 15762 prog[*fixup_map_hash_8b].imm = map_fds[0]; 15763 fixup_map_hash_8b++; 15764 } while (*fixup_map_hash_8b); 15765 } 15766 15767 if (*fixup_map_hash_48b) { 15768 map_fds[1] = create_map(BPF_MAP_TYPE_HASH, sizeof(long long), 15769 sizeof(struct test_val), 1); 15770 do { 15771 prog[*fixup_map_hash_48b].imm = map_fds[1]; 15772 fixup_map_hash_48b++; 15773 } while (*fixup_map_hash_48b); 15774 } 15775 15776 if (*fixup_map_hash_16b) { 15777 map_fds[2] = create_map(BPF_MAP_TYPE_HASH, sizeof(long long), 15778 sizeof(struct other_val), 1); 15779 do { 15780 prog[*fixup_map_hash_16b].imm = map_fds[2]; 15781 fixup_map_hash_16b++; 15782 } while (*fixup_map_hash_16b); 15783 } 15784 15785 if (*fixup_map_array_48b) { 15786 map_fds[3] = create_map(BPF_MAP_TYPE_ARRAY, sizeof(int), 15787 sizeof(struct test_val), 1); 15788 update_map(map_fds[3], 0); 15789 do { 15790 prog[*fixup_map_array_48b].imm = map_fds[3]; 15791 fixup_map_array_48b++; 15792 } while (*fixup_map_array_48b); 15793 } 15794 15795 if (*fixup_prog1) { 15796 map_fds[4] = create_prog_array(prog_type, 4, 0); 15797 do { 15798 prog[*fixup_prog1].imm = map_fds[4]; 15799 fixup_prog1++; 15800 } while (*fixup_prog1); 15801 } 15802 15803 if (*fixup_prog2) { 15804 map_fds[5] = create_prog_array(prog_type, 8, 7); 15805 do { 15806 prog[*fixup_prog2].imm = map_fds[5]; 15807 fixup_prog2++; 15808 } while (*fixup_prog2); 15809 } 15810 15811 if (*fixup_map_in_map) { 15812 map_fds[6] = create_map_in_map(); 15813 do { 15814 prog[*fixup_map_in_map].imm = map_fds[6]; 15815 fixup_map_in_map++; 15816 } while (*fixup_map_in_map); 15817 } 15818 15819 if (*fixup_cgroup_storage) { 15820 map_fds[7] = create_cgroup_storage(false); 15821 do { 15822 prog[*fixup_cgroup_storage].imm = map_fds[7]; 15823 fixup_cgroup_storage++; 15824 } while (*fixup_cgroup_storage); 15825 } 15826 15827 if (*fixup_percpu_cgroup_storage) { 15828 map_fds[8] = create_cgroup_storage(true); 15829 do { 15830 prog[*fixup_percpu_cgroup_storage].imm = map_fds[8]; 15831 fixup_percpu_cgroup_storage++; 15832 } while (*fixup_percpu_cgroup_storage); 15833 } 15834 if (*fixup_map_sockmap) { 15835 map_fds[9] = create_map(BPF_MAP_TYPE_SOCKMAP, sizeof(int), 15836 sizeof(int), 1); 15837 do { 15838 prog[*fixup_map_sockmap].imm = map_fds[9]; 15839 fixup_map_sockmap++; 15840 } while (*fixup_map_sockmap); 15841 } 15842 if (*fixup_map_sockhash) { 15843 map_fds[10] = create_map(BPF_MAP_TYPE_SOCKHASH, sizeof(int), 15844 sizeof(int), 1); 15845 do { 15846 prog[*fixup_map_sockhash].imm = map_fds[10]; 15847 fixup_map_sockhash++; 15848 } while (*fixup_map_sockhash); 15849 } 15850 if (*fixup_map_xskmap) { 15851 map_fds[11] = create_map(BPF_MAP_TYPE_XSKMAP, sizeof(int), 15852 sizeof(int), 1); 15853 do { 15854 prog[*fixup_map_xskmap].imm = map_fds[11]; 15855 fixup_map_xskmap++; 15856 } while (*fixup_map_xskmap); 15857 } 15858 if (*fixup_map_stacktrace) { 15859 map_fds[12] = create_map(BPF_MAP_TYPE_STACK_TRACE, sizeof(u32), 15860 sizeof(u64), 1); 15861 do { 15862 prog[*fixup_map_stacktrace].imm = map_fds[12]; 15863 fixup_map_stacktrace++; 15864 } while (*fixup_map_stacktrace); 15865 } 15866 } 15867 15868 static int set_admin(bool admin) 15869 { 15870 cap_t caps; 15871 const cap_value_t cap_val = CAP_SYS_ADMIN; 15872 int ret = -1; 15873 15874 caps = cap_get_proc(); 15875 if (!caps) { 15876 perror("cap_get_proc"); 15877 return -1; 15878 } 15879 if (cap_set_flag(caps, CAP_EFFECTIVE, 1, &cap_val, 15880 admin ? CAP_SET : CAP_CLEAR)) { 15881 perror("cap_set_flag"); 15882 goto out; 15883 } 15884 if (cap_set_proc(caps)) { 15885 perror("cap_set_proc"); 15886 goto out; 15887 } 15888 ret = 0; 15889 out: 15890 if (cap_free(caps)) 15891 perror("cap_free"); 15892 return ret; 15893 } 15894 15895 static int do_prog_test_run(int fd_prog, bool unpriv, uint32_t expected_val, 15896 void *data, size_t size_data) 15897 { 15898 __u8 tmp[TEST_DATA_LEN << 2]; 15899 __u32 size_tmp = sizeof(tmp); 15900 uint32_t retval; 15901 int err; 15902 15903 if (unpriv) 15904 set_admin(true); 15905 err = bpf_prog_test_run(fd_prog, 1, data, size_data, 15906 tmp, &size_tmp, &retval, NULL); 15907 if (unpriv) 15908 set_admin(false); 15909 if (err && errno != 524/*ENOTSUPP*/ && errno != EPERM) { 15910 printf("Unexpected bpf_prog_test_run error "); 15911 return err; 15912 } 15913 if (!err && retval != expected_val && 15914 expected_val != POINTER_VALUE) { 15915 printf("FAIL retval %d != %d ", retval, expected_val); 15916 return 1; 15917 } 15918 15919 return 0; 15920 } 15921 15922 static void do_test_single(struct bpf_test *test, bool unpriv, 15923 int *passes, int *errors) 15924 { 15925 int fd_prog, expected_ret, alignment_prevented_execution; 15926 int prog_len, prog_type = test->prog_type; 15927 struct bpf_insn *prog = test->insns; 15928 int run_errs, run_successes; 15929 int map_fds[MAX_NR_MAPS]; 15930 const char *expected_err; 15931 __u32 pflags; 15932 int i, err; 15933 15934 for (i = 0; i < MAX_NR_MAPS; i++) 15935 map_fds[i] = -1; 15936 15937 if (!prog_type) 15938 prog_type = BPF_PROG_TYPE_SOCKET_FILTER; 15939 do_test_fixup(test, prog_type, prog, map_fds); 15940 prog_len = probe_filter_length(prog); 15941 15942 pflags = 0; 15943 if (test->flags & F_LOAD_WITH_STRICT_ALIGNMENT) 15944 pflags |= BPF_F_STRICT_ALIGNMENT; 15945 if (test->flags & F_NEEDS_EFFICIENT_UNALIGNED_ACCESS) 15946 pflags |= BPF_F_ANY_ALIGNMENT; 15947 fd_prog = bpf_verify_program(prog_type, prog, prog_len, pflags, 15948 "GPL", 0, bpf_vlog, sizeof(bpf_vlog), 1); 15949 15950 expected_ret = unpriv && test->result_unpriv != UNDEF ? 15951 test->result_unpriv : test->result; 15952 expected_err = unpriv && test->errstr_unpriv ? 15953 test->errstr_unpriv : test->errstr; 15954 15955 alignment_prevented_execution = 0; 15956 15957 if (expected_ret == ACCEPT) { 15958 if (fd_prog < 0) { 15959 printf("FAIL\nFailed to load prog '%s'!\n", 15960 strerror(errno)); 15961 goto fail_log; 15962 } 15963 #ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS 15964 if (fd_prog >= 0 && 15965 (test->flags & F_NEEDS_EFFICIENT_UNALIGNED_ACCESS)) 15966 alignment_prevented_execution = 1; 15967 #endif 15968 } else { 15969 if (fd_prog >= 0) { 15970 printf("FAIL\nUnexpected success to load!\n"); 15971 goto fail_log; 15972 } 15973 if (!strstr(bpf_vlog, expected_err)) { 15974 printf("FAIL\nUnexpected error message!\n\tEXP: %s\n\tRES: %s\n", 15975 expected_err, bpf_vlog); 15976 goto fail_log; 15977 } 15978 } 15979 15980 if (test->insn_processed) { 15981 uint32_t insn_processed; 15982 char *proc; 15983 15984 proc = strstr(bpf_vlog, "processed "); 15985 insn_processed = atoi(proc + 10); 15986 if (test->insn_processed != insn_processed) { 15987 printf("FAIL\nUnexpected insn_processed %u vs %u\n", 15988 insn_processed, test->insn_processed); 15989 goto fail_log; 15990 } 15991 } 15992 15993 run_errs = 0; 15994 run_successes = 0; 15995 if (!alignment_prevented_execution && fd_prog >= 0) { 15996 uint32_t expected_val; 15997 int i; 15998 15999 if (!test->runs) { 16000 expected_val = unpriv && test->retval_unpriv ? 16001 test->retval_unpriv : test->retval; 16002 16003 err = do_prog_test_run(fd_prog, unpriv, expected_val, 16004 test->data, sizeof(test->data)); 16005 if (err) 16006 run_errs++; 16007 else 16008 run_successes++; 16009 } 16010 16011 for (i = 0; i < test->runs; i++) { 16012 if (unpriv && test->retvals[i].retval_unpriv) 16013 expected_val = test->retvals[i].retval_unpriv; 16014 else 16015 expected_val = test->retvals[i].retval; 16016 16017 err = do_prog_test_run(fd_prog, unpriv, expected_val, 16018 test->retvals[i].data, 16019 sizeof(test->retvals[i].data)); 16020 if (err) { 16021 printf("(run %d/%d) ", i + 1, test->runs); 16022 run_errs++; 16023 } else { 16024 run_successes++; 16025 } 16026 } 16027 } 16028 16029 if (!run_errs) { 16030 (*passes)++; 16031 if (run_successes > 1) 16032 printf("%d cases ", run_successes); 16033 printf("OK"); 16034 if (alignment_prevented_execution) 16035 printf(" (NOTE: not executed due to unknown alignment)"); 16036 printf("\n"); 16037 } else { 16038 printf("\n"); 16039 goto fail_log; 16040 } 16041 close_fds: 16042 close(fd_prog); 16043 for (i = 0; i < MAX_NR_MAPS; i++) 16044 close(map_fds[i]); 16045 sched_yield(); 16046 return; 16047 fail_log: 16048 (*errors)++; 16049 printf("%s", bpf_vlog); 16050 goto close_fds; 16051 } 16052 16053 static bool is_admin(void) 16054 { 16055 cap_t caps; 16056 cap_flag_value_t sysadmin = CAP_CLEAR; 16057 const cap_value_t cap_val = CAP_SYS_ADMIN; 16058 16059 #ifdef CAP_IS_SUPPORTED 16060 if (!CAP_IS_SUPPORTED(CAP_SETFCAP)) { 16061 perror("cap_get_flag"); 16062 return false; 16063 } 16064 #endif 16065 caps = cap_get_proc(); 16066 if (!caps) { 16067 perror("cap_get_proc"); 16068 return false; 16069 } 16070 if (cap_get_flag(caps, cap_val, CAP_EFFECTIVE, &sysadmin)) 16071 perror("cap_get_flag"); 16072 if (cap_free(caps)) 16073 perror("cap_free"); 16074 return (sysadmin == CAP_SET); 16075 } 16076 16077 static void get_unpriv_disabled() 16078 { 16079 char buf[2]; 16080 FILE *fd; 16081 16082 fd = fopen("/proc/sys/"UNPRIV_SYSCTL, "r"); 16083 if (!fd) { 16084 perror("fopen /proc/sys/"UNPRIV_SYSCTL); 16085 unpriv_disabled = true; 16086 return; 16087 } 16088 if (fgets(buf, 2, fd) == buf && atoi(buf)) 16089 unpriv_disabled = true; 16090 fclose(fd); 16091 } 16092 16093 static bool test_as_unpriv(struct bpf_test *test) 16094 { 16095 return !test->prog_type || 16096 test->prog_type == BPF_PROG_TYPE_SOCKET_FILTER || 16097 test->prog_type == BPF_PROG_TYPE_CGROUP_SKB; 16098 } 16099 16100 static int do_test(bool unpriv, unsigned int from, unsigned int to) 16101 { 16102 int i, passes = 0, errors = 0, skips = 0; 16103 16104 for (i = from; i < to; i++) { 16105 struct bpf_test *test = &tests[i]; 16106 16107 /* Program types that are not supported by non-root we 16108 * skip right away. 16109 */ 16110 if (test_as_unpriv(test) && unpriv_disabled) { 16111 printf("#%d/u %s SKIP\n", i, test->descr); 16112 skips++; 16113 } else if (test_as_unpriv(test)) { 16114 if (!unpriv) 16115 set_admin(false); 16116 printf("#%d/u %s ", i, test->descr); 16117 do_test_single(test, true, &passes, &errors); 16118 if (!unpriv) 16119 set_admin(true); 16120 } 16121 16122 if (unpriv) { 16123 printf("#%d/p %s SKIP\n", i, test->descr); 16124 skips++; 16125 } else { 16126 printf("#%d/p %s ", i, test->descr); 16127 do_test_single(test, false, &passes, &errors); 16128 } 16129 } 16130 16131 printf("Summary: %d PASSED, %d SKIPPED, %d FAILED\n", passes, 16132 skips, errors); 16133 return errors ? EXIT_FAILURE : EXIT_SUCCESS; 16134 } 16135 16136 int main(int argc, char **argv) 16137 { 16138 unsigned int from = 0, to = ARRAY_SIZE(tests); 16139 bool unpriv = !is_admin(); 16140 16141 if (argc == 3) { 16142 unsigned int l = atoi(argv[argc - 2]); 16143 unsigned int u = atoi(argv[argc - 1]); 16144 16145 if (l < to && u < to) { 16146 from = l; 16147 to = u + 1; 16148 } 16149 } else if (argc == 2) { 16150 unsigned int t = atoi(argv[argc - 1]); 16151 16152 if (t < to) { 16153 from = t; 16154 to = t + 1; 16155 } 16156 } 16157 16158 get_unpriv_disabled(); 16159 if (unpriv && unpriv_disabled) { 16160 printf("Cannot run as unprivileged user with sysctl %s.\n", 16161 UNPRIV_SYSCTL); 16162 return EXIT_FAILURE; 16163 } 16164 16165 bpf_semi_rand_init(); 16166 return do_test(unpriv, from, to); 16167 } 16168