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 27 #include <sys/capability.h> 28 29 #include <linux/unistd.h> 30 #include <linux/filter.h> 31 #include <linux/bpf_perf_event.h> 32 #include <linux/bpf.h> 33 #include <linux/if_ether.h> 34 35 #include <bpf/bpf.h> 36 37 #ifdef HAVE_GENHDR 38 # include "autoconf.h" 39 #else 40 # if defined(__i386) || defined(__x86_64) || defined(__s390x__) || defined(__aarch64__) 41 # define CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS 1 42 # endif 43 #endif 44 #include "bpf_rlimit.h" 45 #include "bpf_rand.h" 46 #include "bpf_util.h" 47 #include "../../../include/linux/filter.h" 48 49 #define MAX_INSNS BPF_MAXINSNS 50 #define MAX_FIXUPS 8 51 #define MAX_NR_MAPS 13 52 #define POINTER_VALUE 0xcafe4all 53 #define TEST_DATA_LEN 64 54 55 #define F_NEEDS_EFFICIENT_UNALIGNED_ACCESS (1 << 0) 56 #define F_LOAD_WITH_STRICT_ALIGNMENT (1 << 1) 57 58 #define UNPRIV_SYSCTL "kernel/unprivileged_bpf_disabled" 59 static bool unpriv_disabled = false; 60 61 struct bpf_test { 62 const char *descr; 63 struct bpf_insn insns[MAX_INSNS]; 64 int fixup_map_hash_8b[MAX_FIXUPS]; 65 int fixup_map_hash_48b[MAX_FIXUPS]; 66 int fixup_map_hash_16b[MAX_FIXUPS]; 67 int fixup_map_array_48b[MAX_FIXUPS]; 68 int fixup_map_sockmap[MAX_FIXUPS]; 69 int fixup_map_sockhash[MAX_FIXUPS]; 70 int fixup_map_xskmap[MAX_FIXUPS]; 71 int fixup_map_stacktrace[MAX_FIXUPS]; 72 int fixup_prog1[MAX_FIXUPS]; 73 int fixup_prog2[MAX_FIXUPS]; 74 int fixup_map_in_map[MAX_FIXUPS]; 75 int fixup_cgroup_storage[MAX_FIXUPS]; 76 int fixup_percpu_cgroup_storage[MAX_FIXUPS]; 77 const char *errstr; 78 const char *errstr_unpriv; 79 uint32_t retval, retval_unpriv; 80 enum { 81 UNDEF, 82 ACCEPT, 83 REJECT 84 } result, result_unpriv; 85 enum bpf_prog_type prog_type; 86 uint8_t flags; 87 __u8 data[TEST_DATA_LEN]; 88 void (*fill_helper)(struct bpf_test *self); 89 }; 90 91 /* Note we want this to be 64 bit aligned so that the end of our array is 92 * actually the end of the structure. 93 */ 94 #define MAX_ENTRIES 11 95 96 struct test_val { 97 unsigned int index; 98 int foo[MAX_ENTRIES]; 99 }; 100 101 struct other_val { 102 long long foo; 103 long long bar; 104 }; 105 106 static void bpf_fill_ld_abs_vlan_push_pop(struct bpf_test *self) 107 { 108 /* test: {skb->data[0], vlan_push} x 68 + {skb->data[0], vlan_pop} x 68 */ 109 #define PUSH_CNT 51 110 unsigned int len = BPF_MAXINSNS; 111 struct bpf_insn *insn = self->insns; 112 int i = 0, j, k = 0; 113 114 insn[i++] = BPF_MOV64_REG(BPF_REG_6, BPF_REG_1); 115 loop: 116 for (j = 0; j < PUSH_CNT; j++) { 117 insn[i++] = BPF_LD_ABS(BPF_B, 0); 118 insn[i] = BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x34, len - i - 2); 119 i++; 120 insn[i++] = BPF_MOV64_REG(BPF_REG_1, BPF_REG_6); 121 insn[i++] = BPF_MOV64_IMM(BPF_REG_2, 1); 122 insn[i++] = BPF_MOV64_IMM(BPF_REG_3, 2); 123 insn[i++] = BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 124 BPF_FUNC_skb_vlan_push), 125 insn[i] = BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, len - i - 2); 126 i++; 127 } 128 129 for (j = 0; j < PUSH_CNT; j++) { 130 insn[i++] = BPF_LD_ABS(BPF_B, 0); 131 insn[i] = BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x34, len - i - 2); 132 i++; 133 insn[i++] = BPF_MOV64_REG(BPF_REG_1, BPF_REG_6); 134 insn[i++] = BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 135 BPF_FUNC_skb_vlan_pop), 136 insn[i] = BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, len - i - 2); 137 i++; 138 } 139 if (++k < 5) 140 goto loop; 141 142 for (; i < len - 1; i++) 143 insn[i] = BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 0xbef); 144 insn[len - 1] = BPF_EXIT_INSN(); 145 } 146 147 static void bpf_fill_jump_around_ld_abs(struct bpf_test *self) 148 { 149 struct bpf_insn *insn = self->insns; 150 unsigned int len = BPF_MAXINSNS; 151 int i = 0; 152 153 insn[i++] = BPF_MOV64_REG(BPF_REG_6, BPF_REG_1); 154 insn[i++] = BPF_LD_ABS(BPF_B, 0); 155 insn[i] = BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 10, len - i - 2); 156 i++; 157 while (i < len - 1) 158 insn[i++] = BPF_LD_ABS(BPF_B, 1); 159 insn[i] = BPF_EXIT_INSN(); 160 } 161 162 static void bpf_fill_rand_ld_dw(struct bpf_test *self) 163 { 164 struct bpf_insn *insn = self->insns; 165 uint64_t res = 0; 166 int i = 0; 167 168 insn[i++] = BPF_MOV32_IMM(BPF_REG_0, 0); 169 while (i < self->retval) { 170 uint64_t val = bpf_semi_rand_get(); 171 struct bpf_insn tmp[2] = { BPF_LD_IMM64(BPF_REG_1, val) }; 172 173 res ^= val; 174 insn[i++] = tmp[0]; 175 insn[i++] = tmp[1]; 176 insn[i++] = BPF_ALU64_REG(BPF_XOR, BPF_REG_0, BPF_REG_1); 177 } 178 insn[i++] = BPF_MOV64_REG(BPF_REG_1, BPF_REG_0); 179 insn[i++] = BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 32); 180 insn[i++] = BPF_ALU64_REG(BPF_XOR, BPF_REG_0, BPF_REG_1); 181 insn[i] = BPF_EXIT_INSN(); 182 res ^= (res >> 32); 183 self->retval = (uint32_t)res; 184 } 185 186 /* BPF_SK_LOOKUP contains 13 instructions, if you need to fix up maps */ 187 #define BPF_SK_LOOKUP \ 188 /* struct bpf_sock_tuple tuple = {} */ \ 189 BPF_MOV64_IMM(BPF_REG_2, 0), \ 190 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_2, -8), \ 191 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -16), \ 192 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -24), \ 193 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -32), \ 194 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -40), \ 195 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -48), \ 196 /* sk = sk_lookup_tcp(ctx, &tuple, sizeof tuple, 0, 0) */ \ 197 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), \ 198 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -48), \ 199 BPF_MOV64_IMM(BPF_REG_3, sizeof(struct bpf_sock_tuple)), \ 200 BPF_MOV64_IMM(BPF_REG_4, 0), \ 201 BPF_MOV64_IMM(BPF_REG_5, 0), \ 202 BPF_EMIT_CALL(BPF_FUNC_sk_lookup_tcp) 203 204 static struct bpf_test tests[] = { 205 { 206 "add+sub+mul", 207 .insns = { 208 BPF_MOV64_IMM(BPF_REG_1, 1), 209 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 2), 210 BPF_MOV64_IMM(BPF_REG_2, 3), 211 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_2), 212 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -1), 213 BPF_ALU64_IMM(BPF_MUL, BPF_REG_1, 3), 214 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 215 BPF_EXIT_INSN(), 216 }, 217 .result = ACCEPT, 218 .retval = -3, 219 }, 220 { 221 "DIV32 by 0, zero check 1", 222 .insns = { 223 BPF_MOV32_IMM(BPF_REG_0, 42), 224 BPF_MOV32_IMM(BPF_REG_1, 0), 225 BPF_MOV32_IMM(BPF_REG_2, 1), 226 BPF_ALU32_REG(BPF_DIV, BPF_REG_2, BPF_REG_1), 227 BPF_EXIT_INSN(), 228 }, 229 .result = ACCEPT, 230 .retval = 42, 231 }, 232 { 233 "DIV32 by 0, zero check 2", 234 .insns = { 235 BPF_MOV32_IMM(BPF_REG_0, 42), 236 BPF_LD_IMM64(BPF_REG_1, 0xffffffff00000000LL), 237 BPF_MOV32_IMM(BPF_REG_2, 1), 238 BPF_ALU32_REG(BPF_DIV, BPF_REG_2, BPF_REG_1), 239 BPF_EXIT_INSN(), 240 }, 241 .result = ACCEPT, 242 .retval = 42, 243 }, 244 { 245 "DIV64 by 0, zero check", 246 .insns = { 247 BPF_MOV32_IMM(BPF_REG_0, 42), 248 BPF_MOV32_IMM(BPF_REG_1, 0), 249 BPF_MOV32_IMM(BPF_REG_2, 1), 250 BPF_ALU64_REG(BPF_DIV, BPF_REG_2, BPF_REG_1), 251 BPF_EXIT_INSN(), 252 }, 253 .result = ACCEPT, 254 .retval = 42, 255 }, 256 { 257 "MOD32 by 0, zero check 1", 258 .insns = { 259 BPF_MOV32_IMM(BPF_REG_0, 42), 260 BPF_MOV32_IMM(BPF_REG_1, 0), 261 BPF_MOV32_IMM(BPF_REG_2, 1), 262 BPF_ALU32_REG(BPF_MOD, BPF_REG_2, BPF_REG_1), 263 BPF_EXIT_INSN(), 264 }, 265 .result = ACCEPT, 266 .retval = 42, 267 }, 268 { 269 "MOD32 by 0, zero check 2", 270 .insns = { 271 BPF_MOV32_IMM(BPF_REG_0, 42), 272 BPF_LD_IMM64(BPF_REG_1, 0xffffffff00000000LL), 273 BPF_MOV32_IMM(BPF_REG_2, 1), 274 BPF_ALU32_REG(BPF_MOD, BPF_REG_2, BPF_REG_1), 275 BPF_EXIT_INSN(), 276 }, 277 .result = ACCEPT, 278 .retval = 42, 279 }, 280 { 281 "MOD64 by 0, zero check", 282 .insns = { 283 BPF_MOV32_IMM(BPF_REG_0, 42), 284 BPF_MOV32_IMM(BPF_REG_1, 0), 285 BPF_MOV32_IMM(BPF_REG_2, 1), 286 BPF_ALU64_REG(BPF_MOD, BPF_REG_2, BPF_REG_1), 287 BPF_EXIT_INSN(), 288 }, 289 .result = ACCEPT, 290 .retval = 42, 291 }, 292 { 293 "DIV32 by 0, zero check ok, cls", 294 .insns = { 295 BPF_MOV32_IMM(BPF_REG_0, 42), 296 BPF_MOV32_IMM(BPF_REG_1, 2), 297 BPF_MOV32_IMM(BPF_REG_2, 16), 298 BPF_ALU32_REG(BPF_DIV, BPF_REG_2, BPF_REG_1), 299 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 300 BPF_EXIT_INSN(), 301 }, 302 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 303 .result = ACCEPT, 304 .retval = 8, 305 }, 306 { 307 "DIV32 by 0, zero check 1, cls", 308 .insns = { 309 BPF_MOV32_IMM(BPF_REG_1, 0), 310 BPF_MOV32_IMM(BPF_REG_0, 1), 311 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_1), 312 BPF_EXIT_INSN(), 313 }, 314 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 315 .result = ACCEPT, 316 .retval = 0, 317 }, 318 { 319 "DIV32 by 0, zero check 2, cls", 320 .insns = { 321 BPF_LD_IMM64(BPF_REG_1, 0xffffffff00000000LL), 322 BPF_MOV32_IMM(BPF_REG_0, 1), 323 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_1), 324 BPF_EXIT_INSN(), 325 }, 326 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 327 .result = ACCEPT, 328 .retval = 0, 329 }, 330 { 331 "DIV64 by 0, zero check, cls", 332 .insns = { 333 BPF_MOV32_IMM(BPF_REG_1, 0), 334 BPF_MOV32_IMM(BPF_REG_0, 1), 335 BPF_ALU64_REG(BPF_DIV, BPF_REG_0, BPF_REG_1), 336 BPF_EXIT_INSN(), 337 }, 338 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 339 .result = ACCEPT, 340 .retval = 0, 341 }, 342 { 343 "MOD32 by 0, zero check ok, cls", 344 .insns = { 345 BPF_MOV32_IMM(BPF_REG_0, 42), 346 BPF_MOV32_IMM(BPF_REG_1, 3), 347 BPF_MOV32_IMM(BPF_REG_2, 5), 348 BPF_ALU32_REG(BPF_MOD, BPF_REG_2, BPF_REG_1), 349 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 350 BPF_EXIT_INSN(), 351 }, 352 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 353 .result = ACCEPT, 354 .retval = 2, 355 }, 356 { 357 "MOD32 by 0, zero check 1, cls", 358 .insns = { 359 BPF_MOV32_IMM(BPF_REG_1, 0), 360 BPF_MOV32_IMM(BPF_REG_0, 1), 361 BPF_ALU32_REG(BPF_MOD, BPF_REG_0, BPF_REG_1), 362 BPF_EXIT_INSN(), 363 }, 364 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 365 .result = ACCEPT, 366 .retval = 1, 367 }, 368 { 369 "MOD32 by 0, zero check 2, cls", 370 .insns = { 371 BPF_LD_IMM64(BPF_REG_1, 0xffffffff00000000LL), 372 BPF_MOV32_IMM(BPF_REG_0, 1), 373 BPF_ALU32_REG(BPF_MOD, BPF_REG_0, BPF_REG_1), 374 BPF_EXIT_INSN(), 375 }, 376 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 377 .result = ACCEPT, 378 .retval = 1, 379 }, 380 { 381 "MOD64 by 0, zero check 1, cls", 382 .insns = { 383 BPF_MOV32_IMM(BPF_REG_1, 0), 384 BPF_MOV32_IMM(BPF_REG_0, 2), 385 BPF_ALU64_REG(BPF_MOD, BPF_REG_0, BPF_REG_1), 386 BPF_EXIT_INSN(), 387 }, 388 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 389 .result = ACCEPT, 390 .retval = 2, 391 }, 392 { 393 "MOD64 by 0, zero check 2, cls", 394 .insns = { 395 BPF_MOV32_IMM(BPF_REG_1, 0), 396 BPF_MOV32_IMM(BPF_REG_0, -1), 397 BPF_ALU64_REG(BPF_MOD, BPF_REG_0, BPF_REG_1), 398 BPF_EXIT_INSN(), 399 }, 400 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 401 .result = ACCEPT, 402 .retval = -1, 403 }, 404 /* Just make sure that JITs used udiv/umod as otherwise we get 405 * an exception from INT_MIN/-1 overflow similarly as with div 406 * by zero. 407 */ 408 { 409 "DIV32 overflow, check 1", 410 .insns = { 411 BPF_MOV32_IMM(BPF_REG_1, -1), 412 BPF_MOV32_IMM(BPF_REG_0, INT_MIN), 413 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_1), 414 BPF_EXIT_INSN(), 415 }, 416 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 417 .result = ACCEPT, 418 .retval = 0, 419 }, 420 { 421 "DIV32 overflow, check 2", 422 .insns = { 423 BPF_MOV32_IMM(BPF_REG_0, INT_MIN), 424 BPF_ALU32_IMM(BPF_DIV, BPF_REG_0, -1), 425 BPF_EXIT_INSN(), 426 }, 427 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 428 .result = ACCEPT, 429 .retval = 0, 430 }, 431 { 432 "DIV64 overflow, check 1", 433 .insns = { 434 BPF_MOV64_IMM(BPF_REG_1, -1), 435 BPF_LD_IMM64(BPF_REG_0, LLONG_MIN), 436 BPF_ALU64_REG(BPF_DIV, BPF_REG_0, BPF_REG_1), 437 BPF_EXIT_INSN(), 438 }, 439 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 440 .result = ACCEPT, 441 .retval = 0, 442 }, 443 { 444 "DIV64 overflow, check 2", 445 .insns = { 446 BPF_LD_IMM64(BPF_REG_0, LLONG_MIN), 447 BPF_ALU64_IMM(BPF_DIV, BPF_REG_0, -1), 448 BPF_EXIT_INSN(), 449 }, 450 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 451 .result = ACCEPT, 452 .retval = 0, 453 }, 454 { 455 "MOD32 overflow, check 1", 456 .insns = { 457 BPF_MOV32_IMM(BPF_REG_1, -1), 458 BPF_MOV32_IMM(BPF_REG_0, INT_MIN), 459 BPF_ALU32_REG(BPF_MOD, BPF_REG_0, BPF_REG_1), 460 BPF_EXIT_INSN(), 461 }, 462 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 463 .result = ACCEPT, 464 .retval = INT_MIN, 465 }, 466 { 467 "MOD32 overflow, check 2", 468 .insns = { 469 BPF_MOV32_IMM(BPF_REG_0, INT_MIN), 470 BPF_ALU32_IMM(BPF_MOD, BPF_REG_0, -1), 471 BPF_EXIT_INSN(), 472 }, 473 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 474 .result = ACCEPT, 475 .retval = INT_MIN, 476 }, 477 { 478 "MOD64 overflow, check 1", 479 .insns = { 480 BPF_MOV64_IMM(BPF_REG_1, -1), 481 BPF_LD_IMM64(BPF_REG_2, LLONG_MIN), 482 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 483 BPF_ALU64_REG(BPF_MOD, BPF_REG_2, BPF_REG_1), 484 BPF_MOV32_IMM(BPF_REG_0, 0), 485 BPF_JMP_REG(BPF_JNE, BPF_REG_3, BPF_REG_2, 1), 486 BPF_MOV32_IMM(BPF_REG_0, 1), 487 BPF_EXIT_INSN(), 488 }, 489 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 490 .result = ACCEPT, 491 .retval = 1, 492 }, 493 { 494 "MOD64 overflow, check 2", 495 .insns = { 496 BPF_LD_IMM64(BPF_REG_2, LLONG_MIN), 497 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 498 BPF_ALU64_IMM(BPF_MOD, BPF_REG_2, -1), 499 BPF_MOV32_IMM(BPF_REG_0, 0), 500 BPF_JMP_REG(BPF_JNE, BPF_REG_3, BPF_REG_2, 1), 501 BPF_MOV32_IMM(BPF_REG_0, 1), 502 BPF_EXIT_INSN(), 503 }, 504 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 505 .result = ACCEPT, 506 .retval = 1, 507 }, 508 { 509 "xor32 zero extend check", 510 .insns = { 511 BPF_MOV32_IMM(BPF_REG_2, -1), 512 BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 32), 513 BPF_ALU64_IMM(BPF_OR, BPF_REG_2, 0xffff), 514 BPF_ALU32_REG(BPF_XOR, BPF_REG_2, BPF_REG_2), 515 BPF_MOV32_IMM(BPF_REG_0, 2), 516 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0, 1), 517 BPF_MOV32_IMM(BPF_REG_0, 1), 518 BPF_EXIT_INSN(), 519 }, 520 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 521 .result = ACCEPT, 522 .retval = 1, 523 }, 524 { 525 "empty prog", 526 .insns = { 527 }, 528 .errstr = "unknown opcode 00", 529 .result = REJECT, 530 }, 531 { 532 "only exit insn", 533 .insns = { 534 BPF_EXIT_INSN(), 535 }, 536 .errstr = "R0 !read_ok", 537 .result = REJECT, 538 }, 539 { 540 "unreachable", 541 .insns = { 542 BPF_EXIT_INSN(), 543 BPF_EXIT_INSN(), 544 }, 545 .errstr = "unreachable", 546 .result = REJECT, 547 }, 548 { 549 "unreachable2", 550 .insns = { 551 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 552 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 553 BPF_EXIT_INSN(), 554 }, 555 .errstr = "unreachable", 556 .result = REJECT, 557 }, 558 { 559 "out of range jump", 560 .insns = { 561 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 562 BPF_EXIT_INSN(), 563 }, 564 .errstr = "jump out of range", 565 .result = REJECT, 566 }, 567 { 568 "out of range jump2", 569 .insns = { 570 BPF_JMP_IMM(BPF_JA, 0, 0, -2), 571 BPF_EXIT_INSN(), 572 }, 573 .errstr = "jump out of range", 574 .result = REJECT, 575 }, 576 { 577 "test1 ld_imm64", 578 .insns = { 579 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 580 BPF_LD_IMM64(BPF_REG_0, 0), 581 BPF_LD_IMM64(BPF_REG_0, 0), 582 BPF_LD_IMM64(BPF_REG_0, 1), 583 BPF_LD_IMM64(BPF_REG_0, 1), 584 BPF_MOV64_IMM(BPF_REG_0, 2), 585 BPF_EXIT_INSN(), 586 }, 587 .errstr = "invalid BPF_LD_IMM insn", 588 .errstr_unpriv = "R1 pointer comparison", 589 .result = REJECT, 590 }, 591 { 592 "test2 ld_imm64", 593 .insns = { 594 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 595 BPF_LD_IMM64(BPF_REG_0, 0), 596 BPF_LD_IMM64(BPF_REG_0, 0), 597 BPF_LD_IMM64(BPF_REG_0, 1), 598 BPF_LD_IMM64(BPF_REG_0, 1), 599 BPF_EXIT_INSN(), 600 }, 601 .errstr = "invalid BPF_LD_IMM insn", 602 .errstr_unpriv = "R1 pointer comparison", 603 .result = REJECT, 604 }, 605 { 606 "test3 ld_imm64", 607 .insns = { 608 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 609 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0), 610 BPF_LD_IMM64(BPF_REG_0, 0), 611 BPF_LD_IMM64(BPF_REG_0, 0), 612 BPF_LD_IMM64(BPF_REG_0, 1), 613 BPF_LD_IMM64(BPF_REG_0, 1), 614 BPF_EXIT_INSN(), 615 }, 616 .errstr = "invalid bpf_ld_imm64 insn", 617 .result = REJECT, 618 }, 619 { 620 "test4 ld_imm64", 621 .insns = { 622 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0), 623 BPF_EXIT_INSN(), 624 }, 625 .errstr = "invalid bpf_ld_imm64 insn", 626 .result = REJECT, 627 }, 628 { 629 "test5 ld_imm64", 630 .insns = { 631 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0), 632 }, 633 .errstr = "invalid bpf_ld_imm64 insn", 634 .result = REJECT, 635 }, 636 { 637 "test6 ld_imm64", 638 .insns = { 639 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0), 640 BPF_RAW_INSN(0, 0, 0, 0, 0), 641 BPF_EXIT_INSN(), 642 }, 643 .result = ACCEPT, 644 }, 645 { 646 "test7 ld_imm64", 647 .insns = { 648 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 1), 649 BPF_RAW_INSN(0, 0, 0, 0, 1), 650 BPF_EXIT_INSN(), 651 }, 652 .result = ACCEPT, 653 .retval = 1, 654 }, 655 { 656 "test8 ld_imm64", 657 .insns = { 658 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 1, 1), 659 BPF_RAW_INSN(0, 0, 0, 0, 1), 660 BPF_EXIT_INSN(), 661 }, 662 .errstr = "uses reserved fields", 663 .result = REJECT, 664 }, 665 { 666 "test9 ld_imm64", 667 .insns = { 668 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 1), 669 BPF_RAW_INSN(0, 0, 0, 1, 1), 670 BPF_EXIT_INSN(), 671 }, 672 .errstr = "invalid bpf_ld_imm64 insn", 673 .result = REJECT, 674 }, 675 { 676 "test10 ld_imm64", 677 .insns = { 678 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 1), 679 BPF_RAW_INSN(0, BPF_REG_1, 0, 0, 1), 680 BPF_EXIT_INSN(), 681 }, 682 .errstr = "invalid bpf_ld_imm64 insn", 683 .result = REJECT, 684 }, 685 { 686 "test11 ld_imm64", 687 .insns = { 688 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 1), 689 BPF_RAW_INSN(0, 0, BPF_REG_1, 0, 1), 690 BPF_EXIT_INSN(), 691 }, 692 .errstr = "invalid bpf_ld_imm64 insn", 693 .result = REJECT, 694 }, 695 { 696 "test12 ld_imm64", 697 .insns = { 698 BPF_MOV64_IMM(BPF_REG_1, 0), 699 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, BPF_REG_1, 0, 1), 700 BPF_RAW_INSN(0, 0, 0, 0, 1), 701 BPF_EXIT_INSN(), 702 }, 703 .errstr = "not pointing to valid bpf_map", 704 .result = REJECT, 705 }, 706 { 707 "test13 ld_imm64", 708 .insns = { 709 BPF_MOV64_IMM(BPF_REG_1, 0), 710 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, BPF_REG_1, 0, 1), 711 BPF_RAW_INSN(0, 0, BPF_REG_1, 0, 1), 712 BPF_EXIT_INSN(), 713 }, 714 .errstr = "invalid bpf_ld_imm64 insn", 715 .result = REJECT, 716 }, 717 { 718 "arsh32 on imm", 719 .insns = { 720 BPF_MOV64_IMM(BPF_REG_0, 1), 721 BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 5), 722 BPF_EXIT_INSN(), 723 }, 724 .result = ACCEPT, 725 .retval = 0, 726 }, 727 { 728 "arsh32 on imm 2", 729 .insns = { 730 BPF_LD_IMM64(BPF_REG_0, 0x1122334485667788), 731 BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 7), 732 BPF_EXIT_INSN(), 733 }, 734 .result = ACCEPT, 735 .retval = -16069393, 736 }, 737 { 738 "arsh32 on reg", 739 .insns = { 740 BPF_MOV64_IMM(BPF_REG_0, 1), 741 BPF_MOV64_IMM(BPF_REG_1, 5), 742 BPF_ALU32_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1), 743 BPF_EXIT_INSN(), 744 }, 745 .result = ACCEPT, 746 .retval = 0, 747 }, 748 { 749 "arsh32 on reg 2", 750 .insns = { 751 BPF_LD_IMM64(BPF_REG_0, 0xffff55667788), 752 BPF_MOV64_IMM(BPF_REG_1, 15), 753 BPF_ALU32_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1), 754 BPF_EXIT_INSN(), 755 }, 756 .result = ACCEPT, 757 .retval = 43724, 758 }, 759 { 760 "arsh64 on imm", 761 .insns = { 762 BPF_MOV64_IMM(BPF_REG_0, 1), 763 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_0, 5), 764 BPF_EXIT_INSN(), 765 }, 766 .result = ACCEPT, 767 }, 768 { 769 "arsh64 on reg", 770 .insns = { 771 BPF_MOV64_IMM(BPF_REG_0, 1), 772 BPF_MOV64_IMM(BPF_REG_1, 5), 773 BPF_ALU64_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1), 774 BPF_EXIT_INSN(), 775 }, 776 .result = ACCEPT, 777 }, 778 { 779 "no bpf_exit", 780 .insns = { 781 BPF_ALU64_REG(BPF_MOV, BPF_REG_0, BPF_REG_2), 782 }, 783 .errstr = "not an exit", 784 .result = REJECT, 785 }, 786 { 787 "loop (back-edge)", 788 .insns = { 789 BPF_JMP_IMM(BPF_JA, 0, 0, -1), 790 BPF_EXIT_INSN(), 791 }, 792 .errstr = "back-edge", 793 .result = REJECT, 794 }, 795 { 796 "loop2 (back-edge)", 797 .insns = { 798 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 799 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 800 BPF_MOV64_REG(BPF_REG_3, BPF_REG_0), 801 BPF_JMP_IMM(BPF_JA, 0, 0, -4), 802 BPF_EXIT_INSN(), 803 }, 804 .errstr = "back-edge", 805 .result = REJECT, 806 }, 807 { 808 "conditional loop", 809 .insns = { 810 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 811 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 812 BPF_MOV64_REG(BPF_REG_3, BPF_REG_0), 813 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, -3), 814 BPF_EXIT_INSN(), 815 }, 816 .errstr = "back-edge", 817 .result = REJECT, 818 }, 819 { 820 "read uninitialized register", 821 .insns = { 822 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 823 BPF_EXIT_INSN(), 824 }, 825 .errstr = "R2 !read_ok", 826 .result = REJECT, 827 }, 828 { 829 "read invalid register", 830 .insns = { 831 BPF_MOV64_REG(BPF_REG_0, -1), 832 BPF_EXIT_INSN(), 833 }, 834 .errstr = "R15 is invalid", 835 .result = REJECT, 836 }, 837 { 838 "program doesn't init R0 before exit", 839 .insns = { 840 BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1), 841 BPF_EXIT_INSN(), 842 }, 843 .errstr = "R0 !read_ok", 844 .result = REJECT, 845 }, 846 { 847 "program doesn't init R0 before exit in all branches", 848 .insns = { 849 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 850 BPF_MOV64_IMM(BPF_REG_0, 1), 851 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 2), 852 BPF_EXIT_INSN(), 853 }, 854 .errstr = "R0 !read_ok", 855 .errstr_unpriv = "R1 pointer comparison", 856 .result = REJECT, 857 }, 858 { 859 "stack out of bounds", 860 .insns = { 861 BPF_ST_MEM(BPF_DW, BPF_REG_10, 8, 0), 862 BPF_EXIT_INSN(), 863 }, 864 .errstr = "invalid stack", 865 .result = REJECT, 866 }, 867 { 868 "invalid call insn1", 869 .insns = { 870 BPF_RAW_INSN(BPF_JMP | BPF_CALL | BPF_X, 0, 0, 0, 0), 871 BPF_EXIT_INSN(), 872 }, 873 .errstr = "unknown opcode 8d", 874 .result = REJECT, 875 }, 876 { 877 "invalid call insn2", 878 .insns = { 879 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 1, 0), 880 BPF_EXIT_INSN(), 881 }, 882 .errstr = "BPF_CALL uses reserved", 883 .result = REJECT, 884 }, 885 { 886 "invalid function call", 887 .insns = { 888 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1234567), 889 BPF_EXIT_INSN(), 890 }, 891 .errstr = "invalid func unknown#1234567", 892 .result = REJECT, 893 }, 894 { 895 "uninitialized stack1", 896 .insns = { 897 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 898 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 899 BPF_LD_MAP_FD(BPF_REG_1, 0), 900 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 901 BPF_FUNC_map_lookup_elem), 902 BPF_EXIT_INSN(), 903 }, 904 .fixup_map_hash_8b = { 2 }, 905 .errstr = "invalid indirect read from stack", 906 .result = REJECT, 907 }, 908 { 909 "uninitialized stack2", 910 .insns = { 911 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 912 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, -8), 913 BPF_EXIT_INSN(), 914 }, 915 .errstr = "invalid read from stack", 916 .result = REJECT, 917 }, 918 { 919 "invalid fp arithmetic", 920 /* If this gets ever changed, make sure JITs can deal with it. */ 921 .insns = { 922 BPF_MOV64_IMM(BPF_REG_0, 0), 923 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 924 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 8), 925 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), 926 BPF_EXIT_INSN(), 927 }, 928 .errstr = "R1 subtraction from stack pointer", 929 .result = REJECT, 930 }, 931 { 932 "non-invalid fp arithmetic", 933 .insns = { 934 BPF_MOV64_IMM(BPF_REG_0, 0), 935 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 936 BPF_EXIT_INSN(), 937 }, 938 .result = ACCEPT, 939 }, 940 { 941 "invalid argument register", 942 .insns = { 943 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 944 BPF_FUNC_get_cgroup_classid), 945 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 946 BPF_FUNC_get_cgroup_classid), 947 BPF_EXIT_INSN(), 948 }, 949 .errstr = "R1 !read_ok", 950 .result = REJECT, 951 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 952 }, 953 { 954 "non-invalid argument register", 955 .insns = { 956 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 957 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 958 BPF_FUNC_get_cgroup_classid), 959 BPF_ALU64_REG(BPF_MOV, BPF_REG_1, BPF_REG_6), 960 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 961 BPF_FUNC_get_cgroup_classid), 962 BPF_EXIT_INSN(), 963 }, 964 .result = ACCEPT, 965 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 966 }, 967 { 968 "check valid spill/fill", 969 .insns = { 970 /* spill R1(ctx) into stack */ 971 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 972 /* fill it back into R2 */ 973 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -8), 974 /* should be able to access R0 = *(R2 + 8) */ 975 /* BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, 8), */ 976 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 977 BPF_EXIT_INSN(), 978 }, 979 .errstr_unpriv = "R0 leaks addr", 980 .result = ACCEPT, 981 .result_unpriv = REJECT, 982 .retval = POINTER_VALUE, 983 }, 984 { 985 "check valid spill/fill, skb mark", 986 .insns = { 987 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 988 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_6, -8), 989 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 990 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 991 offsetof(struct __sk_buff, mark)), 992 BPF_EXIT_INSN(), 993 }, 994 .result = ACCEPT, 995 .result_unpriv = ACCEPT, 996 }, 997 { 998 "check corrupted spill/fill", 999 .insns = { 1000 /* spill R1(ctx) into stack */ 1001 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 1002 /* mess up with R1 pointer on stack */ 1003 BPF_ST_MEM(BPF_B, BPF_REG_10, -7, 0x23), 1004 /* fill back into R0 should fail */ 1005 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 1006 BPF_EXIT_INSN(), 1007 }, 1008 .errstr_unpriv = "attempt to corrupt spilled", 1009 .errstr = "corrupted spill", 1010 .result = REJECT, 1011 }, 1012 { 1013 "invalid src register in STX", 1014 .insns = { 1015 BPF_STX_MEM(BPF_B, BPF_REG_10, -1, -1), 1016 BPF_EXIT_INSN(), 1017 }, 1018 .errstr = "R15 is invalid", 1019 .result = REJECT, 1020 }, 1021 { 1022 "invalid dst register in STX", 1023 .insns = { 1024 BPF_STX_MEM(BPF_B, 14, BPF_REG_10, -1), 1025 BPF_EXIT_INSN(), 1026 }, 1027 .errstr = "R14 is invalid", 1028 .result = REJECT, 1029 }, 1030 { 1031 "invalid dst register in ST", 1032 .insns = { 1033 BPF_ST_MEM(BPF_B, 14, -1, -1), 1034 BPF_EXIT_INSN(), 1035 }, 1036 .errstr = "R14 is invalid", 1037 .result = REJECT, 1038 }, 1039 { 1040 "invalid src register in LDX", 1041 .insns = { 1042 BPF_LDX_MEM(BPF_B, BPF_REG_0, 12, 0), 1043 BPF_EXIT_INSN(), 1044 }, 1045 .errstr = "R12 is invalid", 1046 .result = REJECT, 1047 }, 1048 { 1049 "invalid dst register in LDX", 1050 .insns = { 1051 BPF_LDX_MEM(BPF_B, 11, BPF_REG_1, 0), 1052 BPF_EXIT_INSN(), 1053 }, 1054 .errstr = "R11 is invalid", 1055 .result = REJECT, 1056 }, 1057 { 1058 "junk insn", 1059 .insns = { 1060 BPF_RAW_INSN(0, 0, 0, 0, 0), 1061 BPF_EXIT_INSN(), 1062 }, 1063 .errstr = "unknown opcode 00", 1064 .result = REJECT, 1065 }, 1066 { 1067 "junk insn2", 1068 .insns = { 1069 BPF_RAW_INSN(1, 0, 0, 0, 0), 1070 BPF_EXIT_INSN(), 1071 }, 1072 .errstr = "BPF_LDX uses reserved fields", 1073 .result = REJECT, 1074 }, 1075 { 1076 "junk insn3", 1077 .insns = { 1078 BPF_RAW_INSN(-1, 0, 0, 0, 0), 1079 BPF_EXIT_INSN(), 1080 }, 1081 .errstr = "unknown opcode ff", 1082 .result = REJECT, 1083 }, 1084 { 1085 "junk insn4", 1086 .insns = { 1087 BPF_RAW_INSN(-1, -1, -1, -1, -1), 1088 BPF_EXIT_INSN(), 1089 }, 1090 .errstr = "unknown opcode ff", 1091 .result = REJECT, 1092 }, 1093 { 1094 "junk insn5", 1095 .insns = { 1096 BPF_RAW_INSN(0x7f, -1, -1, -1, -1), 1097 BPF_EXIT_INSN(), 1098 }, 1099 .errstr = "BPF_ALU uses reserved fields", 1100 .result = REJECT, 1101 }, 1102 { 1103 "misaligned read from stack", 1104 .insns = { 1105 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1106 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, -4), 1107 BPF_EXIT_INSN(), 1108 }, 1109 .errstr = "misaligned stack access", 1110 .result = REJECT, 1111 }, 1112 { 1113 "invalid map_fd for function call", 1114 .insns = { 1115 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1116 BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_10), 1117 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1118 BPF_LD_MAP_FD(BPF_REG_1, 0), 1119 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1120 BPF_FUNC_map_delete_elem), 1121 BPF_EXIT_INSN(), 1122 }, 1123 .errstr = "fd 0 is not pointing to valid bpf_map", 1124 .result = REJECT, 1125 }, 1126 { 1127 "don't check return value before access", 1128 .insns = { 1129 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1130 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1131 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1132 BPF_LD_MAP_FD(BPF_REG_1, 0), 1133 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1134 BPF_FUNC_map_lookup_elem), 1135 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 1136 BPF_EXIT_INSN(), 1137 }, 1138 .fixup_map_hash_8b = { 3 }, 1139 .errstr = "R0 invalid mem access 'map_value_or_null'", 1140 .result = REJECT, 1141 }, 1142 { 1143 "access memory with incorrect alignment", 1144 .insns = { 1145 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1146 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1147 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1148 BPF_LD_MAP_FD(BPF_REG_1, 0), 1149 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1150 BPF_FUNC_map_lookup_elem), 1151 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 1152 BPF_ST_MEM(BPF_DW, BPF_REG_0, 4, 0), 1153 BPF_EXIT_INSN(), 1154 }, 1155 .fixup_map_hash_8b = { 3 }, 1156 .errstr = "misaligned value access", 1157 .result = REJECT, 1158 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 1159 }, 1160 { 1161 "sometimes access memory with incorrect alignment", 1162 .insns = { 1163 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1164 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1165 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1166 BPF_LD_MAP_FD(BPF_REG_1, 0), 1167 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1168 BPF_FUNC_map_lookup_elem), 1169 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 1170 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 1171 BPF_EXIT_INSN(), 1172 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 1), 1173 BPF_EXIT_INSN(), 1174 }, 1175 .fixup_map_hash_8b = { 3 }, 1176 .errstr = "R0 invalid mem access", 1177 .errstr_unpriv = "R0 leaks addr", 1178 .result = REJECT, 1179 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 1180 }, 1181 { 1182 "jump test 1", 1183 .insns = { 1184 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1185 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -8), 1186 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 1187 BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 0), 1188 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 1), 1189 BPF_ST_MEM(BPF_DW, BPF_REG_2, -16, 1), 1190 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 2, 1), 1191 BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 2), 1192 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 3, 1), 1193 BPF_ST_MEM(BPF_DW, BPF_REG_2, -16, 3), 1194 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 4, 1), 1195 BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 4), 1196 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 5, 1), 1197 BPF_ST_MEM(BPF_DW, BPF_REG_2, -32, 5), 1198 BPF_MOV64_IMM(BPF_REG_0, 0), 1199 BPF_EXIT_INSN(), 1200 }, 1201 .errstr_unpriv = "R1 pointer comparison", 1202 .result_unpriv = REJECT, 1203 .result = ACCEPT, 1204 }, 1205 { 1206 "jump test 2", 1207 .insns = { 1208 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1209 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 2), 1210 BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 0), 1211 BPF_JMP_IMM(BPF_JA, 0, 0, 14), 1212 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 2), 1213 BPF_ST_MEM(BPF_DW, BPF_REG_2, -16, 0), 1214 BPF_JMP_IMM(BPF_JA, 0, 0, 11), 1215 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 2, 2), 1216 BPF_ST_MEM(BPF_DW, BPF_REG_2, -32, 0), 1217 BPF_JMP_IMM(BPF_JA, 0, 0, 8), 1218 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 3, 2), 1219 BPF_ST_MEM(BPF_DW, BPF_REG_2, -40, 0), 1220 BPF_JMP_IMM(BPF_JA, 0, 0, 5), 1221 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 4, 2), 1222 BPF_ST_MEM(BPF_DW, BPF_REG_2, -48, 0), 1223 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 1224 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 5, 1), 1225 BPF_ST_MEM(BPF_DW, BPF_REG_2, -56, 0), 1226 BPF_MOV64_IMM(BPF_REG_0, 0), 1227 BPF_EXIT_INSN(), 1228 }, 1229 .errstr_unpriv = "R1 pointer comparison", 1230 .result_unpriv = REJECT, 1231 .result = ACCEPT, 1232 }, 1233 { 1234 "jump test 3", 1235 .insns = { 1236 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1237 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3), 1238 BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 0), 1239 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1240 BPF_JMP_IMM(BPF_JA, 0, 0, 19), 1241 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 3), 1242 BPF_ST_MEM(BPF_DW, BPF_REG_2, -16, 0), 1243 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 1244 BPF_JMP_IMM(BPF_JA, 0, 0, 15), 1245 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 2, 3), 1246 BPF_ST_MEM(BPF_DW, BPF_REG_2, -32, 0), 1247 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -32), 1248 BPF_JMP_IMM(BPF_JA, 0, 0, 11), 1249 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 3, 3), 1250 BPF_ST_MEM(BPF_DW, BPF_REG_2, -40, 0), 1251 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -40), 1252 BPF_JMP_IMM(BPF_JA, 0, 0, 7), 1253 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 4, 3), 1254 BPF_ST_MEM(BPF_DW, BPF_REG_2, -48, 0), 1255 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -48), 1256 BPF_JMP_IMM(BPF_JA, 0, 0, 3), 1257 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 5, 0), 1258 BPF_ST_MEM(BPF_DW, BPF_REG_2, -56, 0), 1259 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -56), 1260 BPF_LD_MAP_FD(BPF_REG_1, 0), 1261 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1262 BPF_FUNC_map_delete_elem), 1263 BPF_EXIT_INSN(), 1264 }, 1265 .fixup_map_hash_8b = { 24 }, 1266 .errstr_unpriv = "R1 pointer comparison", 1267 .result_unpriv = REJECT, 1268 .result = ACCEPT, 1269 .retval = -ENOENT, 1270 }, 1271 { 1272 "jump test 4", 1273 .insns = { 1274 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1275 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1276 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1277 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1278 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1279 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1280 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1281 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1282 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1283 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1284 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1285 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1286 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1287 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1288 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1289 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1290 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1291 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1292 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1293 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1294 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1295 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1296 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1297 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1298 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1299 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1300 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1301 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1302 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1303 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1304 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1305 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1306 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1307 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1308 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1309 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1310 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0), 1311 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0), 1312 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0), 1313 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0), 1314 BPF_MOV64_IMM(BPF_REG_0, 0), 1315 BPF_EXIT_INSN(), 1316 }, 1317 .errstr_unpriv = "R1 pointer comparison", 1318 .result_unpriv = REJECT, 1319 .result = ACCEPT, 1320 }, 1321 { 1322 "jump test 5", 1323 .insns = { 1324 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1325 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 1326 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 1327 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8), 1328 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 1329 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8), 1330 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 1331 BPF_MOV64_IMM(BPF_REG_0, 0), 1332 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 1333 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8), 1334 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 1335 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8), 1336 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 1337 BPF_MOV64_IMM(BPF_REG_0, 0), 1338 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 1339 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8), 1340 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 1341 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8), 1342 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 1343 BPF_MOV64_IMM(BPF_REG_0, 0), 1344 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 1345 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8), 1346 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 1347 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8), 1348 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 1349 BPF_MOV64_IMM(BPF_REG_0, 0), 1350 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 1351 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8), 1352 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 1353 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8), 1354 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 1355 BPF_MOV64_IMM(BPF_REG_0, 0), 1356 BPF_EXIT_INSN(), 1357 }, 1358 .errstr_unpriv = "R1 pointer comparison", 1359 .result_unpriv = REJECT, 1360 .result = ACCEPT, 1361 }, 1362 { 1363 "access skb fields ok", 1364 .insns = { 1365 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1366 offsetof(struct __sk_buff, len)), 1367 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1), 1368 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1369 offsetof(struct __sk_buff, mark)), 1370 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1), 1371 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1372 offsetof(struct __sk_buff, pkt_type)), 1373 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1), 1374 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1375 offsetof(struct __sk_buff, queue_mapping)), 1376 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0), 1377 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1378 offsetof(struct __sk_buff, protocol)), 1379 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0), 1380 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1381 offsetof(struct __sk_buff, vlan_present)), 1382 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0), 1383 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1384 offsetof(struct __sk_buff, vlan_tci)), 1385 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0), 1386 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1387 offsetof(struct __sk_buff, napi_id)), 1388 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0), 1389 BPF_EXIT_INSN(), 1390 }, 1391 .result = ACCEPT, 1392 }, 1393 { 1394 "access skb fields bad1", 1395 .insns = { 1396 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -4), 1397 BPF_EXIT_INSN(), 1398 }, 1399 .errstr = "invalid bpf_context access", 1400 .result = REJECT, 1401 }, 1402 { 1403 "access skb fields bad2", 1404 .insns = { 1405 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 9), 1406 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1407 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1408 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1409 BPF_LD_MAP_FD(BPF_REG_1, 0), 1410 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1411 BPF_FUNC_map_lookup_elem), 1412 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 1413 BPF_EXIT_INSN(), 1414 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 1415 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1416 offsetof(struct __sk_buff, pkt_type)), 1417 BPF_EXIT_INSN(), 1418 }, 1419 .fixup_map_hash_8b = { 4 }, 1420 .errstr = "different pointers", 1421 .errstr_unpriv = "R1 pointer comparison", 1422 .result = REJECT, 1423 }, 1424 { 1425 "access skb fields bad3", 1426 .insns = { 1427 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 1428 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1429 offsetof(struct __sk_buff, pkt_type)), 1430 BPF_EXIT_INSN(), 1431 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1432 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1433 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1434 BPF_LD_MAP_FD(BPF_REG_1, 0), 1435 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1436 BPF_FUNC_map_lookup_elem), 1437 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 1438 BPF_EXIT_INSN(), 1439 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 1440 BPF_JMP_IMM(BPF_JA, 0, 0, -12), 1441 }, 1442 .fixup_map_hash_8b = { 6 }, 1443 .errstr = "different pointers", 1444 .errstr_unpriv = "R1 pointer comparison", 1445 .result = REJECT, 1446 }, 1447 { 1448 "access skb fields bad4", 1449 .insns = { 1450 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 3), 1451 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 1452 offsetof(struct __sk_buff, len)), 1453 BPF_MOV64_IMM(BPF_REG_0, 0), 1454 BPF_EXIT_INSN(), 1455 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1456 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1457 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1458 BPF_LD_MAP_FD(BPF_REG_1, 0), 1459 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1460 BPF_FUNC_map_lookup_elem), 1461 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 1462 BPF_EXIT_INSN(), 1463 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 1464 BPF_JMP_IMM(BPF_JA, 0, 0, -13), 1465 }, 1466 .fixup_map_hash_8b = { 7 }, 1467 .errstr = "different pointers", 1468 .errstr_unpriv = "R1 pointer comparison", 1469 .result = REJECT, 1470 }, 1471 { 1472 "invalid access __sk_buff family", 1473 .insns = { 1474 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1475 offsetof(struct __sk_buff, family)), 1476 BPF_EXIT_INSN(), 1477 }, 1478 .errstr = "invalid bpf_context access", 1479 .result = REJECT, 1480 }, 1481 { 1482 "invalid access __sk_buff remote_ip4", 1483 .insns = { 1484 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1485 offsetof(struct __sk_buff, remote_ip4)), 1486 BPF_EXIT_INSN(), 1487 }, 1488 .errstr = "invalid bpf_context access", 1489 .result = REJECT, 1490 }, 1491 { 1492 "invalid access __sk_buff local_ip4", 1493 .insns = { 1494 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1495 offsetof(struct __sk_buff, local_ip4)), 1496 BPF_EXIT_INSN(), 1497 }, 1498 .errstr = "invalid bpf_context access", 1499 .result = REJECT, 1500 }, 1501 { 1502 "invalid access __sk_buff remote_ip6", 1503 .insns = { 1504 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1505 offsetof(struct __sk_buff, remote_ip6)), 1506 BPF_EXIT_INSN(), 1507 }, 1508 .errstr = "invalid bpf_context access", 1509 .result = REJECT, 1510 }, 1511 { 1512 "invalid access __sk_buff local_ip6", 1513 .insns = { 1514 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1515 offsetof(struct __sk_buff, local_ip6)), 1516 BPF_EXIT_INSN(), 1517 }, 1518 .errstr = "invalid bpf_context access", 1519 .result = REJECT, 1520 }, 1521 { 1522 "invalid access __sk_buff remote_port", 1523 .insns = { 1524 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1525 offsetof(struct __sk_buff, remote_port)), 1526 BPF_EXIT_INSN(), 1527 }, 1528 .errstr = "invalid bpf_context access", 1529 .result = REJECT, 1530 }, 1531 { 1532 "invalid access __sk_buff remote_port", 1533 .insns = { 1534 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1535 offsetof(struct __sk_buff, local_port)), 1536 BPF_EXIT_INSN(), 1537 }, 1538 .errstr = "invalid bpf_context access", 1539 .result = REJECT, 1540 }, 1541 { 1542 "valid access __sk_buff family", 1543 .insns = { 1544 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1545 offsetof(struct __sk_buff, family)), 1546 BPF_EXIT_INSN(), 1547 }, 1548 .result = ACCEPT, 1549 .prog_type = BPF_PROG_TYPE_SK_SKB, 1550 }, 1551 { 1552 "valid access __sk_buff remote_ip4", 1553 .insns = { 1554 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1555 offsetof(struct __sk_buff, remote_ip4)), 1556 BPF_EXIT_INSN(), 1557 }, 1558 .result = ACCEPT, 1559 .prog_type = BPF_PROG_TYPE_SK_SKB, 1560 }, 1561 { 1562 "valid access __sk_buff local_ip4", 1563 .insns = { 1564 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1565 offsetof(struct __sk_buff, local_ip4)), 1566 BPF_EXIT_INSN(), 1567 }, 1568 .result = ACCEPT, 1569 .prog_type = BPF_PROG_TYPE_SK_SKB, 1570 }, 1571 { 1572 "valid access __sk_buff remote_ip6", 1573 .insns = { 1574 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1575 offsetof(struct __sk_buff, remote_ip6[0])), 1576 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1577 offsetof(struct __sk_buff, remote_ip6[1])), 1578 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1579 offsetof(struct __sk_buff, remote_ip6[2])), 1580 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1581 offsetof(struct __sk_buff, remote_ip6[3])), 1582 BPF_EXIT_INSN(), 1583 }, 1584 .result = ACCEPT, 1585 .prog_type = BPF_PROG_TYPE_SK_SKB, 1586 }, 1587 { 1588 "valid access __sk_buff local_ip6", 1589 .insns = { 1590 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1591 offsetof(struct __sk_buff, local_ip6[0])), 1592 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1593 offsetof(struct __sk_buff, local_ip6[1])), 1594 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1595 offsetof(struct __sk_buff, local_ip6[2])), 1596 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1597 offsetof(struct __sk_buff, local_ip6[3])), 1598 BPF_EXIT_INSN(), 1599 }, 1600 .result = ACCEPT, 1601 .prog_type = BPF_PROG_TYPE_SK_SKB, 1602 }, 1603 { 1604 "valid access __sk_buff remote_port", 1605 .insns = { 1606 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1607 offsetof(struct __sk_buff, remote_port)), 1608 BPF_EXIT_INSN(), 1609 }, 1610 .result = ACCEPT, 1611 .prog_type = BPF_PROG_TYPE_SK_SKB, 1612 }, 1613 { 1614 "valid access __sk_buff remote_port", 1615 .insns = { 1616 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1617 offsetof(struct __sk_buff, local_port)), 1618 BPF_EXIT_INSN(), 1619 }, 1620 .result = ACCEPT, 1621 .prog_type = BPF_PROG_TYPE_SK_SKB, 1622 }, 1623 { 1624 "invalid access of tc_classid for SK_SKB", 1625 .insns = { 1626 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1627 offsetof(struct __sk_buff, tc_classid)), 1628 BPF_EXIT_INSN(), 1629 }, 1630 .result = REJECT, 1631 .prog_type = BPF_PROG_TYPE_SK_SKB, 1632 .errstr = "invalid bpf_context access", 1633 }, 1634 { 1635 "invalid access of skb->mark for SK_SKB", 1636 .insns = { 1637 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1638 offsetof(struct __sk_buff, mark)), 1639 BPF_EXIT_INSN(), 1640 }, 1641 .result = REJECT, 1642 .prog_type = BPF_PROG_TYPE_SK_SKB, 1643 .errstr = "invalid bpf_context access", 1644 }, 1645 { 1646 "check skb->mark is not writeable by SK_SKB", 1647 .insns = { 1648 BPF_MOV64_IMM(BPF_REG_0, 0), 1649 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 1650 offsetof(struct __sk_buff, mark)), 1651 BPF_EXIT_INSN(), 1652 }, 1653 .result = REJECT, 1654 .prog_type = BPF_PROG_TYPE_SK_SKB, 1655 .errstr = "invalid bpf_context access", 1656 }, 1657 { 1658 "check skb->tc_index is writeable by SK_SKB", 1659 .insns = { 1660 BPF_MOV64_IMM(BPF_REG_0, 0), 1661 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 1662 offsetof(struct __sk_buff, tc_index)), 1663 BPF_EXIT_INSN(), 1664 }, 1665 .result = ACCEPT, 1666 .prog_type = BPF_PROG_TYPE_SK_SKB, 1667 }, 1668 { 1669 "check skb->priority is writeable by SK_SKB", 1670 .insns = { 1671 BPF_MOV64_IMM(BPF_REG_0, 0), 1672 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 1673 offsetof(struct __sk_buff, priority)), 1674 BPF_EXIT_INSN(), 1675 }, 1676 .result = ACCEPT, 1677 .prog_type = BPF_PROG_TYPE_SK_SKB, 1678 }, 1679 { 1680 "direct packet read for SK_SKB", 1681 .insns = { 1682 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 1683 offsetof(struct __sk_buff, data)), 1684 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 1685 offsetof(struct __sk_buff, data_end)), 1686 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 1687 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 1688 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 1689 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 1690 BPF_MOV64_IMM(BPF_REG_0, 0), 1691 BPF_EXIT_INSN(), 1692 }, 1693 .result = ACCEPT, 1694 .prog_type = BPF_PROG_TYPE_SK_SKB, 1695 }, 1696 { 1697 "direct packet write for SK_SKB", 1698 .insns = { 1699 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 1700 offsetof(struct __sk_buff, data)), 1701 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 1702 offsetof(struct __sk_buff, data_end)), 1703 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 1704 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 1705 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 1706 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 1707 BPF_MOV64_IMM(BPF_REG_0, 0), 1708 BPF_EXIT_INSN(), 1709 }, 1710 .result = ACCEPT, 1711 .prog_type = BPF_PROG_TYPE_SK_SKB, 1712 }, 1713 { 1714 "overlapping checks for direct packet access SK_SKB", 1715 .insns = { 1716 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 1717 offsetof(struct __sk_buff, data)), 1718 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 1719 offsetof(struct __sk_buff, data_end)), 1720 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 1721 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 1722 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 4), 1723 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 1724 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6), 1725 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 1726 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_2, 6), 1727 BPF_MOV64_IMM(BPF_REG_0, 0), 1728 BPF_EXIT_INSN(), 1729 }, 1730 .result = ACCEPT, 1731 .prog_type = BPF_PROG_TYPE_SK_SKB, 1732 }, 1733 { 1734 "valid access family in SK_MSG", 1735 .insns = { 1736 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1737 offsetof(struct sk_msg_md, family)), 1738 BPF_EXIT_INSN(), 1739 }, 1740 .result = ACCEPT, 1741 .prog_type = BPF_PROG_TYPE_SK_MSG, 1742 }, 1743 { 1744 "valid access remote_ip4 in SK_MSG", 1745 .insns = { 1746 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1747 offsetof(struct sk_msg_md, remote_ip4)), 1748 BPF_EXIT_INSN(), 1749 }, 1750 .result = ACCEPT, 1751 .prog_type = BPF_PROG_TYPE_SK_MSG, 1752 }, 1753 { 1754 "valid access local_ip4 in SK_MSG", 1755 .insns = { 1756 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1757 offsetof(struct sk_msg_md, local_ip4)), 1758 BPF_EXIT_INSN(), 1759 }, 1760 .result = ACCEPT, 1761 .prog_type = BPF_PROG_TYPE_SK_MSG, 1762 }, 1763 { 1764 "valid access remote_port in SK_MSG", 1765 .insns = { 1766 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1767 offsetof(struct sk_msg_md, remote_port)), 1768 BPF_EXIT_INSN(), 1769 }, 1770 .result = ACCEPT, 1771 .prog_type = BPF_PROG_TYPE_SK_MSG, 1772 }, 1773 { 1774 "valid access local_port in SK_MSG", 1775 .insns = { 1776 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1777 offsetof(struct sk_msg_md, local_port)), 1778 BPF_EXIT_INSN(), 1779 }, 1780 .result = ACCEPT, 1781 .prog_type = BPF_PROG_TYPE_SK_MSG, 1782 }, 1783 { 1784 "valid access remote_ip6 in SK_MSG", 1785 .insns = { 1786 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1787 offsetof(struct sk_msg_md, remote_ip6[0])), 1788 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1789 offsetof(struct sk_msg_md, remote_ip6[1])), 1790 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1791 offsetof(struct sk_msg_md, remote_ip6[2])), 1792 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1793 offsetof(struct sk_msg_md, remote_ip6[3])), 1794 BPF_EXIT_INSN(), 1795 }, 1796 .result = ACCEPT, 1797 .prog_type = BPF_PROG_TYPE_SK_SKB, 1798 }, 1799 { 1800 "valid access local_ip6 in SK_MSG", 1801 .insns = { 1802 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1803 offsetof(struct sk_msg_md, local_ip6[0])), 1804 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1805 offsetof(struct sk_msg_md, local_ip6[1])), 1806 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1807 offsetof(struct sk_msg_md, local_ip6[2])), 1808 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1809 offsetof(struct sk_msg_md, local_ip6[3])), 1810 BPF_EXIT_INSN(), 1811 }, 1812 .result = ACCEPT, 1813 .prog_type = BPF_PROG_TYPE_SK_SKB, 1814 }, 1815 { 1816 "invalid 64B read of family in SK_MSG", 1817 .insns = { 1818 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 1819 offsetof(struct sk_msg_md, family)), 1820 BPF_EXIT_INSN(), 1821 }, 1822 .errstr = "invalid bpf_context access", 1823 .result = REJECT, 1824 .prog_type = BPF_PROG_TYPE_SK_MSG, 1825 }, 1826 { 1827 "invalid read past end of SK_MSG", 1828 .insns = { 1829 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 1830 offsetof(struct sk_msg_md, local_port) + 4), 1831 BPF_EXIT_INSN(), 1832 }, 1833 .errstr = "R0 !read_ok", 1834 .result = REJECT, 1835 .prog_type = BPF_PROG_TYPE_SK_MSG, 1836 }, 1837 { 1838 "invalid read offset in SK_MSG", 1839 .insns = { 1840 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 1841 offsetof(struct sk_msg_md, family) + 1), 1842 BPF_EXIT_INSN(), 1843 }, 1844 .errstr = "invalid bpf_context access", 1845 .result = REJECT, 1846 .prog_type = BPF_PROG_TYPE_SK_MSG, 1847 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 1848 }, 1849 { 1850 "direct packet read for SK_MSG", 1851 .insns = { 1852 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 1853 offsetof(struct sk_msg_md, data)), 1854 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 1855 offsetof(struct sk_msg_md, data_end)), 1856 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 1857 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 1858 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 1859 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 1860 BPF_MOV64_IMM(BPF_REG_0, 0), 1861 BPF_EXIT_INSN(), 1862 }, 1863 .result = ACCEPT, 1864 .prog_type = BPF_PROG_TYPE_SK_MSG, 1865 }, 1866 { 1867 "direct packet write for SK_MSG", 1868 .insns = { 1869 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 1870 offsetof(struct sk_msg_md, data)), 1871 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 1872 offsetof(struct sk_msg_md, data_end)), 1873 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 1874 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 1875 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 1876 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 1877 BPF_MOV64_IMM(BPF_REG_0, 0), 1878 BPF_EXIT_INSN(), 1879 }, 1880 .result = ACCEPT, 1881 .prog_type = BPF_PROG_TYPE_SK_MSG, 1882 }, 1883 { 1884 "overlapping checks for direct packet access SK_MSG", 1885 .insns = { 1886 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 1887 offsetof(struct sk_msg_md, data)), 1888 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 1889 offsetof(struct sk_msg_md, data_end)), 1890 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 1891 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 1892 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 4), 1893 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 1894 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6), 1895 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 1896 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_2, 6), 1897 BPF_MOV64_IMM(BPF_REG_0, 0), 1898 BPF_EXIT_INSN(), 1899 }, 1900 .result = ACCEPT, 1901 .prog_type = BPF_PROG_TYPE_SK_MSG, 1902 }, 1903 { 1904 "check skb->mark is not writeable by sockets", 1905 .insns = { 1906 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 1907 offsetof(struct __sk_buff, mark)), 1908 BPF_EXIT_INSN(), 1909 }, 1910 .errstr = "invalid bpf_context access", 1911 .errstr_unpriv = "R1 leaks addr", 1912 .result = REJECT, 1913 }, 1914 { 1915 "check skb->tc_index is not writeable by sockets", 1916 .insns = { 1917 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 1918 offsetof(struct __sk_buff, tc_index)), 1919 BPF_EXIT_INSN(), 1920 }, 1921 .errstr = "invalid bpf_context access", 1922 .errstr_unpriv = "R1 leaks addr", 1923 .result = REJECT, 1924 }, 1925 { 1926 "check cb access: byte", 1927 .insns = { 1928 BPF_MOV64_IMM(BPF_REG_0, 0), 1929 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1930 offsetof(struct __sk_buff, cb[0])), 1931 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1932 offsetof(struct __sk_buff, cb[0]) + 1), 1933 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1934 offsetof(struct __sk_buff, cb[0]) + 2), 1935 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1936 offsetof(struct __sk_buff, cb[0]) + 3), 1937 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1938 offsetof(struct __sk_buff, cb[1])), 1939 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1940 offsetof(struct __sk_buff, cb[1]) + 1), 1941 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1942 offsetof(struct __sk_buff, cb[1]) + 2), 1943 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1944 offsetof(struct __sk_buff, cb[1]) + 3), 1945 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1946 offsetof(struct __sk_buff, cb[2])), 1947 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1948 offsetof(struct __sk_buff, cb[2]) + 1), 1949 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1950 offsetof(struct __sk_buff, cb[2]) + 2), 1951 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1952 offsetof(struct __sk_buff, cb[2]) + 3), 1953 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1954 offsetof(struct __sk_buff, cb[3])), 1955 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1956 offsetof(struct __sk_buff, cb[3]) + 1), 1957 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1958 offsetof(struct __sk_buff, cb[3]) + 2), 1959 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1960 offsetof(struct __sk_buff, cb[3]) + 3), 1961 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1962 offsetof(struct __sk_buff, cb[4])), 1963 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1964 offsetof(struct __sk_buff, cb[4]) + 1), 1965 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1966 offsetof(struct __sk_buff, cb[4]) + 2), 1967 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1968 offsetof(struct __sk_buff, cb[4]) + 3), 1969 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1970 offsetof(struct __sk_buff, cb[0])), 1971 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1972 offsetof(struct __sk_buff, cb[0]) + 1), 1973 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1974 offsetof(struct __sk_buff, cb[0]) + 2), 1975 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1976 offsetof(struct __sk_buff, cb[0]) + 3), 1977 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1978 offsetof(struct __sk_buff, cb[1])), 1979 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1980 offsetof(struct __sk_buff, cb[1]) + 1), 1981 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1982 offsetof(struct __sk_buff, cb[1]) + 2), 1983 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1984 offsetof(struct __sk_buff, cb[1]) + 3), 1985 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1986 offsetof(struct __sk_buff, cb[2])), 1987 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1988 offsetof(struct __sk_buff, cb[2]) + 1), 1989 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1990 offsetof(struct __sk_buff, cb[2]) + 2), 1991 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1992 offsetof(struct __sk_buff, cb[2]) + 3), 1993 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1994 offsetof(struct __sk_buff, cb[3])), 1995 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1996 offsetof(struct __sk_buff, cb[3]) + 1), 1997 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1998 offsetof(struct __sk_buff, cb[3]) + 2), 1999 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2000 offsetof(struct __sk_buff, cb[3]) + 3), 2001 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2002 offsetof(struct __sk_buff, cb[4])), 2003 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2004 offsetof(struct __sk_buff, cb[4]) + 1), 2005 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2006 offsetof(struct __sk_buff, cb[4]) + 2), 2007 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2008 offsetof(struct __sk_buff, cb[4]) + 3), 2009 BPF_EXIT_INSN(), 2010 }, 2011 .result = ACCEPT, 2012 }, 2013 { 2014 "__sk_buff->hash, offset 0, byte store not permitted", 2015 .insns = { 2016 BPF_MOV64_IMM(BPF_REG_0, 0), 2017 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2018 offsetof(struct __sk_buff, hash)), 2019 BPF_EXIT_INSN(), 2020 }, 2021 .errstr = "invalid bpf_context access", 2022 .result = REJECT, 2023 }, 2024 { 2025 "__sk_buff->tc_index, offset 3, byte store not permitted", 2026 .insns = { 2027 BPF_MOV64_IMM(BPF_REG_0, 0), 2028 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2029 offsetof(struct __sk_buff, tc_index) + 3), 2030 BPF_EXIT_INSN(), 2031 }, 2032 .errstr = "invalid bpf_context access", 2033 .result = REJECT, 2034 }, 2035 { 2036 "check skb->hash byte load permitted", 2037 .insns = { 2038 BPF_MOV64_IMM(BPF_REG_0, 0), 2039 #if __BYTE_ORDER == __LITTLE_ENDIAN 2040 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2041 offsetof(struct __sk_buff, hash)), 2042 #else 2043 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2044 offsetof(struct __sk_buff, hash) + 3), 2045 #endif 2046 BPF_EXIT_INSN(), 2047 }, 2048 .result = ACCEPT, 2049 }, 2050 { 2051 "check skb->hash byte load permitted 1", 2052 .insns = { 2053 BPF_MOV64_IMM(BPF_REG_0, 0), 2054 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2055 offsetof(struct __sk_buff, hash) + 1), 2056 BPF_EXIT_INSN(), 2057 }, 2058 .result = ACCEPT, 2059 }, 2060 { 2061 "check skb->hash byte load permitted 2", 2062 .insns = { 2063 BPF_MOV64_IMM(BPF_REG_0, 0), 2064 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2065 offsetof(struct __sk_buff, hash) + 2), 2066 BPF_EXIT_INSN(), 2067 }, 2068 .result = ACCEPT, 2069 }, 2070 { 2071 "check skb->hash byte load permitted 3", 2072 .insns = { 2073 BPF_MOV64_IMM(BPF_REG_0, 0), 2074 #if __BYTE_ORDER == __LITTLE_ENDIAN 2075 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2076 offsetof(struct __sk_buff, hash) + 3), 2077 #else 2078 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2079 offsetof(struct __sk_buff, hash)), 2080 #endif 2081 BPF_EXIT_INSN(), 2082 }, 2083 .result = ACCEPT, 2084 }, 2085 { 2086 "check cb access: byte, wrong type", 2087 .insns = { 2088 BPF_MOV64_IMM(BPF_REG_0, 0), 2089 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2090 offsetof(struct __sk_buff, cb[0])), 2091 BPF_EXIT_INSN(), 2092 }, 2093 .errstr = "invalid bpf_context access", 2094 .result = REJECT, 2095 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 2096 }, 2097 { 2098 "check cb access: half", 2099 .insns = { 2100 BPF_MOV64_IMM(BPF_REG_0, 0), 2101 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2102 offsetof(struct __sk_buff, cb[0])), 2103 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2104 offsetof(struct __sk_buff, cb[0]) + 2), 2105 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2106 offsetof(struct __sk_buff, cb[1])), 2107 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2108 offsetof(struct __sk_buff, cb[1]) + 2), 2109 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2110 offsetof(struct __sk_buff, cb[2])), 2111 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2112 offsetof(struct __sk_buff, cb[2]) + 2), 2113 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2114 offsetof(struct __sk_buff, cb[3])), 2115 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2116 offsetof(struct __sk_buff, cb[3]) + 2), 2117 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2118 offsetof(struct __sk_buff, cb[4])), 2119 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2120 offsetof(struct __sk_buff, cb[4]) + 2), 2121 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2122 offsetof(struct __sk_buff, cb[0])), 2123 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2124 offsetof(struct __sk_buff, cb[0]) + 2), 2125 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2126 offsetof(struct __sk_buff, cb[1])), 2127 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2128 offsetof(struct __sk_buff, cb[1]) + 2), 2129 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2130 offsetof(struct __sk_buff, cb[2])), 2131 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2132 offsetof(struct __sk_buff, cb[2]) + 2), 2133 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2134 offsetof(struct __sk_buff, cb[3])), 2135 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2136 offsetof(struct __sk_buff, cb[3]) + 2), 2137 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2138 offsetof(struct __sk_buff, cb[4])), 2139 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2140 offsetof(struct __sk_buff, cb[4]) + 2), 2141 BPF_EXIT_INSN(), 2142 }, 2143 .result = ACCEPT, 2144 }, 2145 { 2146 "check cb access: half, unaligned", 2147 .insns = { 2148 BPF_MOV64_IMM(BPF_REG_0, 0), 2149 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2150 offsetof(struct __sk_buff, cb[0]) + 1), 2151 BPF_EXIT_INSN(), 2152 }, 2153 .errstr = "misaligned context access", 2154 .result = REJECT, 2155 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 2156 }, 2157 { 2158 "check __sk_buff->hash, offset 0, half store not permitted", 2159 .insns = { 2160 BPF_MOV64_IMM(BPF_REG_0, 0), 2161 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2162 offsetof(struct __sk_buff, hash)), 2163 BPF_EXIT_INSN(), 2164 }, 2165 .errstr = "invalid bpf_context access", 2166 .result = REJECT, 2167 }, 2168 { 2169 "check __sk_buff->tc_index, offset 2, half store not permitted", 2170 .insns = { 2171 BPF_MOV64_IMM(BPF_REG_0, 0), 2172 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2173 offsetof(struct __sk_buff, tc_index) + 2), 2174 BPF_EXIT_INSN(), 2175 }, 2176 .errstr = "invalid bpf_context access", 2177 .result = REJECT, 2178 }, 2179 { 2180 "check skb->hash half load permitted", 2181 .insns = { 2182 BPF_MOV64_IMM(BPF_REG_0, 0), 2183 #if __BYTE_ORDER == __LITTLE_ENDIAN 2184 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2185 offsetof(struct __sk_buff, hash)), 2186 #else 2187 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2188 offsetof(struct __sk_buff, hash) + 2), 2189 #endif 2190 BPF_EXIT_INSN(), 2191 }, 2192 .result = ACCEPT, 2193 }, 2194 { 2195 "check skb->hash half load permitted 2", 2196 .insns = { 2197 BPF_MOV64_IMM(BPF_REG_0, 0), 2198 #if __BYTE_ORDER == __LITTLE_ENDIAN 2199 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2200 offsetof(struct __sk_buff, hash) + 2), 2201 #else 2202 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2203 offsetof(struct __sk_buff, hash)), 2204 #endif 2205 BPF_EXIT_INSN(), 2206 }, 2207 .result = ACCEPT, 2208 }, 2209 { 2210 "check skb->hash half load not permitted, unaligned 1", 2211 .insns = { 2212 BPF_MOV64_IMM(BPF_REG_0, 0), 2213 #if __BYTE_ORDER == __LITTLE_ENDIAN 2214 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2215 offsetof(struct __sk_buff, hash) + 1), 2216 #else 2217 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2218 offsetof(struct __sk_buff, hash) + 3), 2219 #endif 2220 BPF_EXIT_INSN(), 2221 }, 2222 .errstr = "invalid bpf_context access", 2223 .result = REJECT, 2224 }, 2225 { 2226 "check skb->hash half load not permitted, unaligned 3", 2227 .insns = { 2228 BPF_MOV64_IMM(BPF_REG_0, 0), 2229 #if __BYTE_ORDER == __LITTLE_ENDIAN 2230 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2231 offsetof(struct __sk_buff, hash) + 3), 2232 #else 2233 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2234 offsetof(struct __sk_buff, hash) + 1), 2235 #endif 2236 BPF_EXIT_INSN(), 2237 }, 2238 .errstr = "invalid bpf_context access", 2239 .result = REJECT, 2240 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 2241 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 2242 }, 2243 { 2244 "check cb access: half, wrong type", 2245 .insns = { 2246 BPF_MOV64_IMM(BPF_REG_0, 0), 2247 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2248 offsetof(struct __sk_buff, cb[0])), 2249 BPF_EXIT_INSN(), 2250 }, 2251 .errstr = "invalid bpf_context access", 2252 .result = REJECT, 2253 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 2254 }, 2255 { 2256 "check cb access: word", 2257 .insns = { 2258 BPF_MOV64_IMM(BPF_REG_0, 0), 2259 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2260 offsetof(struct __sk_buff, cb[0])), 2261 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2262 offsetof(struct __sk_buff, cb[1])), 2263 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2264 offsetof(struct __sk_buff, cb[2])), 2265 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2266 offsetof(struct __sk_buff, cb[3])), 2267 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2268 offsetof(struct __sk_buff, cb[4])), 2269 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2270 offsetof(struct __sk_buff, cb[0])), 2271 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2272 offsetof(struct __sk_buff, cb[1])), 2273 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2274 offsetof(struct __sk_buff, cb[2])), 2275 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2276 offsetof(struct __sk_buff, cb[3])), 2277 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2278 offsetof(struct __sk_buff, cb[4])), 2279 BPF_EXIT_INSN(), 2280 }, 2281 .result = ACCEPT, 2282 }, 2283 { 2284 "check cb access: word, unaligned 1", 2285 .insns = { 2286 BPF_MOV64_IMM(BPF_REG_0, 0), 2287 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2288 offsetof(struct __sk_buff, cb[0]) + 2), 2289 BPF_EXIT_INSN(), 2290 }, 2291 .errstr = "misaligned context access", 2292 .result = REJECT, 2293 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 2294 }, 2295 { 2296 "check cb access: word, unaligned 2", 2297 .insns = { 2298 BPF_MOV64_IMM(BPF_REG_0, 0), 2299 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2300 offsetof(struct __sk_buff, cb[4]) + 1), 2301 BPF_EXIT_INSN(), 2302 }, 2303 .errstr = "misaligned context access", 2304 .result = REJECT, 2305 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 2306 }, 2307 { 2308 "check cb access: word, unaligned 3", 2309 .insns = { 2310 BPF_MOV64_IMM(BPF_REG_0, 0), 2311 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2312 offsetof(struct __sk_buff, cb[4]) + 2), 2313 BPF_EXIT_INSN(), 2314 }, 2315 .errstr = "misaligned context access", 2316 .result = REJECT, 2317 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 2318 }, 2319 { 2320 "check cb access: word, unaligned 4", 2321 .insns = { 2322 BPF_MOV64_IMM(BPF_REG_0, 0), 2323 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2324 offsetof(struct __sk_buff, cb[4]) + 3), 2325 BPF_EXIT_INSN(), 2326 }, 2327 .errstr = "misaligned context access", 2328 .result = REJECT, 2329 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 2330 }, 2331 { 2332 "check cb access: double", 2333 .insns = { 2334 BPF_MOV64_IMM(BPF_REG_0, 0), 2335 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2336 offsetof(struct __sk_buff, cb[0])), 2337 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2338 offsetof(struct __sk_buff, cb[2])), 2339 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2340 offsetof(struct __sk_buff, cb[0])), 2341 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2342 offsetof(struct __sk_buff, cb[2])), 2343 BPF_EXIT_INSN(), 2344 }, 2345 .result = ACCEPT, 2346 }, 2347 { 2348 "check cb access: double, unaligned 1", 2349 .insns = { 2350 BPF_MOV64_IMM(BPF_REG_0, 0), 2351 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2352 offsetof(struct __sk_buff, cb[1])), 2353 BPF_EXIT_INSN(), 2354 }, 2355 .errstr = "misaligned context access", 2356 .result = REJECT, 2357 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 2358 }, 2359 { 2360 "check cb access: double, unaligned 2", 2361 .insns = { 2362 BPF_MOV64_IMM(BPF_REG_0, 0), 2363 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2364 offsetof(struct __sk_buff, cb[3])), 2365 BPF_EXIT_INSN(), 2366 }, 2367 .errstr = "misaligned context access", 2368 .result = REJECT, 2369 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 2370 }, 2371 { 2372 "check cb access: double, oob 1", 2373 .insns = { 2374 BPF_MOV64_IMM(BPF_REG_0, 0), 2375 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2376 offsetof(struct __sk_buff, cb[4])), 2377 BPF_EXIT_INSN(), 2378 }, 2379 .errstr = "invalid bpf_context access", 2380 .result = REJECT, 2381 }, 2382 { 2383 "check cb access: double, oob 2", 2384 .insns = { 2385 BPF_MOV64_IMM(BPF_REG_0, 0), 2386 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2387 offsetof(struct __sk_buff, cb[4])), 2388 BPF_EXIT_INSN(), 2389 }, 2390 .errstr = "invalid bpf_context access", 2391 .result = REJECT, 2392 }, 2393 { 2394 "check __sk_buff->ifindex dw store not permitted", 2395 .insns = { 2396 BPF_MOV64_IMM(BPF_REG_0, 0), 2397 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2398 offsetof(struct __sk_buff, ifindex)), 2399 BPF_EXIT_INSN(), 2400 }, 2401 .errstr = "invalid bpf_context access", 2402 .result = REJECT, 2403 }, 2404 { 2405 "check __sk_buff->ifindex dw load not permitted", 2406 .insns = { 2407 BPF_MOV64_IMM(BPF_REG_0, 0), 2408 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2409 offsetof(struct __sk_buff, ifindex)), 2410 BPF_EXIT_INSN(), 2411 }, 2412 .errstr = "invalid bpf_context access", 2413 .result = REJECT, 2414 }, 2415 { 2416 "check cb access: double, wrong type", 2417 .insns = { 2418 BPF_MOV64_IMM(BPF_REG_0, 0), 2419 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2420 offsetof(struct __sk_buff, cb[0])), 2421 BPF_EXIT_INSN(), 2422 }, 2423 .errstr = "invalid bpf_context access", 2424 .result = REJECT, 2425 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 2426 }, 2427 { 2428 "check out of range skb->cb access", 2429 .insns = { 2430 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2431 offsetof(struct __sk_buff, cb[0]) + 256), 2432 BPF_EXIT_INSN(), 2433 }, 2434 .errstr = "invalid bpf_context access", 2435 .errstr_unpriv = "", 2436 .result = REJECT, 2437 .prog_type = BPF_PROG_TYPE_SCHED_ACT, 2438 }, 2439 { 2440 "write skb fields from socket prog", 2441 .insns = { 2442 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2443 offsetof(struct __sk_buff, cb[4])), 2444 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1), 2445 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2446 offsetof(struct __sk_buff, mark)), 2447 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2448 offsetof(struct __sk_buff, tc_index)), 2449 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1), 2450 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 2451 offsetof(struct __sk_buff, cb[0])), 2452 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 2453 offsetof(struct __sk_buff, cb[2])), 2454 BPF_EXIT_INSN(), 2455 }, 2456 .result = ACCEPT, 2457 .errstr_unpriv = "R1 leaks addr", 2458 .result_unpriv = REJECT, 2459 }, 2460 { 2461 "write skb fields from tc_cls_act prog", 2462 .insns = { 2463 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2464 offsetof(struct __sk_buff, cb[0])), 2465 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2466 offsetof(struct __sk_buff, mark)), 2467 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2468 offsetof(struct __sk_buff, tc_index)), 2469 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2470 offsetof(struct __sk_buff, tc_index)), 2471 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2472 offsetof(struct __sk_buff, cb[3])), 2473 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2474 offsetof(struct __sk_buff, tstamp)), 2475 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2476 offsetof(struct __sk_buff, tstamp)), 2477 BPF_EXIT_INSN(), 2478 }, 2479 .errstr_unpriv = "", 2480 .result_unpriv = REJECT, 2481 .result = ACCEPT, 2482 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2483 }, 2484 { 2485 "PTR_TO_STACK store/load", 2486 .insns = { 2487 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 2488 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -10), 2489 BPF_ST_MEM(BPF_DW, BPF_REG_1, 2, 0xfaceb00c), 2490 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2), 2491 BPF_EXIT_INSN(), 2492 }, 2493 .result = ACCEPT, 2494 .retval = 0xfaceb00c, 2495 }, 2496 { 2497 "PTR_TO_STACK store/load - bad alignment on off", 2498 .insns = { 2499 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 2500 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 2501 BPF_ST_MEM(BPF_DW, BPF_REG_1, 2, 0xfaceb00c), 2502 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2), 2503 BPF_EXIT_INSN(), 2504 }, 2505 .result = REJECT, 2506 .errstr = "misaligned stack access off (0x0; 0x0)+-8+2 size 8", 2507 }, 2508 { 2509 "PTR_TO_STACK store/load - bad alignment on reg", 2510 .insns = { 2511 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 2512 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -10), 2513 BPF_ST_MEM(BPF_DW, BPF_REG_1, 8, 0xfaceb00c), 2514 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 8), 2515 BPF_EXIT_INSN(), 2516 }, 2517 .result = REJECT, 2518 .errstr = "misaligned stack access off (0x0; 0x0)+-10+8 size 8", 2519 }, 2520 { 2521 "PTR_TO_STACK store/load - out of bounds low", 2522 .insns = { 2523 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 2524 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -80000), 2525 BPF_ST_MEM(BPF_DW, BPF_REG_1, 8, 0xfaceb00c), 2526 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 8), 2527 BPF_EXIT_INSN(), 2528 }, 2529 .result = REJECT, 2530 .errstr = "invalid stack off=-79992 size=8", 2531 }, 2532 { 2533 "PTR_TO_STACK store/load - out of bounds high", 2534 .insns = { 2535 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 2536 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 2537 BPF_ST_MEM(BPF_DW, BPF_REG_1, 8, 0xfaceb00c), 2538 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 8), 2539 BPF_EXIT_INSN(), 2540 }, 2541 .result = REJECT, 2542 .errstr = "invalid stack off=0 size=8", 2543 }, 2544 { 2545 "unpriv: return pointer", 2546 .insns = { 2547 BPF_MOV64_REG(BPF_REG_0, BPF_REG_10), 2548 BPF_EXIT_INSN(), 2549 }, 2550 .result = ACCEPT, 2551 .result_unpriv = REJECT, 2552 .errstr_unpriv = "R0 leaks addr", 2553 .retval = POINTER_VALUE, 2554 }, 2555 { 2556 "unpriv: add const to pointer", 2557 .insns = { 2558 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 2559 BPF_MOV64_IMM(BPF_REG_0, 0), 2560 BPF_EXIT_INSN(), 2561 }, 2562 .result = ACCEPT, 2563 }, 2564 { 2565 "unpriv: add pointer to pointer", 2566 .insns = { 2567 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_10), 2568 BPF_MOV64_IMM(BPF_REG_0, 0), 2569 BPF_EXIT_INSN(), 2570 }, 2571 .result = REJECT, 2572 .errstr = "R1 pointer += pointer", 2573 }, 2574 { 2575 "unpriv: neg pointer", 2576 .insns = { 2577 BPF_ALU64_IMM(BPF_NEG, BPF_REG_1, 0), 2578 BPF_MOV64_IMM(BPF_REG_0, 0), 2579 BPF_EXIT_INSN(), 2580 }, 2581 .result = ACCEPT, 2582 .result_unpriv = REJECT, 2583 .errstr_unpriv = "R1 pointer arithmetic", 2584 }, 2585 { 2586 "unpriv: cmp pointer with const", 2587 .insns = { 2588 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 0), 2589 BPF_MOV64_IMM(BPF_REG_0, 0), 2590 BPF_EXIT_INSN(), 2591 }, 2592 .result = ACCEPT, 2593 .result_unpriv = REJECT, 2594 .errstr_unpriv = "R1 pointer comparison", 2595 }, 2596 { 2597 "unpriv: cmp pointer with pointer", 2598 .insns = { 2599 BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0), 2600 BPF_MOV64_IMM(BPF_REG_0, 0), 2601 BPF_EXIT_INSN(), 2602 }, 2603 .result = ACCEPT, 2604 .result_unpriv = REJECT, 2605 .errstr_unpriv = "R10 pointer comparison", 2606 }, 2607 { 2608 "unpriv: check that printk is disallowed", 2609 .insns = { 2610 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 2611 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 2612 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 2613 BPF_MOV64_IMM(BPF_REG_2, 8), 2614 BPF_MOV64_REG(BPF_REG_3, BPF_REG_1), 2615 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2616 BPF_FUNC_trace_printk), 2617 BPF_MOV64_IMM(BPF_REG_0, 0), 2618 BPF_EXIT_INSN(), 2619 }, 2620 .errstr_unpriv = "unknown func bpf_trace_printk#6", 2621 .result_unpriv = REJECT, 2622 .result = ACCEPT, 2623 }, 2624 { 2625 "unpriv: pass pointer to helper function", 2626 .insns = { 2627 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 2628 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 2629 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 2630 BPF_LD_MAP_FD(BPF_REG_1, 0), 2631 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 2632 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 2633 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2634 BPF_FUNC_map_update_elem), 2635 BPF_MOV64_IMM(BPF_REG_0, 0), 2636 BPF_EXIT_INSN(), 2637 }, 2638 .fixup_map_hash_8b = { 3 }, 2639 .errstr_unpriv = "R4 leaks addr", 2640 .result_unpriv = REJECT, 2641 .result = ACCEPT, 2642 }, 2643 { 2644 "unpriv: indirectly pass pointer on stack to helper function", 2645 .insns = { 2646 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8), 2647 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 2648 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 2649 BPF_LD_MAP_FD(BPF_REG_1, 0), 2650 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2651 BPF_FUNC_map_lookup_elem), 2652 BPF_MOV64_IMM(BPF_REG_0, 0), 2653 BPF_EXIT_INSN(), 2654 }, 2655 .fixup_map_hash_8b = { 3 }, 2656 .errstr = "invalid indirect read from stack off -8+0 size 8", 2657 .result = REJECT, 2658 }, 2659 { 2660 "unpriv: mangle pointer on stack 1", 2661 .insns = { 2662 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8), 2663 BPF_ST_MEM(BPF_W, BPF_REG_10, -8, 0), 2664 BPF_MOV64_IMM(BPF_REG_0, 0), 2665 BPF_EXIT_INSN(), 2666 }, 2667 .errstr_unpriv = "attempt to corrupt spilled", 2668 .result_unpriv = REJECT, 2669 .result = ACCEPT, 2670 }, 2671 { 2672 "unpriv: mangle pointer on stack 2", 2673 .insns = { 2674 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8), 2675 BPF_ST_MEM(BPF_B, BPF_REG_10, -1, 0), 2676 BPF_MOV64_IMM(BPF_REG_0, 0), 2677 BPF_EXIT_INSN(), 2678 }, 2679 .errstr_unpriv = "attempt to corrupt spilled", 2680 .result_unpriv = REJECT, 2681 .result = ACCEPT, 2682 }, 2683 { 2684 "unpriv: read pointer from stack in small chunks", 2685 .insns = { 2686 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8), 2687 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -8), 2688 BPF_MOV64_IMM(BPF_REG_0, 0), 2689 BPF_EXIT_INSN(), 2690 }, 2691 .errstr = "invalid size", 2692 .result = REJECT, 2693 }, 2694 { 2695 "unpriv: write pointer into ctx", 2696 .insns = { 2697 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, 0), 2698 BPF_MOV64_IMM(BPF_REG_0, 0), 2699 BPF_EXIT_INSN(), 2700 }, 2701 .errstr_unpriv = "R1 leaks addr", 2702 .result_unpriv = REJECT, 2703 .errstr = "invalid bpf_context access", 2704 .result = REJECT, 2705 }, 2706 { 2707 "unpriv: spill/fill of ctx", 2708 .insns = { 2709 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2710 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2711 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2712 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2713 BPF_MOV64_IMM(BPF_REG_0, 0), 2714 BPF_EXIT_INSN(), 2715 }, 2716 .result = ACCEPT, 2717 }, 2718 { 2719 "unpriv: spill/fill of ctx 2", 2720 .insns = { 2721 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2722 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2723 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2724 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2725 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2726 BPF_FUNC_get_hash_recalc), 2727 BPF_MOV64_IMM(BPF_REG_0, 0), 2728 BPF_EXIT_INSN(), 2729 }, 2730 .result = ACCEPT, 2731 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2732 }, 2733 { 2734 "unpriv: spill/fill of ctx 3", 2735 .insns = { 2736 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2737 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2738 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2739 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_10, 0), 2740 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2741 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2742 BPF_FUNC_get_hash_recalc), 2743 BPF_EXIT_INSN(), 2744 }, 2745 .result = REJECT, 2746 .errstr = "R1 type=fp expected=ctx", 2747 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2748 }, 2749 { 2750 "unpriv: spill/fill of ctx 4", 2751 .insns = { 2752 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2753 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2754 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2755 BPF_MOV64_IMM(BPF_REG_0, 1), 2756 BPF_RAW_INSN(BPF_STX | BPF_XADD | BPF_DW, BPF_REG_10, 2757 BPF_REG_0, -8, 0), 2758 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2759 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2760 BPF_FUNC_get_hash_recalc), 2761 BPF_EXIT_INSN(), 2762 }, 2763 .result = REJECT, 2764 .errstr = "R1 type=inv expected=ctx", 2765 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2766 }, 2767 { 2768 "unpriv: spill/fill of different pointers stx", 2769 .insns = { 2770 BPF_MOV64_IMM(BPF_REG_3, 42), 2771 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2772 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2773 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3), 2774 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 2775 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 2776 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0), 2777 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 2778 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2779 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2780 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_3, 2781 offsetof(struct __sk_buff, mark)), 2782 BPF_MOV64_IMM(BPF_REG_0, 0), 2783 BPF_EXIT_INSN(), 2784 }, 2785 .result = REJECT, 2786 .errstr = "same insn cannot be used with different pointers", 2787 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2788 }, 2789 { 2790 "unpriv: spill/fill of different pointers stx - ctx and sock", 2791 .insns = { 2792 BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 2793 /* struct bpf_sock *sock = bpf_sock_lookup(...); */ 2794 BPF_SK_LOOKUP, 2795 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 2796 /* u64 foo; */ 2797 /* void *target = &foo; */ 2798 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2799 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2800 BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 2801 /* if (skb == NULL) *target = sock; */ 2802 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 2803 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0), 2804 /* else *target = skb; */ 2805 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 2806 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2807 /* struct __sk_buff *skb = *target; */ 2808 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2809 /* skb->mark = 42; */ 2810 BPF_MOV64_IMM(BPF_REG_3, 42), 2811 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_3, 2812 offsetof(struct __sk_buff, mark)), 2813 /* if (sk) bpf_sk_release(sk) */ 2814 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 2815 BPF_EMIT_CALL(BPF_FUNC_sk_release), 2816 BPF_MOV64_IMM(BPF_REG_0, 0), 2817 BPF_EXIT_INSN(), 2818 }, 2819 .result = REJECT, 2820 .errstr = "type=ctx expected=sock", 2821 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2822 }, 2823 { 2824 "unpriv: spill/fill of different pointers stx - leak sock", 2825 .insns = { 2826 BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 2827 /* struct bpf_sock *sock = bpf_sock_lookup(...); */ 2828 BPF_SK_LOOKUP, 2829 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 2830 /* u64 foo; */ 2831 /* void *target = &foo; */ 2832 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2833 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2834 BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 2835 /* if (skb == NULL) *target = sock; */ 2836 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 2837 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0), 2838 /* else *target = skb; */ 2839 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 2840 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2841 /* struct __sk_buff *skb = *target; */ 2842 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2843 /* skb->mark = 42; */ 2844 BPF_MOV64_IMM(BPF_REG_3, 42), 2845 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_3, 2846 offsetof(struct __sk_buff, mark)), 2847 BPF_EXIT_INSN(), 2848 }, 2849 .result = REJECT, 2850 //.errstr = "same insn cannot be used with different pointers", 2851 .errstr = "Unreleased reference", 2852 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2853 }, 2854 { 2855 "unpriv: spill/fill of different pointers stx - sock and ctx (read)", 2856 .insns = { 2857 BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 2858 /* struct bpf_sock *sock = bpf_sock_lookup(...); */ 2859 BPF_SK_LOOKUP, 2860 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 2861 /* u64 foo; */ 2862 /* void *target = &foo; */ 2863 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2864 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2865 BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 2866 /* if (skb) *target = skb */ 2867 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 2868 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2869 /* else *target = sock */ 2870 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 2871 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0), 2872 /* struct bpf_sock *sk = *target; */ 2873 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2874 /* if (sk) u32 foo = sk->mark; bpf_sk_release(sk); */ 2875 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 2), 2876 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 2877 offsetof(struct bpf_sock, mark)), 2878 BPF_EMIT_CALL(BPF_FUNC_sk_release), 2879 BPF_MOV64_IMM(BPF_REG_0, 0), 2880 BPF_EXIT_INSN(), 2881 }, 2882 .result = REJECT, 2883 .errstr = "same insn cannot be used with different pointers", 2884 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2885 }, 2886 { 2887 "unpriv: spill/fill of different pointers stx - sock and ctx (write)", 2888 .insns = { 2889 BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 2890 /* struct bpf_sock *sock = bpf_sock_lookup(...); */ 2891 BPF_SK_LOOKUP, 2892 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 2893 /* u64 foo; */ 2894 /* void *target = &foo; */ 2895 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2896 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2897 BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 2898 /* if (skb) *target = skb */ 2899 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 2900 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2901 /* else *target = sock */ 2902 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 2903 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0), 2904 /* struct bpf_sock *sk = *target; */ 2905 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2906 /* if (sk) sk->mark = 42; bpf_sk_release(sk); */ 2907 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3), 2908 BPF_MOV64_IMM(BPF_REG_3, 42), 2909 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_3, 2910 offsetof(struct bpf_sock, mark)), 2911 BPF_EMIT_CALL(BPF_FUNC_sk_release), 2912 BPF_MOV64_IMM(BPF_REG_0, 0), 2913 BPF_EXIT_INSN(), 2914 }, 2915 .result = REJECT, 2916 //.errstr = "same insn cannot be used with different pointers", 2917 .errstr = "cannot write into socket", 2918 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2919 }, 2920 { 2921 "unpriv: spill/fill of different pointers ldx", 2922 .insns = { 2923 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2924 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2925 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3), 2926 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 2927 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 2928 -(__s32)offsetof(struct bpf_perf_event_data, 2929 sample_period) - 8), 2930 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0), 2931 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 2932 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2933 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2934 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, 2935 offsetof(struct bpf_perf_event_data, 2936 sample_period)), 2937 BPF_MOV64_IMM(BPF_REG_0, 0), 2938 BPF_EXIT_INSN(), 2939 }, 2940 .result = REJECT, 2941 .errstr = "same insn cannot be used with different pointers", 2942 .prog_type = BPF_PROG_TYPE_PERF_EVENT, 2943 }, 2944 { 2945 "unpriv: write pointer into map elem value", 2946 .insns = { 2947 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 2948 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 2949 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 2950 BPF_LD_MAP_FD(BPF_REG_1, 0), 2951 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2952 BPF_FUNC_map_lookup_elem), 2953 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 2954 BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0), 2955 BPF_EXIT_INSN(), 2956 }, 2957 .fixup_map_hash_8b = { 3 }, 2958 .errstr_unpriv = "R0 leaks addr", 2959 .result_unpriv = REJECT, 2960 .result = ACCEPT, 2961 }, 2962 { 2963 "alu32: mov u32 const", 2964 .insns = { 2965 BPF_MOV32_IMM(BPF_REG_7, 0), 2966 BPF_ALU32_IMM(BPF_AND, BPF_REG_7, 1), 2967 BPF_MOV32_REG(BPF_REG_0, BPF_REG_7), 2968 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 2969 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0), 2970 BPF_EXIT_INSN(), 2971 }, 2972 .result = ACCEPT, 2973 .retval = 0, 2974 }, 2975 { 2976 "unpriv: partial copy of pointer", 2977 .insns = { 2978 BPF_MOV32_REG(BPF_REG_1, BPF_REG_10), 2979 BPF_MOV64_IMM(BPF_REG_0, 0), 2980 BPF_EXIT_INSN(), 2981 }, 2982 .errstr_unpriv = "R10 partial copy", 2983 .result_unpriv = REJECT, 2984 .result = ACCEPT, 2985 }, 2986 { 2987 "unpriv: pass pointer to tail_call", 2988 .insns = { 2989 BPF_MOV64_REG(BPF_REG_3, BPF_REG_1), 2990 BPF_LD_MAP_FD(BPF_REG_2, 0), 2991 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2992 BPF_FUNC_tail_call), 2993 BPF_MOV64_IMM(BPF_REG_0, 0), 2994 BPF_EXIT_INSN(), 2995 }, 2996 .fixup_prog1 = { 1 }, 2997 .errstr_unpriv = "R3 leaks addr into helper", 2998 .result_unpriv = REJECT, 2999 .result = ACCEPT, 3000 }, 3001 { 3002 "unpriv: cmp map pointer with zero", 3003 .insns = { 3004 BPF_MOV64_IMM(BPF_REG_1, 0), 3005 BPF_LD_MAP_FD(BPF_REG_1, 0), 3006 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 0), 3007 BPF_MOV64_IMM(BPF_REG_0, 0), 3008 BPF_EXIT_INSN(), 3009 }, 3010 .fixup_map_hash_8b = { 1 }, 3011 .errstr_unpriv = "R1 pointer comparison", 3012 .result_unpriv = REJECT, 3013 .result = ACCEPT, 3014 }, 3015 { 3016 "unpriv: write into frame pointer", 3017 .insns = { 3018 BPF_MOV64_REG(BPF_REG_10, BPF_REG_1), 3019 BPF_MOV64_IMM(BPF_REG_0, 0), 3020 BPF_EXIT_INSN(), 3021 }, 3022 .errstr = "frame pointer is read only", 3023 .result = REJECT, 3024 }, 3025 { 3026 "unpriv: spill/fill frame pointer", 3027 .insns = { 3028 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3029 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 3030 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_10, 0), 3031 BPF_LDX_MEM(BPF_DW, BPF_REG_10, BPF_REG_6, 0), 3032 BPF_MOV64_IMM(BPF_REG_0, 0), 3033 BPF_EXIT_INSN(), 3034 }, 3035 .errstr = "frame pointer is read only", 3036 .result = REJECT, 3037 }, 3038 { 3039 "unpriv: cmp of frame pointer", 3040 .insns = { 3041 BPF_JMP_IMM(BPF_JEQ, BPF_REG_10, 0, 0), 3042 BPF_MOV64_IMM(BPF_REG_0, 0), 3043 BPF_EXIT_INSN(), 3044 }, 3045 .errstr_unpriv = "R10 pointer comparison", 3046 .result_unpriv = REJECT, 3047 .result = ACCEPT, 3048 }, 3049 { 3050 "unpriv: adding of fp", 3051 .insns = { 3052 BPF_MOV64_IMM(BPF_REG_0, 0), 3053 BPF_MOV64_IMM(BPF_REG_1, 0), 3054 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_10), 3055 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, -8), 3056 BPF_EXIT_INSN(), 3057 }, 3058 .result = ACCEPT, 3059 }, 3060 { 3061 "unpriv: cmp of stack pointer", 3062 .insns = { 3063 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 3064 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 3065 BPF_JMP_IMM(BPF_JEQ, BPF_REG_2, 0, 0), 3066 BPF_MOV64_IMM(BPF_REG_0, 0), 3067 BPF_EXIT_INSN(), 3068 }, 3069 .errstr_unpriv = "R2 pointer comparison", 3070 .result_unpriv = REJECT, 3071 .result = ACCEPT, 3072 }, 3073 { 3074 "runtime/jit: tail_call within bounds, prog once", 3075 .insns = { 3076 BPF_MOV64_IMM(BPF_REG_3, 0), 3077 BPF_LD_MAP_FD(BPF_REG_2, 0), 3078 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3079 BPF_FUNC_tail_call), 3080 BPF_MOV64_IMM(BPF_REG_0, 1), 3081 BPF_EXIT_INSN(), 3082 }, 3083 .fixup_prog1 = { 1 }, 3084 .result = ACCEPT, 3085 .retval = 42, 3086 }, 3087 { 3088 "runtime/jit: tail_call within bounds, prog loop", 3089 .insns = { 3090 BPF_MOV64_IMM(BPF_REG_3, 1), 3091 BPF_LD_MAP_FD(BPF_REG_2, 0), 3092 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3093 BPF_FUNC_tail_call), 3094 BPF_MOV64_IMM(BPF_REG_0, 1), 3095 BPF_EXIT_INSN(), 3096 }, 3097 .fixup_prog1 = { 1 }, 3098 .result = ACCEPT, 3099 .retval = 41, 3100 }, 3101 { 3102 "runtime/jit: tail_call within bounds, no prog", 3103 .insns = { 3104 BPF_MOV64_IMM(BPF_REG_3, 2), 3105 BPF_LD_MAP_FD(BPF_REG_2, 0), 3106 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3107 BPF_FUNC_tail_call), 3108 BPF_MOV64_IMM(BPF_REG_0, 1), 3109 BPF_EXIT_INSN(), 3110 }, 3111 .fixup_prog1 = { 1 }, 3112 .result = ACCEPT, 3113 .retval = 1, 3114 }, 3115 { 3116 "runtime/jit: tail_call out of bounds", 3117 .insns = { 3118 BPF_MOV64_IMM(BPF_REG_3, 256), 3119 BPF_LD_MAP_FD(BPF_REG_2, 0), 3120 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3121 BPF_FUNC_tail_call), 3122 BPF_MOV64_IMM(BPF_REG_0, 2), 3123 BPF_EXIT_INSN(), 3124 }, 3125 .fixup_prog1 = { 1 }, 3126 .result = ACCEPT, 3127 .retval = 2, 3128 }, 3129 { 3130 "runtime/jit: pass negative index to tail_call", 3131 .insns = { 3132 BPF_MOV64_IMM(BPF_REG_3, -1), 3133 BPF_LD_MAP_FD(BPF_REG_2, 0), 3134 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3135 BPF_FUNC_tail_call), 3136 BPF_MOV64_IMM(BPF_REG_0, 2), 3137 BPF_EXIT_INSN(), 3138 }, 3139 .fixup_prog1 = { 1 }, 3140 .result = ACCEPT, 3141 .retval = 2, 3142 }, 3143 { 3144 "runtime/jit: pass > 32bit index to tail_call", 3145 .insns = { 3146 BPF_LD_IMM64(BPF_REG_3, 0x100000000ULL), 3147 BPF_LD_MAP_FD(BPF_REG_2, 0), 3148 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3149 BPF_FUNC_tail_call), 3150 BPF_MOV64_IMM(BPF_REG_0, 2), 3151 BPF_EXIT_INSN(), 3152 }, 3153 .fixup_prog1 = { 2 }, 3154 .result = ACCEPT, 3155 .retval = 42, 3156 /* Verifier rewrite for unpriv skips tail call here. */ 3157 .retval_unpriv = 2, 3158 }, 3159 { 3160 "stack pointer arithmetic", 3161 .insns = { 3162 BPF_MOV64_IMM(BPF_REG_1, 4), 3163 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 3164 BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 3165 BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -10), 3166 BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -10), 3167 BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 3168 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_1), 3169 BPF_ST_MEM(0, BPF_REG_2, 4, 0), 3170 BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 3171 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8), 3172 BPF_ST_MEM(0, BPF_REG_2, 4, 0), 3173 BPF_MOV64_IMM(BPF_REG_0, 0), 3174 BPF_EXIT_INSN(), 3175 }, 3176 .result = ACCEPT, 3177 }, 3178 { 3179 "raw_stack: no skb_load_bytes", 3180 .insns = { 3181 BPF_MOV64_IMM(BPF_REG_2, 4), 3182 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3183 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 3184 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3185 BPF_MOV64_IMM(BPF_REG_4, 8), 3186 /* Call to skb_load_bytes() omitted. */ 3187 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3188 BPF_EXIT_INSN(), 3189 }, 3190 .result = REJECT, 3191 .errstr = "invalid read from stack off -8+0 size 8", 3192 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3193 }, 3194 { 3195 "raw_stack: skb_load_bytes, negative len", 3196 .insns = { 3197 BPF_MOV64_IMM(BPF_REG_2, 4), 3198 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3199 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 3200 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3201 BPF_MOV64_IMM(BPF_REG_4, -8), 3202 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3203 BPF_FUNC_skb_load_bytes), 3204 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3205 BPF_EXIT_INSN(), 3206 }, 3207 .result = REJECT, 3208 .errstr = "R4 min value is negative", 3209 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3210 }, 3211 { 3212 "raw_stack: skb_load_bytes, negative len 2", 3213 .insns = { 3214 BPF_MOV64_IMM(BPF_REG_2, 4), 3215 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3216 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 3217 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3218 BPF_MOV64_IMM(BPF_REG_4, ~0), 3219 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3220 BPF_FUNC_skb_load_bytes), 3221 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3222 BPF_EXIT_INSN(), 3223 }, 3224 .result = REJECT, 3225 .errstr = "R4 min value is negative", 3226 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3227 }, 3228 { 3229 "raw_stack: skb_load_bytes, zero len", 3230 .insns = { 3231 BPF_MOV64_IMM(BPF_REG_2, 4), 3232 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3233 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 3234 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3235 BPF_MOV64_IMM(BPF_REG_4, 0), 3236 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3237 BPF_FUNC_skb_load_bytes), 3238 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3239 BPF_EXIT_INSN(), 3240 }, 3241 .result = REJECT, 3242 .errstr = "invalid stack type R3", 3243 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3244 }, 3245 { 3246 "raw_stack: skb_load_bytes, no init", 3247 .insns = { 3248 BPF_MOV64_IMM(BPF_REG_2, 4), 3249 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3250 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 3251 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3252 BPF_MOV64_IMM(BPF_REG_4, 8), 3253 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3254 BPF_FUNC_skb_load_bytes), 3255 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3256 BPF_EXIT_INSN(), 3257 }, 3258 .result = ACCEPT, 3259 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3260 }, 3261 { 3262 "raw_stack: skb_load_bytes, init", 3263 .insns = { 3264 BPF_MOV64_IMM(BPF_REG_2, 4), 3265 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3266 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 3267 BPF_ST_MEM(BPF_DW, BPF_REG_6, 0, 0xcafe), 3268 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3269 BPF_MOV64_IMM(BPF_REG_4, 8), 3270 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3271 BPF_FUNC_skb_load_bytes), 3272 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3273 BPF_EXIT_INSN(), 3274 }, 3275 .result = ACCEPT, 3276 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3277 }, 3278 { 3279 "raw_stack: skb_load_bytes, spilled regs around bounds", 3280 .insns = { 3281 BPF_MOV64_IMM(BPF_REG_2, 4), 3282 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3283 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -16), 3284 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, -8), 3285 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 8), 3286 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3287 BPF_MOV64_IMM(BPF_REG_4, 8), 3288 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3289 BPF_FUNC_skb_load_bytes), 3290 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, -8), 3291 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6, 8), 3292 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 3293 offsetof(struct __sk_buff, mark)), 3294 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_2, 3295 offsetof(struct __sk_buff, priority)), 3296 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 3297 BPF_EXIT_INSN(), 3298 }, 3299 .result = ACCEPT, 3300 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3301 }, 3302 { 3303 "raw_stack: skb_load_bytes, spilled regs corruption", 3304 .insns = { 3305 BPF_MOV64_IMM(BPF_REG_2, 4), 3306 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3307 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 3308 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 3309 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3310 BPF_MOV64_IMM(BPF_REG_4, 8), 3311 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3312 BPF_FUNC_skb_load_bytes), 3313 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3314 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 3315 offsetof(struct __sk_buff, mark)), 3316 BPF_EXIT_INSN(), 3317 }, 3318 .result = REJECT, 3319 .errstr = "R0 invalid mem access 'inv'", 3320 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3321 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 3322 }, 3323 { 3324 "raw_stack: skb_load_bytes, spilled regs corruption 2", 3325 .insns = { 3326 BPF_MOV64_IMM(BPF_REG_2, 4), 3327 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3328 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -16), 3329 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, -8), 3330 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 3331 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 8), 3332 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3333 BPF_MOV64_IMM(BPF_REG_4, 8), 3334 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3335 BPF_FUNC_skb_load_bytes), 3336 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, -8), 3337 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6, 8), 3338 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_6, 0), 3339 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 3340 offsetof(struct __sk_buff, mark)), 3341 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_2, 3342 offsetof(struct __sk_buff, priority)), 3343 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 3344 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_3, 3345 offsetof(struct __sk_buff, pkt_type)), 3346 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_3), 3347 BPF_EXIT_INSN(), 3348 }, 3349 .result = REJECT, 3350 .errstr = "R3 invalid mem access 'inv'", 3351 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3352 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 3353 }, 3354 { 3355 "raw_stack: skb_load_bytes, spilled regs + data", 3356 .insns = { 3357 BPF_MOV64_IMM(BPF_REG_2, 4), 3358 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3359 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -16), 3360 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, -8), 3361 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 3362 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 8), 3363 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3364 BPF_MOV64_IMM(BPF_REG_4, 8), 3365 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3366 BPF_FUNC_skb_load_bytes), 3367 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, -8), 3368 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6, 8), 3369 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_6, 0), 3370 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 3371 offsetof(struct __sk_buff, mark)), 3372 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_2, 3373 offsetof(struct __sk_buff, priority)), 3374 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 3375 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_3), 3376 BPF_EXIT_INSN(), 3377 }, 3378 .result = ACCEPT, 3379 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3380 }, 3381 { 3382 "raw_stack: skb_load_bytes, invalid access 1", 3383 .insns = { 3384 BPF_MOV64_IMM(BPF_REG_2, 4), 3385 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3386 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -513), 3387 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3388 BPF_MOV64_IMM(BPF_REG_4, 8), 3389 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3390 BPF_FUNC_skb_load_bytes), 3391 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3392 BPF_EXIT_INSN(), 3393 }, 3394 .result = REJECT, 3395 .errstr = "invalid stack type R3 off=-513 access_size=8", 3396 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3397 }, 3398 { 3399 "raw_stack: skb_load_bytes, invalid access 2", 3400 .insns = { 3401 BPF_MOV64_IMM(BPF_REG_2, 4), 3402 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3403 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -1), 3404 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3405 BPF_MOV64_IMM(BPF_REG_4, 8), 3406 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3407 BPF_FUNC_skb_load_bytes), 3408 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3409 BPF_EXIT_INSN(), 3410 }, 3411 .result = REJECT, 3412 .errstr = "invalid stack type R3 off=-1 access_size=8", 3413 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3414 }, 3415 { 3416 "raw_stack: skb_load_bytes, invalid access 3", 3417 .insns = { 3418 BPF_MOV64_IMM(BPF_REG_2, 4), 3419 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3420 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 0xffffffff), 3421 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3422 BPF_MOV64_IMM(BPF_REG_4, 0xffffffff), 3423 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3424 BPF_FUNC_skb_load_bytes), 3425 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3426 BPF_EXIT_INSN(), 3427 }, 3428 .result = REJECT, 3429 .errstr = "R4 min value is negative", 3430 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3431 }, 3432 { 3433 "raw_stack: skb_load_bytes, invalid access 4", 3434 .insns = { 3435 BPF_MOV64_IMM(BPF_REG_2, 4), 3436 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3437 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -1), 3438 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3439 BPF_MOV64_IMM(BPF_REG_4, 0x7fffffff), 3440 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3441 BPF_FUNC_skb_load_bytes), 3442 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3443 BPF_EXIT_INSN(), 3444 }, 3445 .result = REJECT, 3446 .errstr = "R4 unbounded memory access, use 'var &= const' or 'if (var < const)'", 3447 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3448 }, 3449 { 3450 "raw_stack: skb_load_bytes, invalid access 5", 3451 .insns = { 3452 BPF_MOV64_IMM(BPF_REG_2, 4), 3453 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3454 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -512), 3455 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3456 BPF_MOV64_IMM(BPF_REG_4, 0x7fffffff), 3457 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3458 BPF_FUNC_skb_load_bytes), 3459 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3460 BPF_EXIT_INSN(), 3461 }, 3462 .result = REJECT, 3463 .errstr = "R4 unbounded memory access, use 'var &= const' or 'if (var < const)'", 3464 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3465 }, 3466 { 3467 "raw_stack: skb_load_bytes, invalid access 6", 3468 .insns = { 3469 BPF_MOV64_IMM(BPF_REG_2, 4), 3470 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3471 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -512), 3472 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3473 BPF_MOV64_IMM(BPF_REG_4, 0), 3474 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3475 BPF_FUNC_skb_load_bytes), 3476 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3477 BPF_EXIT_INSN(), 3478 }, 3479 .result = REJECT, 3480 .errstr = "invalid stack type R3 off=-512 access_size=0", 3481 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3482 }, 3483 { 3484 "raw_stack: skb_load_bytes, large access", 3485 .insns = { 3486 BPF_MOV64_IMM(BPF_REG_2, 4), 3487 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3488 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -512), 3489 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3490 BPF_MOV64_IMM(BPF_REG_4, 512), 3491 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3492 BPF_FUNC_skb_load_bytes), 3493 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3494 BPF_EXIT_INSN(), 3495 }, 3496 .result = ACCEPT, 3497 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3498 }, 3499 { 3500 "context stores via ST", 3501 .insns = { 3502 BPF_MOV64_IMM(BPF_REG_0, 0), 3503 BPF_ST_MEM(BPF_DW, BPF_REG_1, offsetof(struct __sk_buff, mark), 0), 3504 BPF_EXIT_INSN(), 3505 }, 3506 .errstr = "BPF_ST stores into R1 ctx is not allowed", 3507 .result = REJECT, 3508 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3509 }, 3510 { 3511 "context stores via XADD", 3512 .insns = { 3513 BPF_MOV64_IMM(BPF_REG_0, 0), 3514 BPF_RAW_INSN(BPF_STX | BPF_XADD | BPF_W, BPF_REG_1, 3515 BPF_REG_0, offsetof(struct __sk_buff, mark), 0), 3516 BPF_EXIT_INSN(), 3517 }, 3518 .errstr = "BPF_XADD stores into R1 ctx is not allowed", 3519 .result = REJECT, 3520 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3521 }, 3522 { 3523 "direct packet access: test1", 3524 .insns = { 3525 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3526 offsetof(struct __sk_buff, data)), 3527 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3528 offsetof(struct __sk_buff, data_end)), 3529 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3530 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3531 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 3532 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3533 BPF_MOV64_IMM(BPF_REG_0, 0), 3534 BPF_EXIT_INSN(), 3535 }, 3536 .result = ACCEPT, 3537 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3538 }, 3539 { 3540 "direct packet access: test2", 3541 .insns = { 3542 BPF_MOV64_IMM(BPF_REG_0, 1), 3543 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 3544 offsetof(struct __sk_buff, data_end)), 3545 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3546 offsetof(struct __sk_buff, data)), 3547 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3), 3548 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 14), 3549 BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_4, 15), 3550 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_3, 7), 3551 BPF_LDX_MEM(BPF_B, BPF_REG_4, BPF_REG_3, 12), 3552 BPF_ALU64_IMM(BPF_MUL, BPF_REG_4, 14), 3553 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3554 offsetof(struct __sk_buff, data)), 3555 BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_4), 3556 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3557 offsetof(struct __sk_buff, len)), 3558 BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 49), 3559 BPF_ALU64_IMM(BPF_RSH, BPF_REG_2, 49), 3560 BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_2), 3561 BPF_MOV64_REG(BPF_REG_2, BPF_REG_3), 3562 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8), 3563 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 3564 offsetof(struct __sk_buff, data_end)), 3565 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1), 3566 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_3, 4), 3567 BPF_MOV64_IMM(BPF_REG_0, 0), 3568 BPF_EXIT_INSN(), 3569 }, 3570 .result = ACCEPT, 3571 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3572 }, 3573 { 3574 "direct packet access: test3", 3575 .insns = { 3576 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3577 offsetof(struct __sk_buff, data)), 3578 BPF_MOV64_IMM(BPF_REG_0, 0), 3579 BPF_EXIT_INSN(), 3580 }, 3581 .errstr = "invalid bpf_context access off=76", 3582 .result = REJECT, 3583 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 3584 }, 3585 { 3586 "direct packet access: test4 (write)", 3587 .insns = { 3588 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3589 offsetof(struct __sk_buff, data)), 3590 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3591 offsetof(struct __sk_buff, data_end)), 3592 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3593 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3594 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 3595 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 3596 BPF_MOV64_IMM(BPF_REG_0, 0), 3597 BPF_EXIT_INSN(), 3598 }, 3599 .result = ACCEPT, 3600 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3601 }, 3602 { 3603 "direct packet access: test5 (pkt_end >= reg, good access)", 3604 .insns = { 3605 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3606 offsetof(struct __sk_buff, data)), 3607 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3608 offsetof(struct __sk_buff, data_end)), 3609 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3610 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3611 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 2), 3612 BPF_MOV64_IMM(BPF_REG_0, 1), 3613 BPF_EXIT_INSN(), 3614 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3615 BPF_MOV64_IMM(BPF_REG_0, 0), 3616 BPF_EXIT_INSN(), 3617 }, 3618 .result = ACCEPT, 3619 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3620 }, 3621 { 3622 "direct packet access: test6 (pkt_end >= reg, bad access)", 3623 .insns = { 3624 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3625 offsetof(struct __sk_buff, data)), 3626 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3627 offsetof(struct __sk_buff, data_end)), 3628 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3629 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3630 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 3), 3631 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3632 BPF_MOV64_IMM(BPF_REG_0, 1), 3633 BPF_EXIT_INSN(), 3634 BPF_MOV64_IMM(BPF_REG_0, 0), 3635 BPF_EXIT_INSN(), 3636 }, 3637 .errstr = "invalid access to packet", 3638 .result = REJECT, 3639 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3640 }, 3641 { 3642 "direct packet access: test7 (pkt_end >= reg, both accesses)", 3643 .insns = { 3644 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3645 offsetof(struct __sk_buff, data)), 3646 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3647 offsetof(struct __sk_buff, data_end)), 3648 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3649 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3650 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 3), 3651 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3652 BPF_MOV64_IMM(BPF_REG_0, 1), 3653 BPF_EXIT_INSN(), 3654 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3655 BPF_MOV64_IMM(BPF_REG_0, 0), 3656 BPF_EXIT_INSN(), 3657 }, 3658 .errstr = "invalid access to packet", 3659 .result = REJECT, 3660 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3661 }, 3662 { 3663 "direct packet access: test8 (double test, variant 1)", 3664 .insns = { 3665 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3666 offsetof(struct __sk_buff, data)), 3667 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3668 offsetof(struct __sk_buff, data_end)), 3669 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3670 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3671 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 4), 3672 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 3673 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3674 BPF_MOV64_IMM(BPF_REG_0, 1), 3675 BPF_EXIT_INSN(), 3676 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3677 BPF_MOV64_IMM(BPF_REG_0, 0), 3678 BPF_EXIT_INSN(), 3679 }, 3680 .result = ACCEPT, 3681 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3682 }, 3683 { 3684 "direct packet access: test9 (double test, variant 2)", 3685 .insns = { 3686 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3687 offsetof(struct __sk_buff, data)), 3688 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3689 offsetof(struct __sk_buff, data_end)), 3690 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3691 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3692 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 2), 3693 BPF_MOV64_IMM(BPF_REG_0, 1), 3694 BPF_EXIT_INSN(), 3695 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 3696 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3697 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3698 BPF_MOV64_IMM(BPF_REG_0, 0), 3699 BPF_EXIT_INSN(), 3700 }, 3701 .result = ACCEPT, 3702 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3703 }, 3704 { 3705 "direct packet access: test10 (write invalid)", 3706 .insns = { 3707 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3708 offsetof(struct __sk_buff, data)), 3709 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3710 offsetof(struct __sk_buff, data_end)), 3711 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3712 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3713 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 3714 BPF_MOV64_IMM(BPF_REG_0, 0), 3715 BPF_EXIT_INSN(), 3716 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 3717 BPF_MOV64_IMM(BPF_REG_0, 0), 3718 BPF_EXIT_INSN(), 3719 }, 3720 .errstr = "invalid access to packet", 3721 .result = REJECT, 3722 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3723 }, 3724 { 3725 "direct packet access: test11 (shift, good access)", 3726 .insns = { 3727 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3728 offsetof(struct __sk_buff, data)), 3729 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3730 offsetof(struct __sk_buff, data_end)), 3731 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3732 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22), 3733 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 8), 3734 BPF_MOV64_IMM(BPF_REG_3, 144), 3735 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3), 3736 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 23), 3737 BPF_ALU64_IMM(BPF_RSH, BPF_REG_5, 3), 3738 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 3739 BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5), 3740 BPF_MOV64_IMM(BPF_REG_0, 1), 3741 BPF_EXIT_INSN(), 3742 BPF_MOV64_IMM(BPF_REG_0, 0), 3743 BPF_EXIT_INSN(), 3744 }, 3745 .result = ACCEPT, 3746 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3747 .retval = 1, 3748 }, 3749 { 3750 "direct packet access: test12 (and, good access)", 3751 .insns = { 3752 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3753 offsetof(struct __sk_buff, data)), 3754 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3755 offsetof(struct __sk_buff, data_end)), 3756 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3757 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22), 3758 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 8), 3759 BPF_MOV64_IMM(BPF_REG_3, 144), 3760 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3), 3761 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 23), 3762 BPF_ALU64_IMM(BPF_AND, BPF_REG_5, 15), 3763 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 3764 BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5), 3765 BPF_MOV64_IMM(BPF_REG_0, 1), 3766 BPF_EXIT_INSN(), 3767 BPF_MOV64_IMM(BPF_REG_0, 0), 3768 BPF_EXIT_INSN(), 3769 }, 3770 .result = ACCEPT, 3771 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3772 .retval = 1, 3773 }, 3774 { 3775 "direct packet access: test13 (branches, good access)", 3776 .insns = { 3777 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3778 offsetof(struct __sk_buff, data)), 3779 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3780 offsetof(struct __sk_buff, data_end)), 3781 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3782 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22), 3783 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 13), 3784 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3785 offsetof(struct __sk_buff, mark)), 3786 BPF_MOV64_IMM(BPF_REG_4, 1), 3787 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_4, 2), 3788 BPF_MOV64_IMM(BPF_REG_3, 14), 3789 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 3790 BPF_MOV64_IMM(BPF_REG_3, 24), 3791 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3), 3792 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 23), 3793 BPF_ALU64_IMM(BPF_AND, BPF_REG_5, 15), 3794 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 3795 BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5), 3796 BPF_MOV64_IMM(BPF_REG_0, 1), 3797 BPF_EXIT_INSN(), 3798 BPF_MOV64_IMM(BPF_REG_0, 0), 3799 BPF_EXIT_INSN(), 3800 }, 3801 .result = ACCEPT, 3802 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3803 .retval = 1, 3804 }, 3805 { 3806 "direct packet access: test14 (pkt_ptr += 0, CONST_IMM, good access)", 3807 .insns = { 3808 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3809 offsetof(struct __sk_buff, data)), 3810 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3811 offsetof(struct __sk_buff, data_end)), 3812 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3813 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22), 3814 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 7), 3815 BPF_MOV64_IMM(BPF_REG_5, 12), 3816 BPF_ALU64_IMM(BPF_RSH, BPF_REG_5, 4), 3817 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 3818 BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5), 3819 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_6, 0), 3820 BPF_MOV64_IMM(BPF_REG_0, 1), 3821 BPF_EXIT_INSN(), 3822 BPF_MOV64_IMM(BPF_REG_0, 0), 3823 BPF_EXIT_INSN(), 3824 }, 3825 .result = ACCEPT, 3826 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3827 .retval = 1, 3828 }, 3829 { 3830 "direct packet access: test15 (spill with xadd)", 3831 .insns = { 3832 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3833 offsetof(struct __sk_buff, data)), 3834 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3835 offsetof(struct __sk_buff, data_end)), 3836 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3837 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3838 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 8), 3839 BPF_MOV64_IMM(BPF_REG_5, 4096), 3840 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 3841 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 3842 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 3843 BPF_STX_XADD(BPF_DW, BPF_REG_4, BPF_REG_5, 0), 3844 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0), 3845 BPF_STX_MEM(BPF_W, BPF_REG_2, BPF_REG_5, 0), 3846 BPF_MOV64_IMM(BPF_REG_0, 0), 3847 BPF_EXIT_INSN(), 3848 }, 3849 .errstr = "R2 invalid mem access 'inv'", 3850 .result = REJECT, 3851 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3852 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 3853 }, 3854 { 3855 "direct packet access: test16 (arith on data_end)", 3856 .insns = { 3857 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3858 offsetof(struct __sk_buff, data)), 3859 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3860 offsetof(struct __sk_buff, data_end)), 3861 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3862 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3863 BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, 16), 3864 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 3865 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 3866 BPF_MOV64_IMM(BPF_REG_0, 0), 3867 BPF_EXIT_INSN(), 3868 }, 3869 .errstr = "R3 pointer arithmetic on pkt_end", 3870 .result = REJECT, 3871 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3872 }, 3873 { 3874 "direct packet access: test17 (pruning, alignment)", 3875 .insns = { 3876 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3877 offsetof(struct __sk_buff, data)), 3878 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3879 offsetof(struct __sk_buff, data_end)), 3880 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 3881 offsetof(struct __sk_buff, mark)), 3882 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3883 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 14), 3884 BPF_JMP_IMM(BPF_JGT, BPF_REG_7, 1, 4), 3885 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 3886 BPF_STX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, -4), 3887 BPF_MOV64_IMM(BPF_REG_0, 0), 3888 BPF_EXIT_INSN(), 3889 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 3890 BPF_JMP_A(-6), 3891 }, 3892 .errstr = "misaligned packet access off 2+(0x0; 0x0)+15+-4 size 4", 3893 .result = REJECT, 3894 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3895 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 3896 }, 3897 { 3898 "direct packet access: test18 (imm += pkt_ptr, 1)", 3899 .insns = { 3900 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3901 offsetof(struct __sk_buff, data)), 3902 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3903 offsetof(struct __sk_buff, data_end)), 3904 BPF_MOV64_IMM(BPF_REG_0, 8), 3905 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 3906 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 3907 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 3908 BPF_MOV64_IMM(BPF_REG_0, 0), 3909 BPF_EXIT_INSN(), 3910 }, 3911 .result = ACCEPT, 3912 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3913 }, 3914 { 3915 "direct packet access: test19 (imm += pkt_ptr, 2)", 3916 .insns = { 3917 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3918 offsetof(struct __sk_buff, data)), 3919 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3920 offsetof(struct __sk_buff, data_end)), 3921 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3922 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3923 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 3924 BPF_MOV64_IMM(BPF_REG_4, 4), 3925 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_2), 3926 BPF_STX_MEM(BPF_B, BPF_REG_4, BPF_REG_4, 0), 3927 BPF_MOV64_IMM(BPF_REG_0, 0), 3928 BPF_EXIT_INSN(), 3929 }, 3930 .result = ACCEPT, 3931 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3932 }, 3933 { 3934 "direct packet access: test20 (x += pkt_ptr, 1)", 3935 .insns = { 3936 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3937 offsetof(struct __sk_buff, data)), 3938 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3939 offsetof(struct __sk_buff, data_end)), 3940 BPF_MOV64_IMM(BPF_REG_0, 0xffffffff), 3941 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 3942 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 3943 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0x7fff), 3944 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 3945 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_2), 3946 BPF_MOV64_REG(BPF_REG_5, BPF_REG_4), 3947 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 0x7fff - 1), 3948 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1), 3949 BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_4, 0), 3950 BPF_MOV64_IMM(BPF_REG_0, 0), 3951 BPF_EXIT_INSN(), 3952 }, 3953 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3954 .result = ACCEPT, 3955 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 3956 }, 3957 { 3958 "direct packet access: test21 (x += pkt_ptr, 2)", 3959 .insns = { 3960 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3961 offsetof(struct __sk_buff, data)), 3962 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3963 offsetof(struct __sk_buff, data_end)), 3964 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3965 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3966 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 9), 3967 BPF_MOV64_IMM(BPF_REG_4, 0xffffffff), 3968 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_4, -8), 3969 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 3970 BPF_ALU64_IMM(BPF_AND, BPF_REG_4, 0x7fff), 3971 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_2), 3972 BPF_MOV64_REG(BPF_REG_5, BPF_REG_4), 3973 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 0x7fff - 1), 3974 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1), 3975 BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_4, 0), 3976 BPF_MOV64_IMM(BPF_REG_0, 0), 3977 BPF_EXIT_INSN(), 3978 }, 3979 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3980 .result = ACCEPT, 3981 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 3982 }, 3983 { 3984 "direct packet access: test22 (x += pkt_ptr, 3)", 3985 .insns = { 3986 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3987 offsetof(struct __sk_buff, data)), 3988 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3989 offsetof(struct __sk_buff, data_end)), 3990 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3991 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3992 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -8), 3993 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_3, -16), 3994 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_10, -16), 3995 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 11), 3996 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -8), 3997 BPF_MOV64_IMM(BPF_REG_4, 0xffffffff), 3998 BPF_STX_XADD(BPF_DW, BPF_REG_10, BPF_REG_4, -8), 3999 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 4000 BPF_ALU64_IMM(BPF_RSH, BPF_REG_4, 49), 4001 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_2), 4002 BPF_MOV64_REG(BPF_REG_0, BPF_REG_4), 4003 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 2), 4004 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 4005 BPF_MOV64_IMM(BPF_REG_2, 1), 4006 BPF_STX_MEM(BPF_H, BPF_REG_4, BPF_REG_2, 0), 4007 BPF_MOV64_IMM(BPF_REG_0, 0), 4008 BPF_EXIT_INSN(), 4009 }, 4010 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4011 .result = ACCEPT, 4012 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4013 }, 4014 { 4015 "direct packet access: test23 (x += pkt_ptr, 4)", 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_IMM(BPF_REG_0, 0xffffffff), 4022 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 4023 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 4024 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0xffff), 4025 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 4026 BPF_MOV64_IMM(BPF_REG_0, 31), 4027 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_4), 4028 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 4029 BPF_MOV64_REG(BPF_REG_5, BPF_REG_0), 4030 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0xffff - 1), 4031 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 4032 BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_0, 0), 4033 BPF_MOV64_IMM(BPF_REG_0, 0), 4034 BPF_EXIT_INSN(), 4035 }, 4036 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4037 .result = REJECT, 4038 .errstr = "invalid access to packet, off=0 size=8, R5(id=1,off=0,r=0)", 4039 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4040 }, 4041 { 4042 "direct packet access: test24 (x += pkt_ptr, 5)", 4043 .insns = { 4044 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4045 offsetof(struct __sk_buff, data)), 4046 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4047 offsetof(struct __sk_buff, data_end)), 4048 BPF_MOV64_IMM(BPF_REG_0, 0xffffffff), 4049 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 4050 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 4051 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0xff), 4052 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 4053 BPF_MOV64_IMM(BPF_REG_0, 64), 4054 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_4), 4055 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 4056 BPF_MOV64_REG(BPF_REG_5, BPF_REG_0), 4057 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x7fff - 1), 4058 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 4059 BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_0, 0), 4060 BPF_MOV64_IMM(BPF_REG_0, 0), 4061 BPF_EXIT_INSN(), 4062 }, 4063 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4064 .result = ACCEPT, 4065 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4066 }, 4067 { 4068 "direct packet access: test25 (marking on <, good access)", 4069 .insns = { 4070 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4071 offsetof(struct __sk_buff, data)), 4072 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4073 offsetof(struct __sk_buff, data_end)), 4074 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4075 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4076 BPF_JMP_REG(BPF_JLT, BPF_REG_0, BPF_REG_3, 2), 4077 BPF_MOV64_IMM(BPF_REG_0, 0), 4078 BPF_EXIT_INSN(), 4079 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 4080 BPF_JMP_IMM(BPF_JA, 0, 0, -4), 4081 }, 4082 .result = ACCEPT, 4083 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4084 }, 4085 { 4086 "direct packet access: test26 (marking on <, bad access)", 4087 .insns = { 4088 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4089 offsetof(struct __sk_buff, data)), 4090 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4091 offsetof(struct __sk_buff, data_end)), 4092 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4093 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4094 BPF_JMP_REG(BPF_JLT, BPF_REG_0, BPF_REG_3, 3), 4095 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 4096 BPF_MOV64_IMM(BPF_REG_0, 0), 4097 BPF_EXIT_INSN(), 4098 BPF_JMP_IMM(BPF_JA, 0, 0, -3), 4099 }, 4100 .result = REJECT, 4101 .errstr = "invalid access to packet", 4102 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4103 }, 4104 { 4105 "direct packet access: test27 (marking on <=, good access)", 4106 .insns = { 4107 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4108 offsetof(struct __sk_buff, data)), 4109 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4110 offsetof(struct __sk_buff, data_end)), 4111 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4112 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4113 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_0, 1), 4114 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 4115 BPF_MOV64_IMM(BPF_REG_0, 1), 4116 BPF_EXIT_INSN(), 4117 }, 4118 .result = ACCEPT, 4119 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4120 .retval = 1, 4121 }, 4122 { 4123 "direct packet access: test28 (marking on <=, bad access)", 4124 .insns = { 4125 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4126 offsetof(struct __sk_buff, data)), 4127 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4128 offsetof(struct __sk_buff, data_end)), 4129 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4130 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4131 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_0, 2), 4132 BPF_MOV64_IMM(BPF_REG_0, 1), 4133 BPF_EXIT_INSN(), 4134 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 4135 BPF_JMP_IMM(BPF_JA, 0, 0, -4), 4136 }, 4137 .result = REJECT, 4138 .errstr = "invalid access to packet", 4139 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4140 }, 4141 { 4142 "helper access to packet: test1, valid packet_ptr range", 4143 .insns = { 4144 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4145 offsetof(struct xdp_md, data)), 4146 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4147 offsetof(struct xdp_md, data_end)), 4148 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 4149 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 4150 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 5), 4151 BPF_LD_MAP_FD(BPF_REG_1, 0), 4152 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 4153 BPF_MOV64_IMM(BPF_REG_4, 0), 4154 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4155 BPF_FUNC_map_update_elem), 4156 BPF_MOV64_IMM(BPF_REG_0, 0), 4157 BPF_EXIT_INSN(), 4158 }, 4159 .fixup_map_hash_8b = { 5 }, 4160 .result_unpriv = ACCEPT, 4161 .result = ACCEPT, 4162 .prog_type = BPF_PROG_TYPE_XDP, 4163 }, 4164 { 4165 "helper access to packet: test2, unchecked packet_ptr", 4166 .insns = { 4167 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4168 offsetof(struct xdp_md, data)), 4169 BPF_LD_MAP_FD(BPF_REG_1, 0), 4170 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4171 BPF_FUNC_map_lookup_elem), 4172 BPF_MOV64_IMM(BPF_REG_0, 0), 4173 BPF_EXIT_INSN(), 4174 }, 4175 .fixup_map_hash_8b = { 1 }, 4176 .result = REJECT, 4177 .errstr = "invalid access to packet", 4178 .prog_type = BPF_PROG_TYPE_XDP, 4179 }, 4180 { 4181 "helper access to packet: test3, variable add", 4182 .insns = { 4183 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4184 offsetof(struct xdp_md, data)), 4185 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4186 offsetof(struct xdp_md, data_end)), 4187 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 4188 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8), 4189 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 10), 4190 BPF_LDX_MEM(BPF_B, BPF_REG_5, BPF_REG_2, 0), 4191 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 4192 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_5), 4193 BPF_MOV64_REG(BPF_REG_5, BPF_REG_4), 4194 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 8), 4195 BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_3, 4), 4196 BPF_LD_MAP_FD(BPF_REG_1, 0), 4197 BPF_MOV64_REG(BPF_REG_2, BPF_REG_4), 4198 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4199 BPF_FUNC_map_lookup_elem), 4200 BPF_MOV64_IMM(BPF_REG_0, 0), 4201 BPF_EXIT_INSN(), 4202 }, 4203 .fixup_map_hash_8b = { 11 }, 4204 .result = ACCEPT, 4205 .prog_type = BPF_PROG_TYPE_XDP, 4206 }, 4207 { 4208 "helper access to packet: test4, packet_ptr with bad range", 4209 .insns = { 4210 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4211 offsetof(struct xdp_md, data)), 4212 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4213 offsetof(struct xdp_md, data_end)), 4214 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 4215 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 4), 4216 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 2), 4217 BPF_MOV64_IMM(BPF_REG_0, 0), 4218 BPF_EXIT_INSN(), 4219 BPF_LD_MAP_FD(BPF_REG_1, 0), 4220 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4221 BPF_FUNC_map_lookup_elem), 4222 BPF_MOV64_IMM(BPF_REG_0, 0), 4223 BPF_EXIT_INSN(), 4224 }, 4225 .fixup_map_hash_8b = { 7 }, 4226 .result = REJECT, 4227 .errstr = "invalid access to packet", 4228 .prog_type = BPF_PROG_TYPE_XDP, 4229 }, 4230 { 4231 "helper access to packet: test5, packet_ptr with too short range", 4232 .insns = { 4233 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4234 offsetof(struct xdp_md, data)), 4235 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4236 offsetof(struct xdp_md, data_end)), 4237 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), 4238 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 4239 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 7), 4240 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 3), 4241 BPF_LD_MAP_FD(BPF_REG_1, 0), 4242 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4243 BPF_FUNC_map_lookup_elem), 4244 BPF_MOV64_IMM(BPF_REG_0, 0), 4245 BPF_EXIT_INSN(), 4246 }, 4247 .fixup_map_hash_8b = { 6 }, 4248 .result = REJECT, 4249 .errstr = "invalid access to packet", 4250 .prog_type = BPF_PROG_TYPE_XDP, 4251 }, 4252 { 4253 "helper access to packet: test6, cls valid packet_ptr range", 4254 .insns = { 4255 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4256 offsetof(struct __sk_buff, data)), 4257 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4258 offsetof(struct __sk_buff, data_end)), 4259 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 4260 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 4261 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 5), 4262 BPF_LD_MAP_FD(BPF_REG_1, 0), 4263 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 4264 BPF_MOV64_IMM(BPF_REG_4, 0), 4265 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4266 BPF_FUNC_map_update_elem), 4267 BPF_MOV64_IMM(BPF_REG_0, 0), 4268 BPF_EXIT_INSN(), 4269 }, 4270 .fixup_map_hash_8b = { 5 }, 4271 .result = ACCEPT, 4272 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4273 }, 4274 { 4275 "helper access to packet: test7, cls unchecked packet_ptr", 4276 .insns = { 4277 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4278 offsetof(struct __sk_buff, data)), 4279 BPF_LD_MAP_FD(BPF_REG_1, 0), 4280 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4281 BPF_FUNC_map_lookup_elem), 4282 BPF_MOV64_IMM(BPF_REG_0, 0), 4283 BPF_EXIT_INSN(), 4284 }, 4285 .fixup_map_hash_8b = { 1 }, 4286 .result = REJECT, 4287 .errstr = "invalid access to packet", 4288 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4289 }, 4290 { 4291 "helper access to packet: test8, cls variable add", 4292 .insns = { 4293 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4294 offsetof(struct __sk_buff, data)), 4295 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4296 offsetof(struct __sk_buff, data_end)), 4297 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 4298 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8), 4299 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 10), 4300 BPF_LDX_MEM(BPF_B, BPF_REG_5, BPF_REG_2, 0), 4301 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 4302 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_5), 4303 BPF_MOV64_REG(BPF_REG_5, BPF_REG_4), 4304 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 8), 4305 BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_3, 4), 4306 BPF_LD_MAP_FD(BPF_REG_1, 0), 4307 BPF_MOV64_REG(BPF_REG_2, BPF_REG_4), 4308 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4309 BPF_FUNC_map_lookup_elem), 4310 BPF_MOV64_IMM(BPF_REG_0, 0), 4311 BPF_EXIT_INSN(), 4312 }, 4313 .fixup_map_hash_8b = { 11 }, 4314 .result = ACCEPT, 4315 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4316 }, 4317 { 4318 "helper access to packet: test9, cls packet_ptr with bad range", 4319 .insns = { 4320 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4321 offsetof(struct __sk_buff, data)), 4322 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4323 offsetof(struct __sk_buff, data_end)), 4324 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 4325 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 4), 4326 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 2), 4327 BPF_MOV64_IMM(BPF_REG_0, 0), 4328 BPF_EXIT_INSN(), 4329 BPF_LD_MAP_FD(BPF_REG_1, 0), 4330 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4331 BPF_FUNC_map_lookup_elem), 4332 BPF_MOV64_IMM(BPF_REG_0, 0), 4333 BPF_EXIT_INSN(), 4334 }, 4335 .fixup_map_hash_8b = { 7 }, 4336 .result = REJECT, 4337 .errstr = "invalid access to packet", 4338 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4339 }, 4340 { 4341 "helper access to packet: test10, cls packet_ptr with too short range", 4342 .insns = { 4343 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4344 offsetof(struct __sk_buff, data)), 4345 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4346 offsetof(struct __sk_buff, data_end)), 4347 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), 4348 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 4349 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 7), 4350 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 3), 4351 BPF_LD_MAP_FD(BPF_REG_1, 0), 4352 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4353 BPF_FUNC_map_lookup_elem), 4354 BPF_MOV64_IMM(BPF_REG_0, 0), 4355 BPF_EXIT_INSN(), 4356 }, 4357 .fixup_map_hash_8b = { 6 }, 4358 .result = REJECT, 4359 .errstr = "invalid access to packet", 4360 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4361 }, 4362 { 4363 "helper access to packet: test11, cls unsuitable helper 1", 4364 .insns = { 4365 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4366 offsetof(struct __sk_buff, data)), 4367 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4368 offsetof(struct __sk_buff, data_end)), 4369 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4370 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 4371 BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, 7), 4372 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_7, 4), 4373 BPF_MOV64_IMM(BPF_REG_2, 0), 4374 BPF_MOV64_IMM(BPF_REG_4, 42), 4375 BPF_MOV64_IMM(BPF_REG_5, 0), 4376 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4377 BPF_FUNC_skb_store_bytes), 4378 BPF_MOV64_IMM(BPF_REG_0, 0), 4379 BPF_EXIT_INSN(), 4380 }, 4381 .result = REJECT, 4382 .errstr = "helper access to the packet", 4383 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4384 }, 4385 { 4386 "helper access to packet: test12, cls unsuitable helper 2", 4387 .insns = { 4388 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4389 offsetof(struct __sk_buff, data)), 4390 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4391 offsetof(struct __sk_buff, data_end)), 4392 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 4393 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 8), 4394 BPF_JMP_REG(BPF_JGT, BPF_REG_6, BPF_REG_7, 3), 4395 BPF_MOV64_IMM(BPF_REG_2, 0), 4396 BPF_MOV64_IMM(BPF_REG_4, 4), 4397 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4398 BPF_FUNC_skb_load_bytes), 4399 BPF_MOV64_IMM(BPF_REG_0, 0), 4400 BPF_EXIT_INSN(), 4401 }, 4402 .result = REJECT, 4403 .errstr = "helper access to the packet", 4404 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4405 }, 4406 { 4407 "helper access to packet: test13, cls helper ok", 4408 .insns = { 4409 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4410 offsetof(struct __sk_buff, data)), 4411 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4412 offsetof(struct __sk_buff, data_end)), 4413 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4414 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4415 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4416 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4417 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4418 BPF_MOV64_IMM(BPF_REG_2, 4), 4419 BPF_MOV64_IMM(BPF_REG_3, 0), 4420 BPF_MOV64_IMM(BPF_REG_4, 0), 4421 BPF_MOV64_IMM(BPF_REG_5, 0), 4422 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4423 BPF_FUNC_csum_diff), 4424 BPF_MOV64_IMM(BPF_REG_0, 0), 4425 BPF_EXIT_INSN(), 4426 }, 4427 .result = ACCEPT, 4428 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4429 }, 4430 { 4431 "helper access to packet: test14, cls helper ok sub", 4432 .insns = { 4433 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4434 offsetof(struct __sk_buff, data)), 4435 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4436 offsetof(struct __sk_buff, data_end)), 4437 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4438 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4439 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4440 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4441 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 4), 4442 BPF_MOV64_IMM(BPF_REG_2, 4), 4443 BPF_MOV64_IMM(BPF_REG_3, 0), 4444 BPF_MOV64_IMM(BPF_REG_4, 0), 4445 BPF_MOV64_IMM(BPF_REG_5, 0), 4446 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4447 BPF_FUNC_csum_diff), 4448 BPF_MOV64_IMM(BPF_REG_0, 0), 4449 BPF_EXIT_INSN(), 4450 }, 4451 .result = ACCEPT, 4452 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4453 }, 4454 { 4455 "helper access to packet: test15, cls helper fail sub", 4456 .insns = { 4457 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4458 offsetof(struct __sk_buff, data)), 4459 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4460 offsetof(struct __sk_buff, data_end)), 4461 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4462 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4463 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4464 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4465 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 12), 4466 BPF_MOV64_IMM(BPF_REG_2, 4), 4467 BPF_MOV64_IMM(BPF_REG_3, 0), 4468 BPF_MOV64_IMM(BPF_REG_4, 0), 4469 BPF_MOV64_IMM(BPF_REG_5, 0), 4470 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4471 BPF_FUNC_csum_diff), 4472 BPF_MOV64_IMM(BPF_REG_0, 0), 4473 BPF_EXIT_INSN(), 4474 }, 4475 .result = REJECT, 4476 .errstr = "invalid access to packet", 4477 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4478 }, 4479 { 4480 "helper access to packet: test16, cls helper fail range 1", 4481 .insns = { 4482 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4483 offsetof(struct __sk_buff, data)), 4484 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4485 offsetof(struct __sk_buff, data_end)), 4486 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4487 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4488 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4489 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4490 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4491 BPF_MOV64_IMM(BPF_REG_2, 8), 4492 BPF_MOV64_IMM(BPF_REG_3, 0), 4493 BPF_MOV64_IMM(BPF_REG_4, 0), 4494 BPF_MOV64_IMM(BPF_REG_5, 0), 4495 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4496 BPF_FUNC_csum_diff), 4497 BPF_MOV64_IMM(BPF_REG_0, 0), 4498 BPF_EXIT_INSN(), 4499 }, 4500 .result = REJECT, 4501 .errstr = "invalid access to packet", 4502 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4503 }, 4504 { 4505 "helper access to packet: test17, cls helper fail range 2", 4506 .insns = { 4507 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4508 offsetof(struct __sk_buff, data)), 4509 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4510 offsetof(struct __sk_buff, data_end)), 4511 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4512 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4513 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4514 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4515 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4516 BPF_MOV64_IMM(BPF_REG_2, -9), 4517 BPF_MOV64_IMM(BPF_REG_3, 0), 4518 BPF_MOV64_IMM(BPF_REG_4, 0), 4519 BPF_MOV64_IMM(BPF_REG_5, 0), 4520 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4521 BPF_FUNC_csum_diff), 4522 BPF_MOV64_IMM(BPF_REG_0, 0), 4523 BPF_EXIT_INSN(), 4524 }, 4525 .result = REJECT, 4526 .errstr = "R2 min value is negative", 4527 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4528 }, 4529 { 4530 "helper access to packet: test18, cls helper fail range 3", 4531 .insns = { 4532 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4533 offsetof(struct __sk_buff, data)), 4534 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4535 offsetof(struct __sk_buff, data_end)), 4536 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4537 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4538 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4539 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4540 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4541 BPF_MOV64_IMM(BPF_REG_2, ~0), 4542 BPF_MOV64_IMM(BPF_REG_3, 0), 4543 BPF_MOV64_IMM(BPF_REG_4, 0), 4544 BPF_MOV64_IMM(BPF_REG_5, 0), 4545 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4546 BPF_FUNC_csum_diff), 4547 BPF_MOV64_IMM(BPF_REG_0, 0), 4548 BPF_EXIT_INSN(), 4549 }, 4550 .result = REJECT, 4551 .errstr = "R2 min value is negative", 4552 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4553 }, 4554 { 4555 "helper access to packet: test19, cls helper range zero", 4556 .insns = { 4557 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4558 offsetof(struct __sk_buff, data)), 4559 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4560 offsetof(struct __sk_buff, data_end)), 4561 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4562 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4563 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4564 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4565 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4566 BPF_MOV64_IMM(BPF_REG_2, 0), 4567 BPF_MOV64_IMM(BPF_REG_3, 0), 4568 BPF_MOV64_IMM(BPF_REG_4, 0), 4569 BPF_MOV64_IMM(BPF_REG_5, 0), 4570 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4571 BPF_FUNC_csum_diff), 4572 BPF_MOV64_IMM(BPF_REG_0, 0), 4573 BPF_EXIT_INSN(), 4574 }, 4575 .result = ACCEPT, 4576 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4577 }, 4578 { 4579 "helper access to packet: test20, pkt end as input", 4580 .insns = { 4581 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4582 offsetof(struct __sk_buff, data)), 4583 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4584 offsetof(struct __sk_buff, data_end)), 4585 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4586 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4587 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4588 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4589 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 4590 BPF_MOV64_IMM(BPF_REG_2, 4), 4591 BPF_MOV64_IMM(BPF_REG_3, 0), 4592 BPF_MOV64_IMM(BPF_REG_4, 0), 4593 BPF_MOV64_IMM(BPF_REG_5, 0), 4594 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4595 BPF_FUNC_csum_diff), 4596 BPF_MOV64_IMM(BPF_REG_0, 0), 4597 BPF_EXIT_INSN(), 4598 }, 4599 .result = REJECT, 4600 .errstr = "R1 type=pkt_end expected=fp", 4601 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4602 }, 4603 { 4604 "helper access to packet: test21, wrong reg", 4605 .insns = { 4606 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4607 offsetof(struct __sk_buff, data)), 4608 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4609 offsetof(struct __sk_buff, data_end)), 4610 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4611 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4612 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4613 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4614 BPF_MOV64_IMM(BPF_REG_2, 4), 4615 BPF_MOV64_IMM(BPF_REG_3, 0), 4616 BPF_MOV64_IMM(BPF_REG_4, 0), 4617 BPF_MOV64_IMM(BPF_REG_5, 0), 4618 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4619 BPF_FUNC_csum_diff), 4620 BPF_MOV64_IMM(BPF_REG_0, 0), 4621 BPF_EXIT_INSN(), 4622 }, 4623 .result = REJECT, 4624 .errstr = "invalid access to packet", 4625 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4626 }, 4627 { 4628 "prevent map lookup in sockmap", 4629 .insns = { 4630 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4631 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4632 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4633 BPF_LD_MAP_FD(BPF_REG_1, 0), 4634 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4635 BPF_FUNC_map_lookup_elem), 4636 BPF_EXIT_INSN(), 4637 }, 4638 .fixup_map_sockmap = { 3 }, 4639 .result = REJECT, 4640 .errstr = "cannot pass map_type 15 into func bpf_map_lookup_elem", 4641 .prog_type = BPF_PROG_TYPE_SOCK_OPS, 4642 }, 4643 { 4644 "prevent map lookup in sockhash", 4645 .insns = { 4646 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4647 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4648 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4649 BPF_LD_MAP_FD(BPF_REG_1, 0), 4650 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4651 BPF_FUNC_map_lookup_elem), 4652 BPF_EXIT_INSN(), 4653 }, 4654 .fixup_map_sockhash = { 3 }, 4655 .result = REJECT, 4656 .errstr = "cannot pass map_type 18 into func bpf_map_lookup_elem", 4657 .prog_type = BPF_PROG_TYPE_SOCK_OPS, 4658 }, 4659 { 4660 "prevent map lookup in xskmap", 4661 .insns = { 4662 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4663 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4664 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4665 BPF_LD_MAP_FD(BPF_REG_1, 0), 4666 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4667 BPF_FUNC_map_lookup_elem), 4668 BPF_EXIT_INSN(), 4669 }, 4670 .fixup_map_xskmap = { 3 }, 4671 .result = REJECT, 4672 .errstr = "cannot pass map_type 17 into func bpf_map_lookup_elem", 4673 .prog_type = BPF_PROG_TYPE_XDP, 4674 }, 4675 { 4676 "prevent map lookup in stack trace", 4677 .insns = { 4678 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4679 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4680 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4681 BPF_LD_MAP_FD(BPF_REG_1, 0), 4682 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4683 BPF_FUNC_map_lookup_elem), 4684 BPF_EXIT_INSN(), 4685 }, 4686 .fixup_map_stacktrace = { 3 }, 4687 .result = REJECT, 4688 .errstr = "cannot pass map_type 7 into func bpf_map_lookup_elem", 4689 .prog_type = BPF_PROG_TYPE_PERF_EVENT, 4690 }, 4691 { 4692 "prevent map lookup in prog array", 4693 .insns = { 4694 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4695 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4696 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4697 BPF_LD_MAP_FD(BPF_REG_1, 0), 4698 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4699 BPF_FUNC_map_lookup_elem), 4700 BPF_EXIT_INSN(), 4701 }, 4702 .fixup_prog2 = { 3 }, 4703 .result = REJECT, 4704 .errstr = "cannot pass map_type 3 into func bpf_map_lookup_elem", 4705 }, 4706 { 4707 "valid map access into an array with a constant", 4708 .insns = { 4709 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4710 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4711 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4712 BPF_LD_MAP_FD(BPF_REG_1, 0), 4713 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4714 BPF_FUNC_map_lookup_elem), 4715 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 4716 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 4717 offsetof(struct test_val, foo)), 4718 BPF_EXIT_INSN(), 4719 }, 4720 .fixup_map_hash_48b = { 3 }, 4721 .errstr_unpriv = "R0 leaks addr", 4722 .result_unpriv = REJECT, 4723 .result = ACCEPT, 4724 }, 4725 { 4726 "valid map access into an array with a register", 4727 .insns = { 4728 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4729 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4730 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4731 BPF_LD_MAP_FD(BPF_REG_1, 0), 4732 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4733 BPF_FUNC_map_lookup_elem), 4734 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 4735 BPF_MOV64_IMM(BPF_REG_1, 4), 4736 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2), 4737 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 4738 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 4739 offsetof(struct test_val, foo)), 4740 BPF_EXIT_INSN(), 4741 }, 4742 .fixup_map_hash_48b = { 3 }, 4743 .errstr_unpriv = "R0 leaks addr", 4744 .result_unpriv = REJECT, 4745 .result = ACCEPT, 4746 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4747 }, 4748 { 4749 "valid map access into an array with a variable", 4750 .insns = { 4751 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4752 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4753 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4754 BPF_LD_MAP_FD(BPF_REG_1, 0), 4755 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4756 BPF_FUNC_map_lookup_elem), 4757 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 4758 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 4759 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, MAX_ENTRIES, 3), 4760 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2), 4761 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 4762 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 4763 offsetof(struct test_val, foo)), 4764 BPF_EXIT_INSN(), 4765 }, 4766 .fixup_map_hash_48b = { 3 }, 4767 .errstr_unpriv = "R0 leaks addr", 4768 .result_unpriv = REJECT, 4769 .result = ACCEPT, 4770 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4771 }, 4772 { 4773 "valid map access into an array with a signed variable", 4774 .insns = { 4775 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4776 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4777 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4778 BPF_LD_MAP_FD(BPF_REG_1, 0), 4779 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4780 BPF_FUNC_map_lookup_elem), 4781 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 4782 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 4783 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 0xffffffff, 1), 4784 BPF_MOV32_IMM(BPF_REG_1, 0), 4785 BPF_MOV32_IMM(BPF_REG_2, MAX_ENTRIES), 4786 BPF_JMP_REG(BPF_JSGT, BPF_REG_2, BPF_REG_1, 1), 4787 BPF_MOV32_IMM(BPF_REG_1, 0), 4788 BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 2), 4789 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 4790 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 4791 offsetof(struct test_val, foo)), 4792 BPF_EXIT_INSN(), 4793 }, 4794 .fixup_map_hash_48b = { 3 }, 4795 .errstr_unpriv = "R0 leaks addr", 4796 .result_unpriv = REJECT, 4797 .result = ACCEPT, 4798 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4799 }, 4800 { 4801 "invalid map access into an array with a constant", 4802 .insns = { 4803 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4804 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4805 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4806 BPF_LD_MAP_FD(BPF_REG_1, 0), 4807 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4808 BPF_FUNC_map_lookup_elem), 4809 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 4810 BPF_ST_MEM(BPF_DW, BPF_REG_0, (MAX_ENTRIES + 1) << 2, 4811 offsetof(struct test_val, foo)), 4812 BPF_EXIT_INSN(), 4813 }, 4814 .fixup_map_hash_48b = { 3 }, 4815 .errstr = "invalid access to map value, value_size=48 off=48 size=8", 4816 .result = REJECT, 4817 }, 4818 { 4819 "invalid map access into an array with a register", 4820 .insns = { 4821 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4822 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4823 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4824 BPF_LD_MAP_FD(BPF_REG_1, 0), 4825 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4826 BPF_FUNC_map_lookup_elem), 4827 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 4828 BPF_MOV64_IMM(BPF_REG_1, MAX_ENTRIES + 1), 4829 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2), 4830 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 4831 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 4832 offsetof(struct test_val, foo)), 4833 BPF_EXIT_INSN(), 4834 }, 4835 .fixup_map_hash_48b = { 3 }, 4836 .errstr = "R0 min value is outside of the array range", 4837 .result = REJECT, 4838 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4839 }, 4840 { 4841 "invalid map access into an array with a variable", 4842 .insns = { 4843 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4844 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4845 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4846 BPF_LD_MAP_FD(BPF_REG_1, 0), 4847 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4848 BPF_FUNC_map_lookup_elem), 4849 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 4850 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 4851 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2), 4852 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 4853 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 4854 offsetof(struct test_val, foo)), 4855 BPF_EXIT_INSN(), 4856 }, 4857 .fixup_map_hash_48b = { 3 }, 4858 .errstr = "R0 unbounded memory access, make sure to bounds check any array access into a map", 4859 .result = REJECT, 4860 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4861 }, 4862 { 4863 "invalid map access into an array with no floor check", 4864 .insns = { 4865 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4866 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4867 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4868 BPF_LD_MAP_FD(BPF_REG_1, 0), 4869 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4870 BPF_FUNC_map_lookup_elem), 4871 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 4872 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), 4873 BPF_MOV32_IMM(BPF_REG_2, MAX_ENTRIES), 4874 BPF_JMP_REG(BPF_JSGT, BPF_REG_2, BPF_REG_1, 1), 4875 BPF_MOV32_IMM(BPF_REG_1, 0), 4876 BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 2), 4877 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 4878 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 4879 offsetof(struct test_val, foo)), 4880 BPF_EXIT_INSN(), 4881 }, 4882 .fixup_map_hash_48b = { 3 }, 4883 .errstr_unpriv = "R0 leaks addr", 4884 .errstr = "R0 unbounded memory access", 4885 .result_unpriv = REJECT, 4886 .result = REJECT, 4887 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4888 }, 4889 { 4890 "invalid map access into an array with a invalid max check", 4891 .insns = { 4892 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4893 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4894 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4895 BPF_LD_MAP_FD(BPF_REG_1, 0), 4896 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4897 BPF_FUNC_map_lookup_elem), 4898 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 4899 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 4900 BPF_MOV32_IMM(BPF_REG_2, MAX_ENTRIES + 1), 4901 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1), 4902 BPF_MOV32_IMM(BPF_REG_1, 0), 4903 BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 2), 4904 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 4905 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 4906 offsetof(struct test_val, foo)), 4907 BPF_EXIT_INSN(), 4908 }, 4909 .fixup_map_hash_48b = { 3 }, 4910 .errstr_unpriv = "R0 leaks addr", 4911 .errstr = "invalid access to map value, value_size=48 off=44 size=8", 4912 .result_unpriv = REJECT, 4913 .result = REJECT, 4914 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4915 }, 4916 { 4917 "invalid map access into an array with a invalid max check", 4918 .insns = { 4919 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4920 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4921 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4922 BPF_LD_MAP_FD(BPF_REG_1, 0), 4923 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4924 BPF_FUNC_map_lookup_elem), 4925 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10), 4926 BPF_MOV64_REG(BPF_REG_8, BPF_REG_0), 4927 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4928 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4929 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4930 BPF_LD_MAP_FD(BPF_REG_1, 0), 4931 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4932 BPF_FUNC_map_lookup_elem), 4933 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 4934 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_8), 4935 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 4936 offsetof(struct test_val, foo)), 4937 BPF_EXIT_INSN(), 4938 }, 4939 .fixup_map_hash_48b = { 3, 11 }, 4940 .errstr = "R0 pointer += pointer", 4941 .result = REJECT, 4942 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4943 }, 4944 { 4945 "direct packet read test#1 for CGROUP_SKB", 4946 .insns = { 4947 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4948 offsetof(struct __sk_buff, data)), 4949 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4950 offsetof(struct __sk_buff, data_end)), 4951 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 4952 offsetof(struct __sk_buff, len)), 4953 BPF_LDX_MEM(BPF_W, BPF_REG_5, BPF_REG_1, 4954 offsetof(struct __sk_buff, pkt_type)), 4955 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4956 offsetof(struct __sk_buff, mark)), 4957 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_6, 4958 offsetof(struct __sk_buff, mark)), 4959 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4960 offsetof(struct __sk_buff, queue_mapping)), 4961 BPF_LDX_MEM(BPF_W, BPF_REG_8, BPF_REG_1, 4962 offsetof(struct __sk_buff, protocol)), 4963 BPF_LDX_MEM(BPF_W, BPF_REG_9, BPF_REG_1, 4964 offsetof(struct __sk_buff, vlan_present)), 4965 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4966 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4967 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 4968 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 4969 BPF_MOV64_IMM(BPF_REG_0, 0), 4970 BPF_EXIT_INSN(), 4971 }, 4972 .result = ACCEPT, 4973 .result_unpriv = REJECT, 4974 .errstr_unpriv = "invalid bpf_context access off=76 size=4", 4975 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 4976 }, 4977 { 4978 "direct packet read test#2 for CGROUP_SKB", 4979 .insns = { 4980 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 4981 offsetof(struct __sk_buff, vlan_tci)), 4982 BPF_LDX_MEM(BPF_W, BPF_REG_5, BPF_REG_1, 4983 offsetof(struct __sk_buff, vlan_proto)), 4984 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4985 offsetof(struct __sk_buff, priority)), 4986 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_6, 4987 offsetof(struct __sk_buff, priority)), 4988 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4989 offsetof(struct __sk_buff, 4990 ingress_ifindex)), 4991 BPF_LDX_MEM(BPF_W, BPF_REG_8, BPF_REG_1, 4992 offsetof(struct __sk_buff, tc_index)), 4993 BPF_LDX_MEM(BPF_W, BPF_REG_9, BPF_REG_1, 4994 offsetof(struct __sk_buff, hash)), 4995 BPF_MOV64_IMM(BPF_REG_0, 0), 4996 BPF_EXIT_INSN(), 4997 }, 4998 .result = ACCEPT, 4999 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5000 }, 5001 { 5002 "direct packet read test#3 for CGROUP_SKB", 5003 .insns = { 5004 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 5005 offsetof(struct __sk_buff, cb[0])), 5006 BPF_LDX_MEM(BPF_W, BPF_REG_5, BPF_REG_1, 5007 offsetof(struct __sk_buff, cb[1])), 5008 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 5009 offsetof(struct __sk_buff, cb[2])), 5010 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 5011 offsetof(struct __sk_buff, cb[3])), 5012 BPF_LDX_MEM(BPF_W, BPF_REG_8, BPF_REG_1, 5013 offsetof(struct __sk_buff, cb[4])), 5014 BPF_LDX_MEM(BPF_W, BPF_REG_9, BPF_REG_1, 5015 offsetof(struct __sk_buff, napi_id)), 5016 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_4, 5017 offsetof(struct __sk_buff, cb[0])), 5018 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_5, 5019 offsetof(struct __sk_buff, cb[1])), 5020 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_6, 5021 offsetof(struct __sk_buff, cb[2])), 5022 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_7, 5023 offsetof(struct __sk_buff, cb[3])), 5024 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_8, 5025 offsetof(struct __sk_buff, cb[4])), 5026 BPF_MOV64_IMM(BPF_REG_0, 0), 5027 BPF_EXIT_INSN(), 5028 }, 5029 .result = ACCEPT, 5030 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5031 }, 5032 { 5033 "direct packet read test#4 for CGROUP_SKB", 5034 .insns = { 5035 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 5036 offsetof(struct __sk_buff, family)), 5037 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 5038 offsetof(struct __sk_buff, remote_ip4)), 5039 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 5040 offsetof(struct __sk_buff, local_ip4)), 5041 BPF_LDX_MEM(BPF_W, BPF_REG_5, BPF_REG_1, 5042 offsetof(struct __sk_buff, remote_ip6[0])), 5043 BPF_LDX_MEM(BPF_W, BPF_REG_5, BPF_REG_1, 5044 offsetof(struct __sk_buff, remote_ip6[1])), 5045 BPF_LDX_MEM(BPF_W, BPF_REG_5, BPF_REG_1, 5046 offsetof(struct __sk_buff, remote_ip6[2])), 5047 BPF_LDX_MEM(BPF_W, BPF_REG_5, BPF_REG_1, 5048 offsetof(struct __sk_buff, remote_ip6[3])), 5049 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 5050 offsetof(struct __sk_buff, local_ip6[0])), 5051 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 5052 offsetof(struct __sk_buff, local_ip6[1])), 5053 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 5054 offsetof(struct __sk_buff, local_ip6[2])), 5055 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 5056 offsetof(struct __sk_buff, local_ip6[3])), 5057 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 5058 offsetof(struct __sk_buff, remote_port)), 5059 BPF_LDX_MEM(BPF_W, BPF_REG_8, BPF_REG_1, 5060 offsetof(struct __sk_buff, local_port)), 5061 BPF_MOV64_IMM(BPF_REG_0, 0), 5062 BPF_EXIT_INSN(), 5063 }, 5064 .result = ACCEPT, 5065 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5066 }, 5067 { 5068 "invalid access of tc_classid for CGROUP_SKB", 5069 .insns = { 5070 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 5071 offsetof(struct __sk_buff, tc_classid)), 5072 BPF_MOV64_IMM(BPF_REG_0, 0), 5073 BPF_EXIT_INSN(), 5074 }, 5075 .result = REJECT, 5076 .errstr = "invalid bpf_context access", 5077 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5078 }, 5079 { 5080 "invalid access of data_meta for CGROUP_SKB", 5081 .insns = { 5082 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 5083 offsetof(struct __sk_buff, data_meta)), 5084 BPF_MOV64_IMM(BPF_REG_0, 0), 5085 BPF_EXIT_INSN(), 5086 }, 5087 .result = REJECT, 5088 .errstr = "invalid bpf_context access", 5089 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5090 }, 5091 { 5092 "invalid access of flow_keys for CGROUP_SKB", 5093 .insns = { 5094 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 5095 offsetof(struct __sk_buff, flow_keys)), 5096 BPF_MOV64_IMM(BPF_REG_0, 0), 5097 BPF_EXIT_INSN(), 5098 }, 5099 .result = REJECT, 5100 .errstr = "invalid bpf_context access", 5101 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5102 }, 5103 { 5104 "invalid write access to napi_id for CGROUP_SKB", 5105 .insns = { 5106 BPF_LDX_MEM(BPF_W, BPF_REG_9, BPF_REG_1, 5107 offsetof(struct __sk_buff, napi_id)), 5108 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_9, 5109 offsetof(struct __sk_buff, napi_id)), 5110 BPF_MOV64_IMM(BPF_REG_0, 0), 5111 BPF_EXIT_INSN(), 5112 }, 5113 .result = REJECT, 5114 .errstr = "invalid bpf_context access", 5115 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5116 }, 5117 { 5118 "valid cgroup storage access", 5119 .insns = { 5120 BPF_MOV64_IMM(BPF_REG_2, 0), 5121 BPF_LD_MAP_FD(BPF_REG_1, 0), 5122 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5123 BPF_FUNC_get_local_storage), 5124 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5125 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5126 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5127 BPF_EXIT_INSN(), 5128 }, 5129 .fixup_cgroup_storage = { 1 }, 5130 .result = ACCEPT, 5131 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5132 }, 5133 { 5134 "invalid cgroup storage access 1", 5135 .insns = { 5136 BPF_MOV64_IMM(BPF_REG_2, 0), 5137 BPF_LD_MAP_FD(BPF_REG_1, 0), 5138 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5139 BPF_FUNC_get_local_storage), 5140 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5141 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5142 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5143 BPF_EXIT_INSN(), 5144 }, 5145 .fixup_map_hash_8b = { 1 }, 5146 .result = REJECT, 5147 .errstr = "cannot pass map_type 1 into func bpf_get_local_storage", 5148 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5149 }, 5150 { 5151 "invalid cgroup storage access 2", 5152 .insns = { 5153 BPF_MOV64_IMM(BPF_REG_2, 0), 5154 BPF_LD_MAP_FD(BPF_REG_1, 1), 5155 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5156 BPF_FUNC_get_local_storage), 5157 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5158 BPF_EXIT_INSN(), 5159 }, 5160 .result = REJECT, 5161 .errstr = "fd 1 is not pointing to valid bpf_map", 5162 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5163 }, 5164 { 5165 "invalid cgroup storage access 3", 5166 .insns = { 5167 BPF_MOV64_IMM(BPF_REG_2, 0), 5168 BPF_LD_MAP_FD(BPF_REG_1, 0), 5169 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5170 BPF_FUNC_get_local_storage), 5171 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 256), 5172 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 1), 5173 BPF_MOV64_IMM(BPF_REG_0, 0), 5174 BPF_EXIT_INSN(), 5175 }, 5176 .fixup_cgroup_storage = { 1 }, 5177 .result = REJECT, 5178 .errstr = "invalid access to map value, value_size=64 off=256 size=4", 5179 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5180 }, 5181 { 5182 "invalid cgroup storage access 4", 5183 .insns = { 5184 BPF_MOV64_IMM(BPF_REG_2, 0), 5185 BPF_LD_MAP_FD(BPF_REG_1, 0), 5186 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5187 BPF_FUNC_get_local_storage), 5188 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, -2), 5189 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5190 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 1), 5191 BPF_EXIT_INSN(), 5192 }, 5193 .fixup_cgroup_storage = { 1 }, 5194 .result = REJECT, 5195 .errstr = "invalid access to map value, value_size=64 off=-2 size=4", 5196 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5197 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 5198 }, 5199 { 5200 "invalid cgroup storage access 5", 5201 .insns = { 5202 BPF_MOV64_IMM(BPF_REG_2, 7), 5203 BPF_LD_MAP_FD(BPF_REG_1, 0), 5204 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5205 BPF_FUNC_get_local_storage), 5206 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5207 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5208 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5209 BPF_EXIT_INSN(), 5210 }, 5211 .fixup_cgroup_storage = { 1 }, 5212 .result = REJECT, 5213 .errstr = "get_local_storage() doesn't support non-zero flags", 5214 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5215 }, 5216 { 5217 "invalid cgroup storage access 6", 5218 .insns = { 5219 BPF_MOV64_REG(BPF_REG_2, BPF_REG_1), 5220 BPF_LD_MAP_FD(BPF_REG_1, 0), 5221 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5222 BPF_FUNC_get_local_storage), 5223 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5224 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5225 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5226 BPF_EXIT_INSN(), 5227 }, 5228 .fixup_cgroup_storage = { 1 }, 5229 .result = REJECT, 5230 .errstr = "get_local_storage() doesn't support non-zero flags", 5231 .errstr_unpriv = "R2 leaks addr into helper function", 5232 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5233 }, 5234 { 5235 "valid per-cpu cgroup storage access", 5236 .insns = { 5237 BPF_MOV64_IMM(BPF_REG_2, 0), 5238 BPF_LD_MAP_FD(BPF_REG_1, 0), 5239 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5240 BPF_FUNC_get_local_storage), 5241 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5242 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5243 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5244 BPF_EXIT_INSN(), 5245 }, 5246 .fixup_percpu_cgroup_storage = { 1 }, 5247 .result = ACCEPT, 5248 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5249 }, 5250 { 5251 "invalid per-cpu cgroup storage access 1", 5252 .insns = { 5253 BPF_MOV64_IMM(BPF_REG_2, 0), 5254 BPF_LD_MAP_FD(BPF_REG_1, 0), 5255 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5256 BPF_FUNC_get_local_storage), 5257 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5258 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5259 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5260 BPF_EXIT_INSN(), 5261 }, 5262 .fixup_map_hash_8b = { 1 }, 5263 .result = REJECT, 5264 .errstr = "cannot pass map_type 1 into func bpf_get_local_storage", 5265 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5266 }, 5267 { 5268 "invalid per-cpu cgroup storage access 2", 5269 .insns = { 5270 BPF_MOV64_IMM(BPF_REG_2, 0), 5271 BPF_LD_MAP_FD(BPF_REG_1, 1), 5272 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5273 BPF_FUNC_get_local_storage), 5274 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5275 BPF_EXIT_INSN(), 5276 }, 5277 .result = REJECT, 5278 .errstr = "fd 1 is not pointing to valid bpf_map", 5279 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5280 }, 5281 { 5282 "invalid per-cpu cgroup storage access 3", 5283 .insns = { 5284 BPF_MOV64_IMM(BPF_REG_2, 0), 5285 BPF_LD_MAP_FD(BPF_REG_1, 0), 5286 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5287 BPF_FUNC_get_local_storage), 5288 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 256), 5289 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 1), 5290 BPF_MOV64_IMM(BPF_REG_0, 0), 5291 BPF_EXIT_INSN(), 5292 }, 5293 .fixup_percpu_cgroup_storage = { 1 }, 5294 .result = REJECT, 5295 .errstr = "invalid access to map value, value_size=64 off=256 size=4", 5296 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5297 }, 5298 { 5299 "invalid per-cpu cgroup storage access 4", 5300 .insns = { 5301 BPF_MOV64_IMM(BPF_REG_2, 0), 5302 BPF_LD_MAP_FD(BPF_REG_1, 0), 5303 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5304 BPF_FUNC_get_local_storage), 5305 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, -2), 5306 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5307 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 1), 5308 BPF_EXIT_INSN(), 5309 }, 5310 .fixup_cgroup_storage = { 1 }, 5311 .result = REJECT, 5312 .errstr = "invalid access to map value, value_size=64 off=-2 size=4", 5313 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5314 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 5315 }, 5316 { 5317 "invalid per-cpu cgroup storage access 5", 5318 .insns = { 5319 BPF_MOV64_IMM(BPF_REG_2, 7), 5320 BPF_LD_MAP_FD(BPF_REG_1, 0), 5321 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5322 BPF_FUNC_get_local_storage), 5323 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5324 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5325 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5326 BPF_EXIT_INSN(), 5327 }, 5328 .fixup_percpu_cgroup_storage = { 1 }, 5329 .result = REJECT, 5330 .errstr = "get_local_storage() doesn't support non-zero flags", 5331 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5332 }, 5333 { 5334 "invalid per-cpu cgroup storage access 6", 5335 .insns = { 5336 BPF_MOV64_REG(BPF_REG_2, BPF_REG_1), 5337 BPF_LD_MAP_FD(BPF_REG_1, 0), 5338 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5339 BPF_FUNC_get_local_storage), 5340 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5341 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5342 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5343 BPF_EXIT_INSN(), 5344 }, 5345 .fixup_percpu_cgroup_storage = { 1 }, 5346 .result = REJECT, 5347 .errstr = "get_local_storage() doesn't support non-zero flags", 5348 .errstr_unpriv = "R2 leaks addr into helper function", 5349 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5350 }, 5351 { 5352 "write tstamp from CGROUP_SKB", 5353 .insns = { 5354 BPF_MOV64_IMM(BPF_REG_0, 0), 5355 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 5356 offsetof(struct __sk_buff, tstamp)), 5357 BPF_MOV64_IMM(BPF_REG_0, 0), 5358 BPF_EXIT_INSN(), 5359 }, 5360 .result = ACCEPT, 5361 .result_unpriv = REJECT, 5362 .errstr_unpriv = "invalid bpf_context access off=152 size=8", 5363 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5364 }, 5365 { 5366 "read tstamp from CGROUP_SKB", 5367 .insns = { 5368 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 5369 offsetof(struct __sk_buff, tstamp)), 5370 BPF_MOV64_IMM(BPF_REG_0, 0), 5371 BPF_EXIT_INSN(), 5372 }, 5373 .result = ACCEPT, 5374 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5375 }, 5376 { 5377 "multiple registers share map_lookup_elem result", 5378 .insns = { 5379 BPF_MOV64_IMM(BPF_REG_1, 10), 5380 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 5381 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5382 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5383 BPF_LD_MAP_FD(BPF_REG_1, 0), 5384 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5385 BPF_FUNC_map_lookup_elem), 5386 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 5387 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 5388 BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0), 5389 BPF_EXIT_INSN(), 5390 }, 5391 .fixup_map_hash_8b = { 4 }, 5392 .result = ACCEPT, 5393 .prog_type = BPF_PROG_TYPE_SCHED_CLS 5394 }, 5395 { 5396 "alu ops on ptr_to_map_value_or_null, 1", 5397 .insns = { 5398 BPF_MOV64_IMM(BPF_REG_1, 10), 5399 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 5400 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5401 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5402 BPF_LD_MAP_FD(BPF_REG_1, 0), 5403 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5404 BPF_FUNC_map_lookup_elem), 5405 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 5406 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -2), 5407 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 2), 5408 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 5409 BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0), 5410 BPF_EXIT_INSN(), 5411 }, 5412 .fixup_map_hash_8b = { 4 }, 5413 .errstr = "R4 pointer arithmetic on map_value_or_null", 5414 .result = REJECT, 5415 .prog_type = BPF_PROG_TYPE_SCHED_CLS 5416 }, 5417 { 5418 "alu ops on ptr_to_map_value_or_null, 2", 5419 .insns = { 5420 BPF_MOV64_IMM(BPF_REG_1, 10), 5421 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 5422 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5423 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5424 BPF_LD_MAP_FD(BPF_REG_1, 0), 5425 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5426 BPF_FUNC_map_lookup_elem), 5427 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 5428 BPF_ALU64_IMM(BPF_AND, BPF_REG_4, -1), 5429 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 5430 BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0), 5431 BPF_EXIT_INSN(), 5432 }, 5433 .fixup_map_hash_8b = { 4 }, 5434 .errstr = "R4 pointer arithmetic on map_value_or_null", 5435 .result = REJECT, 5436 .prog_type = BPF_PROG_TYPE_SCHED_CLS 5437 }, 5438 { 5439 "alu ops on ptr_to_map_value_or_null, 3", 5440 .insns = { 5441 BPF_MOV64_IMM(BPF_REG_1, 10), 5442 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 5443 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5444 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5445 BPF_LD_MAP_FD(BPF_REG_1, 0), 5446 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5447 BPF_FUNC_map_lookup_elem), 5448 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 5449 BPF_ALU64_IMM(BPF_LSH, BPF_REG_4, 1), 5450 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 5451 BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0), 5452 BPF_EXIT_INSN(), 5453 }, 5454 .fixup_map_hash_8b = { 4 }, 5455 .errstr = "R4 pointer arithmetic on map_value_or_null", 5456 .result = REJECT, 5457 .prog_type = BPF_PROG_TYPE_SCHED_CLS 5458 }, 5459 { 5460 "invalid memory access with multiple map_lookup_elem calls", 5461 .insns = { 5462 BPF_MOV64_IMM(BPF_REG_1, 10), 5463 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 5464 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5465 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5466 BPF_LD_MAP_FD(BPF_REG_1, 0), 5467 BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 5468 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 5469 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5470 BPF_FUNC_map_lookup_elem), 5471 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 5472 BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 5473 BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 5474 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5475 BPF_FUNC_map_lookup_elem), 5476 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 5477 BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0), 5478 BPF_EXIT_INSN(), 5479 }, 5480 .fixup_map_hash_8b = { 4 }, 5481 .result = REJECT, 5482 .errstr = "R4 !read_ok", 5483 .prog_type = BPF_PROG_TYPE_SCHED_CLS 5484 }, 5485 { 5486 "valid indirect map_lookup_elem access with 2nd lookup in branch", 5487 .insns = { 5488 BPF_MOV64_IMM(BPF_REG_1, 10), 5489 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 5490 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5491 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5492 BPF_LD_MAP_FD(BPF_REG_1, 0), 5493 BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 5494 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 5495 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5496 BPF_FUNC_map_lookup_elem), 5497 BPF_MOV64_IMM(BPF_REG_2, 10), 5498 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0, 3), 5499 BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 5500 BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 5501 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5502 BPF_FUNC_map_lookup_elem), 5503 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 5504 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 5505 BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0), 5506 BPF_EXIT_INSN(), 5507 }, 5508 .fixup_map_hash_8b = { 4 }, 5509 .result = ACCEPT, 5510 .prog_type = BPF_PROG_TYPE_SCHED_CLS 5511 }, 5512 { 5513 "invalid map access from else condition", 5514 .insns = { 5515 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 5516 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5517 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5518 BPF_LD_MAP_FD(BPF_REG_1, 0), 5519 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem), 5520 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 5521 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5522 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, MAX_ENTRIES-1, 1), 5523 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 1), 5524 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2), 5525 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5526 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, offsetof(struct test_val, foo)), 5527 BPF_EXIT_INSN(), 5528 }, 5529 .fixup_map_hash_48b = { 3 }, 5530 .errstr = "R0 unbounded memory access", 5531 .result = REJECT, 5532 .errstr_unpriv = "R0 leaks addr", 5533 .result_unpriv = REJECT, 5534 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 5535 }, 5536 { 5537 "constant register |= constant should keep constant type", 5538 .insns = { 5539 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 5540 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48), 5541 BPF_MOV64_IMM(BPF_REG_2, 34), 5542 BPF_ALU64_IMM(BPF_OR, BPF_REG_2, 13), 5543 BPF_MOV64_IMM(BPF_REG_3, 0), 5544 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5545 BPF_EXIT_INSN(), 5546 }, 5547 .result = ACCEPT, 5548 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5549 }, 5550 { 5551 "constant register |= constant should not bypass stack boundary checks", 5552 .insns = { 5553 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 5554 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48), 5555 BPF_MOV64_IMM(BPF_REG_2, 34), 5556 BPF_ALU64_IMM(BPF_OR, BPF_REG_2, 24), 5557 BPF_MOV64_IMM(BPF_REG_3, 0), 5558 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5559 BPF_EXIT_INSN(), 5560 }, 5561 .errstr = "invalid stack type R1 off=-48 access_size=58", 5562 .result = REJECT, 5563 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5564 }, 5565 { 5566 "constant register |= constant register should keep constant type", 5567 .insns = { 5568 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 5569 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48), 5570 BPF_MOV64_IMM(BPF_REG_2, 34), 5571 BPF_MOV64_IMM(BPF_REG_4, 13), 5572 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_4), 5573 BPF_MOV64_IMM(BPF_REG_3, 0), 5574 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5575 BPF_EXIT_INSN(), 5576 }, 5577 .result = ACCEPT, 5578 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5579 }, 5580 { 5581 "constant register |= constant register should not bypass stack boundary checks", 5582 .insns = { 5583 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 5584 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48), 5585 BPF_MOV64_IMM(BPF_REG_2, 34), 5586 BPF_MOV64_IMM(BPF_REG_4, 24), 5587 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_4), 5588 BPF_MOV64_IMM(BPF_REG_3, 0), 5589 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5590 BPF_EXIT_INSN(), 5591 }, 5592 .errstr = "invalid stack type R1 off=-48 access_size=58", 5593 .result = REJECT, 5594 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5595 }, 5596 { 5597 "invalid direct packet write for LWT_IN", 5598 .insns = { 5599 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 5600 offsetof(struct __sk_buff, data)), 5601 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 5602 offsetof(struct __sk_buff, data_end)), 5603 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 5604 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 5605 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 5606 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 5607 BPF_MOV64_IMM(BPF_REG_0, 0), 5608 BPF_EXIT_INSN(), 5609 }, 5610 .errstr = "cannot write into packet", 5611 .result = REJECT, 5612 .prog_type = BPF_PROG_TYPE_LWT_IN, 5613 }, 5614 { 5615 "invalid direct packet write for LWT_OUT", 5616 .insns = { 5617 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 5618 offsetof(struct __sk_buff, data)), 5619 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 5620 offsetof(struct __sk_buff, data_end)), 5621 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 5622 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 5623 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 5624 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 5625 BPF_MOV64_IMM(BPF_REG_0, 0), 5626 BPF_EXIT_INSN(), 5627 }, 5628 .errstr = "cannot write into packet", 5629 .result = REJECT, 5630 .prog_type = BPF_PROG_TYPE_LWT_OUT, 5631 }, 5632 { 5633 "direct packet write for LWT_XMIT", 5634 .insns = { 5635 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 5636 offsetof(struct __sk_buff, data)), 5637 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 5638 offsetof(struct __sk_buff, data_end)), 5639 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 5640 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 5641 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 5642 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 5643 BPF_MOV64_IMM(BPF_REG_0, 0), 5644 BPF_EXIT_INSN(), 5645 }, 5646 .result = ACCEPT, 5647 .prog_type = BPF_PROG_TYPE_LWT_XMIT, 5648 }, 5649 { 5650 "direct packet read for LWT_IN", 5651 .insns = { 5652 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 5653 offsetof(struct __sk_buff, data)), 5654 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 5655 offsetof(struct __sk_buff, data_end)), 5656 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 5657 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 5658 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 5659 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 5660 BPF_MOV64_IMM(BPF_REG_0, 0), 5661 BPF_EXIT_INSN(), 5662 }, 5663 .result = ACCEPT, 5664 .prog_type = BPF_PROG_TYPE_LWT_IN, 5665 }, 5666 { 5667 "direct packet read for LWT_OUT", 5668 .insns = { 5669 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 5670 offsetof(struct __sk_buff, data)), 5671 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 5672 offsetof(struct __sk_buff, data_end)), 5673 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 5674 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 5675 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 5676 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 5677 BPF_MOV64_IMM(BPF_REG_0, 0), 5678 BPF_EXIT_INSN(), 5679 }, 5680 .result = ACCEPT, 5681 .prog_type = BPF_PROG_TYPE_LWT_OUT, 5682 }, 5683 { 5684 "direct packet read for LWT_XMIT", 5685 .insns = { 5686 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 5687 offsetof(struct __sk_buff, data)), 5688 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 5689 offsetof(struct __sk_buff, data_end)), 5690 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 5691 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 5692 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 5693 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 5694 BPF_MOV64_IMM(BPF_REG_0, 0), 5695 BPF_EXIT_INSN(), 5696 }, 5697 .result = ACCEPT, 5698 .prog_type = BPF_PROG_TYPE_LWT_XMIT, 5699 }, 5700 { 5701 "overlapping checks for direct packet access", 5702 .insns = { 5703 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 5704 offsetof(struct __sk_buff, data)), 5705 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 5706 offsetof(struct __sk_buff, data_end)), 5707 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 5708 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 5709 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 4), 5710 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 5711 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6), 5712 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 5713 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_2, 6), 5714 BPF_MOV64_IMM(BPF_REG_0, 0), 5715 BPF_EXIT_INSN(), 5716 }, 5717 .result = ACCEPT, 5718 .prog_type = BPF_PROG_TYPE_LWT_XMIT, 5719 }, 5720 { 5721 "make headroom for LWT_XMIT", 5722 .insns = { 5723 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 5724 BPF_MOV64_IMM(BPF_REG_2, 34), 5725 BPF_MOV64_IMM(BPF_REG_3, 0), 5726 BPF_EMIT_CALL(BPF_FUNC_skb_change_head), 5727 /* split for s390 to succeed */ 5728 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 5729 BPF_MOV64_IMM(BPF_REG_2, 42), 5730 BPF_MOV64_IMM(BPF_REG_3, 0), 5731 BPF_EMIT_CALL(BPF_FUNC_skb_change_head), 5732 BPF_MOV64_IMM(BPF_REG_0, 0), 5733 BPF_EXIT_INSN(), 5734 }, 5735 .result = ACCEPT, 5736 .prog_type = BPF_PROG_TYPE_LWT_XMIT, 5737 }, 5738 { 5739 "invalid access of tc_classid for LWT_IN", 5740 .insns = { 5741 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 5742 offsetof(struct __sk_buff, tc_classid)), 5743 BPF_EXIT_INSN(), 5744 }, 5745 .result = REJECT, 5746 .errstr = "invalid bpf_context access", 5747 }, 5748 { 5749 "invalid access of tc_classid for LWT_OUT", 5750 .insns = { 5751 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 5752 offsetof(struct __sk_buff, tc_classid)), 5753 BPF_EXIT_INSN(), 5754 }, 5755 .result = REJECT, 5756 .errstr = "invalid bpf_context access", 5757 }, 5758 { 5759 "invalid access of tc_classid for LWT_XMIT", 5760 .insns = { 5761 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 5762 offsetof(struct __sk_buff, tc_classid)), 5763 BPF_EXIT_INSN(), 5764 }, 5765 .result = REJECT, 5766 .errstr = "invalid bpf_context access", 5767 }, 5768 { 5769 "leak pointer into ctx 1", 5770 .insns = { 5771 BPF_MOV64_IMM(BPF_REG_0, 0), 5772 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 5773 offsetof(struct __sk_buff, cb[0])), 5774 BPF_LD_MAP_FD(BPF_REG_2, 0), 5775 BPF_STX_XADD(BPF_DW, BPF_REG_1, BPF_REG_2, 5776 offsetof(struct __sk_buff, cb[0])), 5777 BPF_EXIT_INSN(), 5778 }, 5779 .fixup_map_hash_8b = { 2 }, 5780 .errstr_unpriv = "R2 leaks addr into mem", 5781 .result_unpriv = REJECT, 5782 .result = REJECT, 5783 .errstr = "BPF_XADD stores into R1 ctx is not allowed", 5784 }, 5785 { 5786 "leak pointer into ctx 2", 5787 .insns = { 5788 BPF_MOV64_IMM(BPF_REG_0, 0), 5789 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 5790 offsetof(struct __sk_buff, cb[0])), 5791 BPF_STX_XADD(BPF_DW, BPF_REG_1, BPF_REG_10, 5792 offsetof(struct __sk_buff, cb[0])), 5793 BPF_EXIT_INSN(), 5794 }, 5795 .errstr_unpriv = "R10 leaks addr into mem", 5796 .result_unpriv = REJECT, 5797 .result = REJECT, 5798 .errstr = "BPF_XADD stores into R1 ctx is not allowed", 5799 }, 5800 { 5801 "leak pointer into ctx 3", 5802 .insns = { 5803 BPF_MOV64_IMM(BPF_REG_0, 0), 5804 BPF_LD_MAP_FD(BPF_REG_2, 0), 5805 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, 5806 offsetof(struct __sk_buff, cb[0])), 5807 BPF_EXIT_INSN(), 5808 }, 5809 .fixup_map_hash_8b = { 1 }, 5810 .errstr_unpriv = "R2 leaks addr into ctx", 5811 .result_unpriv = REJECT, 5812 .result = ACCEPT, 5813 }, 5814 { 5815 "leak pointer into map val", 5816 .insns = { 5817 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 5818 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 5819 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5820 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5821 BPF_LD_MAP_FD(BPF_REG_1, 0), 5822 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5823 BPF_FUNC_map_lookup_elem), 5824 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 5825 BPF_MOV64_IMM(BPF_REG_3, 0), 5826 BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 5827 BPF_STX_XADD(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 5828 BPF_MOV64_IMM(BPF_REG_0, 0), 5829 BPF_EXIT_INSN(), 5830 }, 5831 .fixup_map_hash_8b = { 4 }, 5832 .errstr_unpriv = "R6 leaks addr into mem", 5833 .result_unpriv = REJECT, 5834 .result = ACCEPT, 5835 }, 5836 { 5837 "helper access to map: full range", 5838 .insns = { 5839 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5840 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5841 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5842 BPF_LD_MAP_FD(BPF_REG_1, 0), 5843 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5844 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 5845 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5846 BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)), 5847 BPF_MOV64_IMM(BPF_REG_3, 0), 5848 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5849 BPF_EXIT_INSN(), 5850 }, 5851 .fixup_map_hash_48b = { 3 }, 5852 .result = ACCEPT, 5853 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5854 }, 5855 { 5856 "helper access to map: partial range", 5857 .insns = { 5858 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5859 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5860 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5861 BPF_LD_MAP_FD(BPF_REG_1, 0), 5862 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5863 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 5864 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5865 BPF_MOV64_IMM(BPF_REG_2, 8), 5866 BPF_MOV64_IMM(BPF_REG_3, 0), 5867 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5868 BPF_EXIT_INSN(), 5869 }, 5870 .fixup_map_hash_48b = { 3 }, 5871 .result = ACCEPT, 5872 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5873 }, 5874 { 5875 "helper access to map: empty range", 5876 .insns = { 5877 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5878 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5879 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5880 BPF_LD_MAP_FD(BPF_REG_1, 0), 5881 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5882 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 5883 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5884 BPF_MOV64_IMM(BPF_REG_2, 0), 5885 BPF_EMIT_CALL(BPF_FUNC_trace_printk), 5886 BPF_EXIT_INSN(), 5887 }, 5888 .fixup_map_hash_48b = { 3 }, 5889 .errstr = "invalid access to map value, value_size=48 off=0 size=0", 5890 .result = REJECT, 5891 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5892 }, 5893 { 5894 "helper access to map: out-of-bound range", 5895 .insns = { 5896 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5897 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5898 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5899 BPF_LD_MAP_FD(BPF_REG_1, 0), 5900 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5901 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 5902 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5903 BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val) + 8), 5904 BPF_MOV64_IMM(BPF_REG_3, 0), 5905 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5906 BPF_EXIT_INSN(), 5907 }, 5908 .fixup_map_hash_48b = { 3 }, 5909 .errstr = "invalid access to map value, value_size=48 off=0 size=56", 5910 .result = REJECT, 5911 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5912 }, 5913 { 5914 "helper access to map: negative range", 5915 .insns = { 5916 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5917 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5918 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5919 BPF_LD_MAP_FD(BPF_REG_1, 0), 5920 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5921 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 5922 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5923 BPF_MOV64_IMM(BPF_REG_2, -8), 5924 BPF_MOV64_IMM(BPF_REG_3, 0), 5925 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5926 BPF_EXIT_INSN(), 5927 }, 5928 .fixup_map_hash_48b = { 3 }, 5929 .errstr = "R2 min value is negative", 5930 .result = REJECT, 5931 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5932 }, 5933 { 5934 "helper access to adjusted map (via const imm): full range", 5935 .insns = { 5936 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5937 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5938 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5939 BPF_LD_MAP_FD(BPF_REG_1, 0), 5940 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5941 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 5942 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5943 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 5944 offsetof(struct test_val, foo)), 5945 BPF_MOV64_IMM(BPF_REG_2, 5946 sizeof(struct test_val) - 5947 offsetof(struct test_val, foo)), 5948 BPF_MOV64_IMM(BPF_REG_3, 0), 5949 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5950 BPF_EXIT_INSN(), 5951 }, 5952 .fixup_map_hash_48b = { 3 }, 5953 .result = ACCEPT, 5954 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5955 }, 5956 { 5957 "helper access to adjusted map (via const imm): partial range", 5958 .insns = { 5959 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5960 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5961 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5962 BPF_LD_MAP_FD(BPF_REG_1, 0), 5963 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5964 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 5965 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5966 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 5967 offsetof(struct test_val, foo)), 5968 BPF_MOV64_IMM(BPF_REG_2, 8), 5969 BPF_MOV64_IMM(BPF_REG_3, 0), 5970 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5971 BPF_EXIT_INSN(), 5972 }, 5973 .fixup_map_hash_48b = { 3 }, 5974 .result = ACCEPT, 5975 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5976 }, 5977 { 5978 "helper access to adjusted map (via const imm): empty range", 5979 .insns = { 5980 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5981 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5982 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5983 BPF_LD_MAP_FD(BPF_REG_1, 0), 5984 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5985 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 5986 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5987 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 5988 offsetof(struct test_val, foo)), 5989 BPF_MOV64_IMM(BPF_REG_2, 0), 5990 BPF_EMIT_CALL(BPF_FUNC_trace_printk), 5991 BPF_EXIT_INSN(), 5992 }, 5993 .fixup_map_hash_48b = { 3 }, 5994 .errstr = "invalid access to map value, value_size=48 off=4 size=0", 5995 .result = REJECT, 5996 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5997 }, 5998 { 5999 "helper access to adjusted map (via const imm): out-of-bound range", 6000 .insns = { 6001 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6002 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6003 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6004 BPF_LD_MAP_FD(BPF_REG_1, 0), 6005 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6006 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 6007 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6008 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6009 offsetof(struct test_val, foo)), 6010 BPF_MOV64_IMM(BPF_REG_2, 6011 sizeof(struct test_val) - 6012 offsetof(struct test_val, foo) + 8), 6013 BPF_MOV64_IMM(BPF_REG_3, 0), 6014 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6015 BPF_EXIT_INSN(), 6016 }, 6017 .fixup_map_hash_48b = { 3 }, 6018 .errstr = "invalid access to map value, value_size=48 off=4 size=52", 6019 .result = REJECT, 6020 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6021 }, 6022 { 6023 "helper access to adjusted map (via const imm): negative range (> adjustment)", 6024 .insns = { 6025 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6026 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6027 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6028 BPF_LD_MAP_FD(BPF_REG_1, 0), 6029 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6030 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 6031 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6032 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6033 offsetof(struct test_val, foo)), 6034 BPF_MOV64_IMM(BPF_REG_2, -8), 6035 BPF_MOV64_IMM(BPF_REG_3, 0), 6036 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6037 BPF_EXIT_INSN(), 6038 }, 6039 .fixup_map_hash_48b = { 3 }, 6040 .errstr = "R2 min value is negative", 6041 .result = REJECT, 6042 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6043 }, 6044 { 6045 "helper access to adjusted map (via const imm): negative range (< adjustment)", 6046 .insns = { 6047 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6048 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6049 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6050 BPF_LD_MAP_FD(BPF_REG_1, 0), 6051 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6052 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 6053 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6054 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6055 offsetof(struct test_val, foo)), 6056 BPF_MOV64_IMM(BPF_REG_2, -1), 6057 BPF_MOV64_IMM(BPF_REG_3, 0), 6058 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6059 BPF_EXIT_INSN(), 6060 }, 6061 .fixup_map_hash_48b = { 3 }, 6062 .errstr = "R2 min value is negative", 6063 .result = REJECT, 6064 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6065 }, 6066 { 6067 "helper access to adjusted map (via const reg): full range", 6068 .insns = { 6069 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6070 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6071 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6072 BPF_LD_MAP_FD(BPF_REG_1, 0), 6073 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6074 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6075 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6076 BPF_MOV64_IMM(BPF_REG_3, 6077 offsetof(struct test_val, foo)), 6078 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6079 BPF_MOV64_IMM(BPF_REG_2, 6080 sizeof(struct test_val) - 6081 offsetof(struct test_val, foo)), 6082 BPF_MOV64_IMM(BPF_REG_3, 0), 6083 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6084 BPF_EXIT_INSN(), 6085 }, 6086 .fixup_map_hash_48b = { 3 }, 6087 .result = ACCEPT, 6088 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6089 }, 6090 { 6091 "helper access to adjusted map (via const reg): partial range", 6092 .insns = { 6093 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6094 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6095 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6096 BPF_LD_MAP_FD(BPF_REG_1, 0), 6097 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6098 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6099 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6100 BPF_MOV64_IMM(BPF_REG_3, 6101 offsetof(struct test_val, foo)), 6102 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6103 BPF_MOV64_IMM(BPF_REG_2, 8), 6104 BPF_MOV64_IMM(BPF_REG_3, 0), 6105 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6106 BPF_EXIT_INSN(), 6107 }, 6108 .fixup_map_hash_48b = { 3 }, 6109 .result = ACCEPT, 6110 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6111 }, 6112 { 6113 "helper access to adjusted map (via const reg): empty range", 6114 .insns = { 6115 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6116 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6117 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6118 BPF_LD_MAP_FD(BPF_REG_1, 0), 6119 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6120 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 6121 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6122 BPF_MOV64_IMM(BPF_REG_3, 0), 6123 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6124 BPF_MOV64_IMM(BPF_REG_2, 0), 6125 BPF_EMIT_CALL(BPF_FUNC_trace_printk), 6126 BPF_EXIT_INSN(), 6127 }, 6128 .fixup_map_hash_48b = { 3 }, 6129 .errstr = "R1 min value is outside of the array range", 6130 .result = REJECT, 6131 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6132 }, 6133 { 6134 "helper access to adjusted map (via const reg): out-of-bound range", 6135 .insns = { 6136 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6137 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6138 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6139 BPF_LD_MAP_FD(BPF_REG_1, 0), 6140 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6141 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6142 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6143 BPF_MOV64_IMM(BPF_REG_3, 6144 offsetof(struct test_val, foo)), 6145 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6146 BPF_MOV64_IMM(BPF_REG_2, 6147 sizeof(struct test_val) - 6148 offsetof(struct test_val, foo) + 8), 6149 BPF_MOV64_IMM(BPF_REG_3, 0), 6150 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6151 BPF_EXIT_INSN(), 6152 }, 6153 .fixup_map_hash_48b = { 3 }, 6154 .errstr = "invalid access to map value, value_size=48 off=4 size=52", 6155 .result = REJECT, 6156 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6157 }, 6158 { 6159 "helper access to adjusted map (via const reg): negative range (> adjustment)", 6160 .insns = { 6161 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6162 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6163 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6164 BPF_LD_MAP_FD(BPF_REG_1, 0), 6165 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6166 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6167 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6168 BPF_MOV64_IMM(BPF_REG_3, 6169 offsetof(struct test_val, foo)), 6170 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6171 BPF_MOV64_IMM(BPF_REG_2, -8), 6172 BPF_MOV64_IMM(BPF_REG_3, 0), 6173 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6174 BPF_EXIT_INSN(), 6175 }, 6176 .fixup_map_hash_48b = { 3 }, 6177 .errstr = "R2 min value is negative", 6178 .result = REJECT, 6179 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6180 }, 6181 { 6182 "helper access to adjusted map (via const reg): negative range (< adjustment)", 6183 .insns = { 6184 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6185 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6186 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6187 BPF_LD_MAP_FD(BPF_REG_1, 0), 6188 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6189 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6190 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6191 BPF_MOV64_IMM(BPF_REG_3, 6192 offsetof(struct test_val, foo)), 6193 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6194 BPF_MOV64_IMM(BPF_REG_2, -1), 6195 BPF_MOV64_IMM(BPF_REG_3, 0), 6196 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6197 BPF_EXIT_INSN(), 6198 }, 6199 .fixup_map_hash_48b = { 3 }, 6200 .errstr = "R2 min value is negative", 6201 .result = REJECT, 6202 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6203 }, 6204 { 6205 "helper access to adjusted map (via variable): full range", 6206 .insns = { 6207 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6208 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6209 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6210 BPF_LD_MAP_FD(BPF_REG_1, 0), 6211 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6212 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 6213 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6214 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6215 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 6216 offsetof(struct test_val, foo), 4), 6217 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6218 BPF_MOV64_IMM(BPF_REG_2, 6219 sizeof(struct test_val) - 6220 offsetof(struct test_val, foo)), 6221 BPF_MOV64_IMM(BPF_REG_3, 0), 6222 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6223 BPF_EXIT_INSN(), 6224 }, 6225 .fixup_map_hash_48b = { 3 }, 6226 .result = ACCEPT, 6227 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6228 }, 6229 { 6230 "helper access to adjusted map (via variable): partial range", 6231 .insns = { 6232 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6233 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6234 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6235 BPF_LD_MAP_FD(BPF_REG_1, 0), 6236 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6237 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 6238 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6239 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6240 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 6241 offsetof(struct test_val, foo), 4), 6242 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6243 BPF_MOV64_IMM(BPF_REG_2, 8), 6244 BPF_MOV64_IMM(BPF_REG_3, 0), 6245 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6246 BPF_EXIT_INSN(), 6247 }, 6248 .fixup_map_hash_48b = { 3 }, 6249 .result = ACCEPT, 6250 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6251 }, 6252 { 6253 "helper access to adjusted map (via variable): empty range", 6254 .insns = { 6255 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6256 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6257 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6258 BPF_LD_MAP_FD(BPF_REG_1, 0), 6259 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6260 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6261 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6262 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6263 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 6264 offsetof(struct test_val, foo), 3), 6265 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6266 BPF_MOV64_IMM(BPF_REG_2, 0), 6267 BPF_EMIT_CALL(BPF_FUNC_trace_printk), 6268 BPF_EXIT_INSN(), 6269 }, 6270 .fixup_map_hash_48b = { 3 }, 6271 .errstr = "R1 min value is outside of the array range", 6272 .result = REJECT, 6273 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6274 }, 6275 { 6276 "helper access to adjusted map (via variable): no max check", 6277 .insns = { 6278 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6279 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6280 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6281 BPF_LD_MAP_FD(BPF_REG_1, 0), 6282 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6283 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6284 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6285 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6286 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6287 BPF_MOV64_IMM(BPF_REG_2, 1), 6288 BPF_MOV64_IMM(BPF_REG_3, 0), 6289 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6290 BPF_EXIT_INSN(), 6291 }, 6292 .fixup_map_hash_48b = { 3 }, 6293 .errstr = "R1 unbounded memory access", 6294 .result = REJECT, 6295 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6296 }, 6297 { 6298 "helper access to adjusted map (via variable): wrong max check", 6299 .insns = { 6300 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6301 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6302 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6303 BPF_LD_MAP_FD(BPF_REG_1, 0), 6304 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6305 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 6306 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6307 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6308 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 6309 offsetof(struct test_val, foo), 4), 6310 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6311 BPF_MOV64_IMM(BPF_REG_2, 6312 sizeof(struct test_val) - 6313 offsetof(struct test_val, foo) + 1), 6314 BPF_MOV64_IMM(BPF_REG_3, 0), 6315 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6316 BPF_EXIT_INSN(), 6317 }, 6318 .fixup_map_hash_48b = { 3 }, 6319 .errstr = "invalid access to map value, value_size=48 off=4 size=45", 6320 .result = REJECT, 6321 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6322 }, 6323 { 6324 "helper access to map: bounds check using <, good access", 6325 .insns = { 6326 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6327 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6328 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6329 BPF_LD_MAP_FD(BPF_REG_1, 0), 6330 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6331 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6332 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6333 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6334 BPF_JMP_IMM(BPF_JLT, BPF_REG_3, 32, 2), 6335 BPF_MOV64_IMM(BPF_REG_0, 0), 6336 BPF_EXIT_INSN(), 6337 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6338 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6339 BPF_MOV64_IMM(BPF_REG_0, 0), 6340 BPF_EXIT_INSN(), 6341 }, 6342 .fixup_map_hash_48b = { 3 }, 6343 .result = ACCEPT, 6344 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6345 }, 6346 { 6347 "helper access to map: bounds check using <, bad access", 6348 .insns = { 6349 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6350 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6351 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6352 BPF_LD_MAP_FD(BPF_REG_1, 0), 6353 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6354 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6355 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6356 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6357 BPF_JMP_IMM(BPF_JLT, BPF_REG_3, 32, 4), 6358 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6359 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6360 BPF_MOV64_IMM(BPF_REG_0, 0), 6361 BPF_EXIT_INSN(), 6362 BPF_MOV64_IMM(BPF_REG_0, 0), 6363 BPF_EXIT_INSN(), 6364 }, 6365 .fixup_map_hash_48b = { 3 }, 6366 .result = REJECT, 6367 .errstr = "R1 unbounded memory access", 6368 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6369 }, 6370 { 6371 "helper access to map: bounds check using <=, good access", 6372 .insns = { 6373 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6374 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6375 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6376 BPF_LD_MAP_FD(BPF_REG_1, 0), 6377 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6378 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6379 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6380 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6381 BPF_JMP_IMM(BPF_JLE, BPF_REG_3, 32, 2), 6382 BPF_MOV64_IMM(BPF_REG_0, 0), 6383 BPF_EXIT_INSN(), 6384 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6385 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6386 BPF_MOV64_IMM(BPF_REG_0, 0), 6387 BPF_EXIT_INSN(), 6388 }, 6389 .fixup_map_hash_48b = { 3 }, 6390 .result = ACCEPT, 6391 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6392 }, 6393 { 6394 "helper access to map: bounds check using <=, bad access", 6395 .insns = { 6396 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6397 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6398 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6399 BPF_LD_MAP_FD(BPF_REG_1, 0), 6400 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6401 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6402 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6403 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6404 BPF_JMP_IMM(BPF_JLE, BPF_REG_3, 32, 4), 6405 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6406 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6407 BPF_MOV64_IMM(BPF_REG_0, 0), 6408 BPF_EXIT_INSN(), 6409 BPF_MOV64_IMM(BPF_REG_0, 0), 6410 BPF_EXIT_INSN(), 6411 }, 6412 .fixup_map_hash_48b = { 3 }, 6413 .result = REJECT, 6414 .errstr = "R1 unbounded memory access", 6415 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6416 }, 6417 { 6418 "helper access to map: bounds check using s<, good access", 6419 .insns = { 6420 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6421 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6422 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6423 BPF_LD_MAP_FD(BPF_REG_1, 0), 6424 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6425 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6426 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6427 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6428 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 32, 2), 6429 BPF_MOV64_IMM(BPF_REG_0, 0), 6430 BPF_EXIT_INSN(), 6431 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 0, -3), 6432 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6433 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6434 BPF_MOV64_IMM(BPF_REG_0, 0), 6435 BPF_EXIT_INSN(), 6436 }, 6437 .fixup_map_hash_48b = { 3 }, 6438 .result = ACCEPT, 6439 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6440 }, 6441 { 6442 "helper access to map: bounds check using s<, good access 2", 6443 .insns = { 6444 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6445 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6446 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6447 BPF_LD_MAP_FD(BPF_REG_1, 0), 6448 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6449 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6450 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6451 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6452 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 32, 2), 6453 BPF_MOV64_IMM(BPF_REG_0, 0), 6454 BPF_EXIT_INSN(), 6455 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, -3, -3), 6456 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6457 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6458 BPF_MOV64_IMM(BPF_REG_0, 0), 6459 BPF_EXIT_INSN(), 6460 }, 6461 .fixup_map_hash_48b = { 3 }, 6462 .result = ACCEPT, 6463 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6464 }, 6465 { 6466 "helper access to map: bounds check using s<, bad access", 6467 .insns = { 6468 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6469 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6470 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6471 BPF_LD_MAP_FD(BPF_REG_1, 0), 6472 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6473 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6474 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6475 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0), 6476 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 32, 2), 6477 BPF_MOV64_IMM(BPF_REG_0, 0), 6478 BPF_EXIT_INSN(), 6479 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, -3, -3), 6480 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6481 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6482 BPF_MOV64_IMM(BPF_REG_0, 0), 6483 BPF_EXIT_INSN(), 6484 }, 6485 .fixup_map_hash_48b = { 3 }, 6486 .result = REJECT, 6487 .errstr = "R1 min value is negative", 6488 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6489 }, 6490 { 6491 "helper access to map: bounds check using s<=, good access", 6492 .insns = { 6493 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6494 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6495 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6496 BPF_LD_MAP_FD(BPF_REG_1, 0), 6497 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6498 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6499 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6500 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6501 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 32, 2), 6502 BPF_MOV64_IMM(BPF_REG_0, 0), 6503 BPF_EXIT_INSN(), 6504 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 0, -3), 6505 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6506 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6507 BPF_MOV64_IMM(BPF_REG_0, 0), 6508 BPF_EXIT_INSN(), 6509 }, 6510 .fixup_map_hash_48b = { 3 }, 6511 .result = ACCEPT, 6512 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6513 }, 6514 { 6515 "helper access to map: bounds check using s<=, good access 2", 6516 .insns = { 6517 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6518 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6519 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6520 BPF_LD_MAP_FD(BPF_REG_1, 0), 6521 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6522 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6523 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6524 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6525 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 32, 2), 6526 BPF_MOV64_IMM(BPF_REG_0, 0), 6527 BPF_EXIT_INSN(), 6528 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, -3, -3), 6529 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6530 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6531 BPF_MOV64_IMM(BPF_REG_0, 0), 6532 BPF_EXIT_INSN(), 6533 }, 6534 .fixup_map_hash_48b = { 3 }, 6535 .result = ACCEPT, 6536 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6537 }, 6538 { 6539 "helper access to map: bounds check using s<=, bad access", 6540 .insns = { 6541 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6542 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6543 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6544 BPF_LD_MAP_FD(BPF_REG_1, 0), 6545 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6546 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6547 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6548 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0), 6549 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 32, 2), 6550 BPF_MOV64_IMM(BPF_REG_0, 0), 6551 BPF_EXIT_INSN(), 6552 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, -3, -3), 6553 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6554 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6555 BPF_MOV64_IMM(BPF_REG_0, 0), 6556 BPF_EXIT_INSN(), 6557 }, 6558 .fixup_map_hash_48b = { 3 }, 6559 .result = REJECT, 6560 .errstr = "R1 min value is negative", 6561 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6562 }, 6563 { 6564 "map access: known scalar += value_ptr", 6565 .insns = { 6566 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6567 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6568 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6569 BPF_LD_MAP_FD(BPF_REG_1, 0), 6570 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6571 BPF_FUNC_map_lookup_elem), 6572 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 6573 BPF_MOV64_IMM(BPF_REG_1, 4), 6574 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), 6575 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 6576 BPF_MOV64_IMM(BPF_REG_0, 1), 6577 BPF_EXIT_INSN(), 6578 }, 6579 .fixup_map_array_48b = { 3 }, 6580 .result = ACCEPT, 6581 .retval = 1, 6582 }, 6583 { 6584 "map access: value_ptr += known scalar", 6585 .insns = { 6586 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6587 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6588 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6589 BPF_LD_MAP_FD(BPF_REG_1, 0), 6590 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6591 BPF_FUNC_map_lookup_elem), 6592 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 6593 BPF_MOV64_IMM(BPF_REG_1, 4), 6594 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 6595 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 6596 BPF_MOV64_IMM(BPF_REG_0, 1), 6597 BPF_EXIT_INSN(), 6598 }, 6599 .fixup_map_array_48b = { 3 }, 6600 .result = ACCEPT, 6601 .retval = 1, 6602 }, 6603 { 6604 "map access: unknown scalar += value_ptr", 6605 .insns = { 6606 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6607 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6608 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6609 BPF_LD_MAP_FD(BPF_REG_1, 0), 6610 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6611 BPF_FUNC_map_lookup_elem), 6612 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6613 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 6614 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xf), 6615 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), 6616 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 6617 BPF_MOV64_IMM(BPF_REG_0, 1), 6618 BPF_EXIT_INSN(), 6619 }, 6620 .fixup_map_array_48b = { 3 }, 6621 .result = ACCEPT, 6622 .retval = 1, 6623 }, 6624 { 6625 "map access: value_ptr += unknown scalar", 6626 .insns = { 6627 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6628 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6629 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6630 BPF_LD_MAP_FD(BPF_REG_1, 0), 6631 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6632 BPF_FUNC_map_lookup_elem), 6633 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6634 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 6635 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xf), 6636 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 6637 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 6638 BPF_MOV64_IMM(BPF_REG_0, 1), 6639 BPF_EXIT_INSN(), 6640 }, 6641 .fixup_map_array_48b = { 3 }, 6642 .result = ACCEPT, 6643 .retval = 1, 6644 }, 6645 { 6646 "map access: value_ptr += value_ptr", 6647 .insns = { 6648 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6649 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6650 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6651 BPF_LD_MAP_FD(BPF_REG_1, 0), 6652 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6653 BPF_FUNC_map_lookup_elem), 6654 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 6655 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_0), 6656 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 6657 BPF_MOV64_IMM(BPF_REG_0, 1), 6658 BPF_EXIT_INSN(), 6659 }, 6660 .fixup_map_array_48b = { 3 }, 6661 .result = REJECT, 6662 .errstr = "R0 pointer += pointer prohibited", 6663 }, 6664 { 6665 "map access: known scalar -= value_ptr", 6666 .insns = { 6667 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6668 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6669 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6670 BPF_LD_MAP_FD(BPF_REG_1, 0), 6671 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6672 BPF_FUNC_map_lookup_elem), 6673 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 6674 BPF_MOV64_IMM(BPF_REG_1, 4), 6675 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0), 6676 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 6677 BPF_MOV64_IMM(BPF_REG_0, 1), 6678 BPF_EXIT_INSN(), 6679 }, 6680 .fixup_map_array_48b = { 3 }, 6681 .result = REJECT, 6682 .errstr = "R1 tried to subtract pointer from scalar", 6683 }, 6684 { 6685 "map access: value_ptr -= known scalar", 6686 .insns = { 6687 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6688 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6689 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6690 BPF_LD_MAP_FD(BPF_REG_1, 0), 6691 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6692 BPF_FUNC_map_lookup_elem), 6693 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 6694 BPF_MOV64_IMM(BPF_REG_1, 4), 6695 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 6696 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 6697 BPF_MOV64_IMM(BPF_REG_0, 1), 6698 BPF_EXIT_INSN(), 6699 }, 6700 .fixup_map_array_48b = { 3 }, 6701 .result = REJECT, 6702 .errstr = "R0 min value is outside of the array range", 6703 }, 6704 { 6705 "map access: value_ptr -= known scalar, 2", 6706 .insns = { 6707 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6708 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6709 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6710 BPF_LD_MAP_FD(BPF_REG_1, 0), 6711 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6712 BPF_FUNC_map_lookup_elem), 6713 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 6714 BPF_MOV64_IMM(BPF_REG_1, 6), 6715 BPF_MOV64_IMM(BPF_REG_2, 4), 6716 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 6717 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_2), 6718 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 6719 BPF_MOV64_IMM(BPF_REG_0, 1), 6720 BPF_EXIT_INSN(), 6721 }, 6722 .fixup_map_array_48b = { 3 }, 6723 .result = ACCEPT, 6724 .retval = 1, 6725 }, 6726 { 6727 "map access: unknown scalar -= value_ptr", 6728 .insns = { 6729 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6730 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6731 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6732 BPF_LD_MAP_FD(BPF_REG_1, 0), 6733 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6734 BPF_FUNC_map_lookup_elem), 6735 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6736 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 6737 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xf), 6738 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0), 6739 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 6740 BPF_MOV64_IMM(BPF_REG_0, 1), 6741 BPF_EXIT_INSN(), 6742 }, 6743 .fixup_map_array_48b = { 3 }, 6744 .result = REJECT, 6745 .errstr = "R1 tried to subtract pointer from scalar", 6746 }, 6747 { 6748 "map access: value_ptr -= unknown scalar", 6749 .insns = { 6750 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6751 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6752 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6753 BPF_LD_MAP_FD(BPF_REG_1, 0), 6754 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6755 BPF_FUNC_map_lookup_elem), 6756 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6757 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 6758 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xf), 6759 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 6760 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 6761 BPF_MOV64_IMM(BPF_REG_0, 1), 6762 BPF_EXIT_INSN(), 6763 }, 6764 .fixup_map_array_48b = { 3 }, 6765 .result = REJECT, 6766 .errstr = "R0 min value is negative", 6767 }, 6768 { 6769 "map access: value_ptr -= unknown scalar, 2", 6770 .insns = { 6771 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6772 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6773 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6774 BPF_LD_MAP_FD(BPF_REG_1, 0), 6775 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6776 BPF_FUNC_map_lookup_elem), 6777 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8), 6778 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 6779 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xf), 6780 BPF_ALU64_IMM(BPF_OR, BPF_REG_1, 0x7), 6781 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 6782 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 6783 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0x7), 6784 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 6785 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 6786 BPF_MOV64_IMM(BPF_REG_0, 1), 6787 BPF_EXIT_INSN(), 6788 }, 6789 .fixup_map_array_48b = { 3 }, 6790 .result = ACCEPT, 6791 .retval = 1, 6792 }, 6793 { 6794 "map access: value_ptr -= value_ptr", 6795 .insns = { 6796 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6797 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6798 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6799 BPF_LD_MAP_FD(BPF_REG_1, 0), 6800 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6801 BPF_FUNC_map_lookup_elem), 6802 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 6803 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_0), 6804 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 6805 BPF_MOV64_IMM(BPF_REG_0, 1), 6806 BPF_EXIT_INSN(), 6807 }, 6808 .fixup_map_array_48b = { 3 }, 6809 .result = REJECT, 6810 .errstr = "R0 invalid mem access 'inv'", 6811 .errstr_unpriv = "R0 pointer -= pointer prohibited", 6812 }, 6813 { 6814 "map lookup helper access to map", 6815 .insns = { 6816 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6817 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6818 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6819 BPF_LD_MAP_FD(BPF_REG_1, 0), 6820 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6821 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6822 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 6823 BPF_LD_MAP_FD(BPF_REG_1, 0), 6824 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6825 BPF_EXIT_INSN(), 6826 }, 6827 .fixup_map_hash_16b = { 3, 8 }, 6828 .result = ACCEPT, 6829 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6830 }, 6831 { 6832 "map update helper access to map", 6833 .insns = { 6834 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6835 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6836 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6837 BPF_LD_MAP_FD(BPF_REG_1, 0), 6838 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6839 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6840 BPF_MOV64_IMM(BPF_REG_4, 0), 6841 BPF_MOV64_REG(BPF_REG_3, BPF_REG_0), 6842 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 6843 BPF_LD_MAP_FD(BPF_REG_1, 0), 6844 BPF_EMIT_CALL(BPF_FUNC_map_update_elem), 6845 BPF_EXIT_INSN(), 6846 }, 6847 .fixup_map_hash_16b = { 3, 10 }, 6848 .result = ACCEPT, 6849 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6850 }, 6851 { 6852 "map update helper access to map: wrong size", 6853 .insns = { 6854 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6855 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6856 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6857 BPF_LD_MAP_FD(BPF_REG_1, 0), 6858 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6859 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6860 BPF_MOV64_IMM(BPF_REG_4, 0), 6861 BPF_MOV64_REG(BPF_REG_3, BPF_REG_0), 6862 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 6863 BPF_LD_MAP_FD(BPF_REG_1, 0), 6864 BPF_EMIT_CALL(BPF_FUNC_map_update_elem), 6865 BPF_EXIT_INSN(), 6866 }, 6867 .fixup_map_hash_8b = { 3 }, 6868 .fixup_map_hash_16b = { 10 }, 6869 .result = REJECT, 6870 .errstr = "invalid access to map value, value_size=8 off=0 size=16", 6871 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6872 }, 6873 { 6874 "map helper access to adjusted map (via const imm)", 6875 .insns = { 6876 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6877 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6878 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6879 BPF_LD_MAP_FD(BPF_REG_1, 0), 6880 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6881 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 6882 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 6883 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 6884 offsetof(struct other_val, bar)), 6885 BPF_LD_MAP_FD(BPF_REG_1, 0), 6886 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6887 BPF_EXIT_INSN(), 6888 }, 6889 .fixup_map_hash_16b = { 3, 9 }, 6890 .result = ACCEPT, 6891 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6892 }, 6893 { 6894 "map helper access to adjusted map (via const imm): out-of-bound 1", 6895 .insns = { 6896 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6897 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6898 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6899 BPF_LD_MAP_FD(BPF_REG_1, 0), 6900 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6901 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 6902 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 6903 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 6904 sizeof(struct other_val) - 4), 6905 BPF_LD_MAP_FD(BPF_REG_1, 0), 6906 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6907 BPF_EXIT_INSN(), 6908 }, 6909 .fixup_map_hash_16b = { 3, 9 }, 6910 .result = REJECT, 6911 .errstr = "invalid access to map value, value_size=16 off=12 size=8", 6912 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6913 }, 6914 { 6915 "map helper access to adjusted map (via const imm): out-of-bound 2", 6916 .insns = { 6917 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6918 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6919 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6920 BPF_LD_MAP_FD(BPF_REG_1, 0), 6921 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6922 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 6923 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 6924 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 6925 BPF_LD_MAP_FD(BPF_REG_1, 0), 6926 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6927 BPF_EXIT_INSN(), 6928 }, 6929 .fixup_map_hash_16b = { 3, 9 }, 6930 .result = REJECT, 6931 .errstr = "invalid access to map value, value_size=16 off=-4 size=8", 6932 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6933 }, 6934 { 6935 "map helper access to adjusted map (via const reg)", 6936 .insns = { 6937 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6938 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6939 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6940 BPF_LD_MAP_FD(BPF_REG_1, 0), 6941 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6942 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6943 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 6944 BPF_MOV64_IMM(BPF_REG_3, 6945 offsetof(struct other_val, bar)), 6946 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3), 6947 BPF_LD_MAP_FD(BPF_REG_1, 0), 6948 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6949 BPF_EXIT_INSN(), 6950 }, 6951 .fixup_map_hash_16b = { 3, 10 }, 6952 .result = ACCEPT, 6953 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6954 }, 6955 { 6956 "map helper access to adjusted map (via const reg): out-of-bound 1", 6957 .insns = { 6958 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6959 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6960 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6961 BPF_LD_MAP_FD(BPF_REG_1, 0), 6962 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6963 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6964 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 6965 BPF_MOV64_IMM(BPF_REG_3, 6966 sizeof(struct other_val) - 4), 6967 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3), 6968 BPF_LD_MAP_FD(BPF_REG_1, 0), 6969 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6970 BPF_EXIT_INSN(), 6971 }, 6972 .fixup_map_hash_16b = { 3, 10 }, 6973 .result = REJECT, 6974 .errstr = "invalid access to map value, value_size=16 off=12 size=8", 6975 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6976 }, 6977 { 6978 "map helper access to adjusted map (via const reg): out-of-bound 2", 6979 .insns = { 6980 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6981 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6982 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6983 BPF_LD_MAP_FD(BPF_REG_1, 0), 6984 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6985 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6986 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 6987 BPF_MOV64_IMM(BPF_REG_3, -4), 6988 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3), 6989 BPF_LD_MAP_FD(BPF_REG_1, 0), 6990 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6991 BPF_EXIT_INSN(), 6992 }, 6993 .fixup_map_hash_16b = { 3, 10 }, 6994 .result = REJECT, 6995 .errstr = "invalid access to map value, value_size=16 off=-4 size=8", 6996 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6997 }, 6998 { 6999 "map helper access to adjusted map (via variable)", 7000 .insns = { 7001 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7002 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7003 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7004 BPF_LD_MAP_FD(BPF_REG_1, 0), 7005 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7006 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 7007 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7008 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 7009 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 7010 offsetof(struct other_val, bar), 4), 7011 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3), 7012 BPF_LD_MAP_FD(BPF_REG_1, 0), 7013 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7014 BPF_EXIT_INSN(), 7015 }, 7016 .fixup_map_hash_16b = { 3, 11 }, 7017 .result = ACCEPT, 7018 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7019 }, 7020 { 7021 "map helper access to adjusted map (via variable): no max check", 7022 .insns = { 7023 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7024 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7025 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7026 BPF_LD_MAP_FD(BPF_REG_1, 0), 7027 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7028 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 7029 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7030 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 7031 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3), 7032 BPF_LD_MAP_FD(BPF_REG_1, 0), 7033 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7034 BPF_EXIT_INSN(), 7035 }, 7036 .fixup_map_hash_16b = { 3, 10 }, 7037 .result = REJECT, 7038 .errstr = "R2 unbounded memory access, make sure to bounds check any array access into a map", 7039 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7040 }, 7041 { 7042 "map helper access to adjusted map (via variable): wrong max check", 7043 .insns = { 7044 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7045 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7046 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7047 BPF_LD_MAP_FD(BPF_REG_1, 0), 7048 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7049 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 7050 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7051 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 7052 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 7053 offsetof(struct other_val, bar) + 1, 4), 7054 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3), 7055 BPF_LD_MAP_FD(BPF_REG_1, 0), 7056 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7057 BPF_EXIT_INSN(), 7058 }, 7059 .fixup_map_hash_16b = { 3, 11 }, 7060 .result = REJECT, 7061 .errstr = "invalid access to map value, value_size=16 off=9 size=8", 7062 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7063 }, 7064 { 7065 "map element value is preserved across register spilling", 7066 .insns = { 7067 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7068 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7069 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7070 BPF_LD_MAP_FD(BPF_REG_1, 0), 7071 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7072 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 7073 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42), 7074 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 7075 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -184), 7076 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), 7077 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 0), 7078 BPF_ST_MEM(BPF_DW, BPF_REG_3, 0, 42), 7079 BPF_EXIT_INSN(), 7080 }, 7081 .fixup_map_hash_48b = { 3 }, 7082 .errstr_unpriv = "R0 leaks addr", 7083 .result = ACCEPT, 7084 .result_unpriv = REJECT, 7085 }, 7086 { 7087 "map element value or null is marked on register spilling", 7088 .insns = { 7089 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7090 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7091 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7092 BPF_LD_MAP_FD(BPF_REG_1, 0), 7093 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7094 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 7095 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -152), 7096 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), 7097 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 7098 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 0), 7099 BPF_ST_MEM(BPF_DW, BPF_REG_3, 0, 42), 7100 BPF_EXIT_INSN(), 7101 }, 7102 .fixup_map_hash_48b = { 3 }, 7103 .errstr_unpriv = "R0 leaks addr", 7104 .result = ACCEPT, 7105 .result_unpriv = REJECT, 7106 }, 7107 { 7108 "map element value store of cleared call register", 7109 .insns = { 7110 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7111 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7112 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7113 BPF_LD_MAP_FD(BPF_REG_1, 0), 7114 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7115 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 7116 BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 7117 BPF_EXIT_INSN(), 7118 }, 7119 .fixup_map_hash_48b = { 3 }, 7120 .errstr_unpriv = "R1 !read_ok", 7121 .errstr = "R1 !read_ok", 7122 .result = REJECT, 7123 .result_unpriv = REJECT, 7124 }, 7125 { 7126 "map element value with unaligned store", 7127 .insns = { 7128 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7129 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7130 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7131 BPF_LD_MAP_FD(BPF_REG_1, 0), 7132 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7133 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 17), 7134 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 3), 7135 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42), 7136 BPF_ST_MEM(BPF_DW, BPF_REG_0, 2, 43), 7137 BPF_ST_MEM(BPF_DW, BPF_REG_0, -2, 44), 7138 BPF_MOV64_REG(BPF_REG_8, BPF_REG_0), 7139 BPF_ST_MEM(BPF_DW, BPF_REG_8, 0, 32), 7140 BPF_ST_MEM(BPF_DW, BPF_REG_8, 2, 33), 7141 BPF_ST_MEM(BPF_DW, BPF_REG_8, -2, 34), 7142 BPF_ALU64_IMM(BPF_ADD, BPF_REG_8, 5), 7143 BPF_ST_MEM(BPF_DW, BPF_REG_8, 0, 22), 7144 BPF_ST_MEM(BPF_DW, BPF_REG_8, 4, 23), 7145 BPF_ST_MEM(BPF_DW, BPF_REG_8, -7, 24), 7146 BPF_MOV64_REG(BPF_REG_7, BPF_REG_8), 7147 BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, 3), 7148 BPF_ST_MEM(BPF_DW, BPF_REG_7, 0, 22), 7149 BPF_ST_MEM(BPF_DW, BPF_REG_7, 4, 23), 7150 BPF_ST_MEM(BPF_DW, BPF_REG_7, -4, 24), 7151 BPF_EXIT_INSN(), 7152 }, 7153 .fixup_map_hash_48b = { 3 }, 7154 .errstr_unpriv = "R0 leaks addr", 7155 .result = ACCEPT, 7156 .result_unpriv = REJECT, 7157 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 7158 }, 7159 { 7160 "map element value with unaligned load", 7161 .insns = { 7162 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7163 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7164 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7165 BPF_LD_MAP_FD(BPF_REG_1, 0), 7166 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7167 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11), 7168 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 7169 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, MAX_ENTRIES, 9), 7170 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 3), 7171 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 7172 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 2), 7173 BPF_MOV64_REG(BPF_REG_8, BPF_REG_0), 7174 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_8, 0), 7175 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_8, 2), 7176 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 5), 7177 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 7178 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 4), 7179 BPF_EXIT_INSN(), 7180 }, 7181 .fixup_map_hash_48b = { 3 }, 7182 .errstr_unpriv = "R0 leaks addr", 7183 .result = ACCEPT, 7184 .result_unpriv = REJECT, 7185 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 7186 }, 7187 { 7188 "map element value illegal alu op, 1", 7189 .insns = { 7190 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7191 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7192 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7193 BPF_LD_MAP_FD(BPF_REG_1, 0), 7194 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7195 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 7196 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 8), 7197 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22), 7198 BPF_EXIT_INSN(), 7199 }, 7200 .fixup_map_hash_48b = { 3 }, 7201 .errstr = "R0 bitwise operator &= on pointer", 7202 .result = REJECT, 7203 }, 7204 { 7205 "map element value illegal alu op, 2", 7206 .insns = { 7207 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7208 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7209 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7210 BPF_LD_MAP_FD(BPF_REG_1, 0), 7211 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7212 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 7213 BPF_ALU32_IMM(BPF_ADD, BPF_REG_0, 0), 7214 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22), 7215 BPF_EXIT_INSN(), 7216 }, 7217 .fixup_map_hash_48b = { 3 }, 7218 .errstr = "R0 32-bit pointer arithmetic prohibited", 7219 .result = REJECT, 7220 }, 7221 { 7222 "map element value illegal alu op, 3", 7223 .insns = { 7224 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7225 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7226 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7227 BPF_LD_MAP_FD(BPF_REG_1, 0), 7228 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7229 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 7230 BPF_ALU64_IMM(BPF_DIV, BPF_REG_0, 42), 7231 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22), 7232 BPF_EXIT_INSN(), 7233 }, 7234 .fixup_map_hash_48b = { 3 }, 7235 .errstr = "R0 pointer arithmetic with /= operator", 7236 .result = REJECT, 7237 }, 7238 { 7239 "map element value illegal alu op, 4", 7240 .insns = { 7241 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7242 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7243 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7244 BPF_LD_MAP_FD(BPF_REG_1, 0), 7245 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7246 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 7247 BPF_ENDIAN(BPF_FROM_BE, BPF_REG_0, 64), 7248 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22), 7249 BPF_EXIT_INSN(), 7250 }, 7251 .fixup_map_hash_48b = { 3 }, 7252 .errstr_unpriv = "R0 pointer arithmetic prohibited", 7253 .errstr = "invalid mem access 'inv'", 7254 .result = REJECT, 7255 .result_unpriv = REJECT, 7256 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 7257 }, 7258 { 7259 "map element value illegal alu op, 5", 7260 .insns = { 7261 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7262 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7263 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7264 BPF_LD_MAP_FD(BPF_REG_1, 0), 7265 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7266 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 7267 BPF_MOV64_IMM(BPF_REG_3, 4096), 7268 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7269 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7270 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 7271 BPF_STX_XADD(BPF_DW, BPF_REG_2, BPF_REG_3, 0), 7272 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, 0), 7273 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22), 7274 BPF_EXIT_INSN(), 7275 }, 7276 .fixup_map_hash_48b = { 3 }, 7277 .errstr = "R0 invalid mem access 'inv'", 7278 .result = REJECT, 7279 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 7280 }, 7281 { 7282 "map element value is preserved across register spilling", 7283 .insns = { 7284 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7285 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7286 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7287 BPF_LD_MAP_FD(BPF_REG_1, 0), 7288 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7289 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 7290 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 7291 offsetof(struct test_val, foo)), 7292 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42), 7293 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 7294 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -184), 7295 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), 7296 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 0), 7297 BPF_ST_MEM(BPF_DW, BPF_REG_3, 0, 42), 7298 BPF_EXIT_INSN(), 7299 }, 7300 .fixup_map_hash_48b = { 3 }, 7301 .errstr_unpriv = "R0 leaks addr", 7302 .result = ACCEPT, 7303 .result_unpriv = REJECT, 7304 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 7305 }, 7306 { 7307 "helper access to variable memory: stack, bitwise AND + JMP, correct bounds", 7308 .insns = { 7309 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 7310 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 7311 BPF_MOV64_IMM(BPF_REG_0, 0), 7312 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64), 7313 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56), 7314 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48), 7315 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40), 7316 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32), 7317 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24), 7318 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16), 7319 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 7320 BPF_MOV64_IMM(BPF_REG_2, 16), 7321 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 7322 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 7323 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 64), 7324 BPF_MOV64_IMM(BPF_REG_4, 0), 7325 BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2), 7326 BPF_MOV64_IMM(BPF_REG_3, 0), 7327 BPF_EMIT_CALL(BPF_FUNC_probe_read), 7328 BPF_MOV64_IMM(BPF_REG_0, 0), 7329 BPF_EXIT_INSN(), 7330 }, 7331 .result = ACCEPT, 7332 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7333 }, 7334 { 7335 "helper access to variable memory: stack, bitwise AND, zero included", 7336 .insns = { 7337 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 7338 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 7339 BPF_MOV64_IMM(BPF_REG_2, 16), 7340 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 7341 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 7342 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 64), 7343 BPF_MOV64_IMM(BPF_REG_3, 0), 7344 BPF_EMIT_CALL(BPF_FUNC_probe_read), 7345 BPF_EXIT_INSN(), 7346 }, 7347 .errstr = "invalid indirect read from stack off -64+0 size 64", 7348 .result = REJECT, 7349 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7350 }, 7351 { 7352 "helper access to variable memory: stack, bitwise AND + JMP, wrong max", 7353 .insns = { 7354 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 7355 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 7356 BPF_MOV64_IMM(BPF_REG_2, 16), 7357 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 7358 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 7359 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 65), 7360 BPF_MOV64_IMM(BPF_REG_4, 0), 7361 BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2), 7362 BPF_MOV64_IMM(BPF_REG_3, 0), 7363 BPF_EMIT_CALL(BPF_FUNC_probe_read), 7364 BPF_MOV64_IMM(BPF_REG_0, 0), 7365 BPF_EXIT_INSN(), 7366 }, 7367 .errstr = "invalid stack type R1 off=-64 access_size=65", 7368 .result = REJECT, 7369 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7370 }, 7371 { 7372 "helper access to variable memory: stack, JMP, correct bounds", 7373 .insns = { 7374 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 7375 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 7376 BPF_MOV64_IMM(BPF_REG_0, 0), 7377 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64), 7378 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56), 7379 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48), 7380 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40), 7381 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32), 7382 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24), 7383 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16), 7384 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 7385 BPF_MOV64_IMM(BPF_REG_2, 16), 7386 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 7387 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 7388 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 64, 4), 7389 BPF_MOV64_IMM(BPF_REG_4, 0), 7390 BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2), 7391 BPF_MOV64_IMM(BPF_REG_3, 0), 7392 BPF_EMIT_CALL(BPF_FUNC_probe_read), 7393 BPF_MOV64_IMM(BPF_REG_0, 0), 7394 BPF_EXIT_INSN(), 7395 }, 7396 .result = ACCEPT, 7397 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7398 }, 7399 { 7400 "helper access to variable memory: stack, JMP (signed), correct bounds", 7401 .insns = { 7402 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 7403 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 7404 BPF_MOV64_IMM(BPF_REG_0, 0), 7405 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64), 7406 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56), 7407 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48), 7408 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40), 7409 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32), 7410 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24), 7411 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16), 7412 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 7413 BPF_MOV64_IMM(BPF_REG_2, 16), 7414 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 7415 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 7416 BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 64, 4), 7417 BPF_MOV64_IMM(BPF_REG_4, 0), 7418 BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2), 7419 BPF_MOV64_IMM(BPF_REG_3, 0), 7420 BPF_EMIT_CALL(BPF_FUNC_probe_read), 7421 BPF_MOV64_IMM(BPF_REG_0, 0), 7422 BPF_EXIT_INSN(), 7423 }, 7424 .result = ACCEPT, 7425 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7426 }, 7427 { 7428 "helper access to variable memory: stack, JMP, bounds + offset", 7429 .insns = { 7430 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 7431 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 7432 BPF_MOV64_IMM(BPF_REG_2, 16), 7433 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 7434 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 7435 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 64, 5), 7436 BPF_MOV64_IMM(BPF_REG_4, 0), 7437 BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 3), 7438 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), 7439 BPF_MOV64_IMM(BPF_REG_3, 0), 7440 BPF_EMIT_CALL(BPF_FUNC_probe_read), 7441 BPF_MOV64_IMM(BPF_REG_0, 0), 7442 BPF_EXIT_INSN(), 7443 }, 7444 .errstr = "invalid stack type R1 off=-64 access_size=65", 7445 .result = REJECT, 7446 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7447 }, 7448 { 7449 "helper access to variable memory: stack, JMP, wrong max", 7450 .insns = { 7451 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 7452 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 7453 BPF_MOV64_IMM(BPF_REG_2, 16), 7454 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 7455 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 7456 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 65, 4), 7457 BPF_MOV64_IMM(BPF_REG_4, 0), 7458 BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2), 7459 BPF_MOV64_IMM(BPF_REG_3, 0), 7460 BPF_EMIT_CALL(BPF_FUNC_probe_read), 7461 BPF_MOV64_IMM(BPF_REG_0, 0), 7462 BPF_EXIT_INSN(), 7463 }, 7464 .errstr = "invalid stack type R1 off=-64 access_size=65", 7465 .result = REJECT, 7466 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7467 }, 7468 { 7469 "helper access to variable memory: stack, JMP, no max check", 7470 .insns = { 7471 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 7472 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 7473 BPF_MOV64_IMM(BPF_REG_2, 16), 7474 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 7475 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 7476 BPF_MOV64_IMM(BPF_REG_4, 0), 7477 BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2), 7478 BPF_MOV64_IMM(BPF_REG_3, 0), 7479 BPF_EMIT_CALL(BPF_FUNC_probe_read), 7480 BPF_MOV64_IMM(BPF_REG_0, 0), 7481 BPF_EXIT_INSN(), 7482 }, 7483 /* because max wasn't checked, signed min is negative */ 7484 .errstr = "R2 min value is negative, either use unsigned or 'var &= const'", 7485 .result = REJECT, 7486 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7487 }, 7488 { 7489 "helper access to variable memory: stack, JMP, no min check", 7490 .insns = { 7491 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 7492 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 7493 BPF_MOV64_IMM(BPF_REG_2, 16), 7494 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 7495 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 7496 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 64, 3), 7497 BPF_MOV64_IMM(BPF_REG_3, 0), 7498 BPF_EMIT_CALL(BPF_FUNC_probe_read), 7499 BPF_MOV64_IMM(BPF_REG_0, 0), 7500 BPF_EXIT_INSN(), 7501 }, 7502 .errstr = "invalid indirect read from stack off -64+0 size 64", 7503 .result = REJECT, 7504 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7505 }, 7506 { 7507 "helper access to variable memory: stack, JMP (signed), no min check", 7508 .insns = { 7509 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 7510 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 7511 BPF_MOV64_IMM(BPF_REG_2, 16), 7512 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 7513 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 7514 BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 64, 3), 7515 BPF_MOV64_IMM(BPF_REG_3, 0), 7516 BPF_EMIT_CALL(BPF_FUNC_probe_read), 7517 BPF_MOV64_IMM(BPF_REG_0, 0), 7518 BPF_EXIT_INSN(), 7519 }, 7520 .errstr = "R2 min value is negative", 7521 .result = REJECT, 7522 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7523 }, 7524 { 7525 "helper access to variable memory: map, JMP, correct bounds", 7526 .insns = { 7527 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7528 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7529 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7530 BPF_LD_MAP_FD(BPF_REG_1, 0), 7531 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7532 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10), 7533 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 7534 BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)), 7535 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128), 7536 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128), 7537 BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 7538 sizeof(struct test_val), 4), 7539 BPF_MOV64_IMM(BPF_REG_4, 0), 7540 BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2), 7541 BPF_MOV64_IMM(BPF_REG_3, 0), 7542 BPF_EMIT_CALL(BPF_FUNC_probe_read), 7543 BPF_MOV64_IMM(BPF_REG_0, 0), 7544 BPF_EXIT_INSN(), 7545 }, 7546 .fixup_map_hash_48b = { 3 }, 7547 .result = ACCEPT, 7548 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7549 }, 7550 { 7551 "helper access to variable memory: map, JMP, wrong max", 7552 .insns = { 7553 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7554 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7555 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7556 BPF_LD_MAP_FD(BPF_REG_1, 0), 7557 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7558 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10), 7559 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 7560 BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)), 7561 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128), 7562 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128), 7563 BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 7564 sizeof(struct test_val) + 1, 4), 7565 BPF_MOV64_IMM(BPF_REG_4, 0), 7566 BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2), 7567 BPF_MOV64_IMM(BPF_REG_3, 0), 7568 BPF_EMIT_CALL(BPF_FUNC_probe_read), 7569 BPF_MOV64_IMM(BPF_REG_0, 0), 7570 BPF_EXIT_INSN(), 7571 }, 7572 .fixup_map_hash_48b = { 3 }, 7573 .errstr = "invalid access to map value, value_size=48 off=0 size=49", 7574 .result = REJECT, 7575 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7576 }, 7577 { 7578 "helper access to variable memory: map adjusted, JMP, correct bounds", 7579 .insns = { 7580 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7581 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7582 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7583 BPF_LD_MAP_FD(BPF_REG_1, 0), 7584 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7585 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11), 7586 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 7587 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 20), 7588 BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)), 7589 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128), 7590 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128), 7591 BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 7592 sizeof(struct test_val) - 20, 4), 7593 BPF_MOV64_IMM(BPF_REG_4, 0), 7594 BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2), 7595 BPF_MOV64_IMM(BPF_REG_3, 0), 7596 BPF_EMIT_CALL(BPF_FUNC_probe_read), 7597 BPF_MOV64_IMM(BPF_REG_0, 0), 7598 BPF_EXIT_INSN(), 7599 }, 7600 .fixup_map_hash_48b = { 3 }, 7601 .result = ACCEPT, 7602 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7603 }, 7604 { 7605 "helper access to variable memory: map adjusted, JMP, wrong max", 7606 .insns = { 7607 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7608 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7609 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7610 BPF_LD_MAP_FD(BPF_REG_1, 0), 7611 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7612 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11), 7613 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 7614 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 20), 7615 BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)), 7616 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128), 7617 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128), 7618 BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 7619 sizeof(struct test_val) - 19, 4), 7620 BPF_MOV64_IMM(BPF_REG_4, 0), 7621 BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2), 7622 BPF_MOV64_IMM(BPF_REG_3, 0), 7623 BPF_EMIT_CALL(BPF_FUNC_probe_read), 7624 BPF_MOV64_IMM(BPF_REG_0, 0), 7625 BPF_EXIT_INSN(), 7626 }, 7627 .fixup_map_hash_48b = { 3 }, 7628 .errstr = "R1 min value is outside of the array range", 7629 .result = REJECT, 7630 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7631 }, 7632 { 7633 "helper access to variable memory: size = 0 allowed on NULL (ARG_PTR_TO_MEM_OR_NULL)", 7634 .insns = { 7635 BPF_MOV64_IMM(BPF_REG_1, 0), 7636 BPF_MOV64_IMM(BPF_REG_2, 0), 7637 BPF_MOV64_IMM(BPF_REG_3, 0), 7638 BPF_MOV64_IMM(BPF_REG_4, 0), 7639 BPF_MOV64_IMM(BPF_REG_5, 0), 7640 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 7641 BPF_EXIT_INSN(), 7642 }, 7643 .result = ACCEPT, 7644 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 7645 }, 7646 { 7647 "helper access to variable memory: size > 0 not allowed on NULL (ARG_PTR_TO_MEM_OR_NULL)", 7648 .insns = { 7649 BPF_MOV64_IMM(BPF_REG_1, 0), 7650 BPF_MOV64_IMM(BPF_REG_2, 1), 7651 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128), 7652 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128), 7653 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 64), 7654 BPF_MOV64_IMM(BPF_REG_3, 0), 7655 BPF_MOV64_IMM(BPF_REG_4, 0), 7656 BPF_MOV64_IMM(BPF_REG_5, 0), 7657 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 7658 BPF_EXIT_INSN(), 7659 }, 7660 .errstr = "R1 type=inv expected=fp", 7661 .result = REJECT, 7662 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 7663 }, 7664 { 7665 "helper access to variable memory: size = 0 allowed on != NULL stack pointer (ARG_PTR_TO_MEM_OR_NULL)", 7666 .insns = { 7667 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 7668 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 7669 BPF_MOV64_IMM(BPF_REG_2, 0), 7670 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, 0), 7671 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 8), 7672 BPF_MOV64_IMM(BPF_REG_3, 0), 7673 BPF_MOV64_IMM(BPF_REG_4, 0), 7674 BPF_MOV64_IMM(BPF_REG_5, 0), 7675 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 7676 BPF_EXIT_INSN(), 7677 }, 7678 .result = ACCEPT, 7679 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 7680 }, 7681 { 7682 "helper access to variable memory: size = 0 allowed on != NULL map pointer (ARG_PTR_TO_MEM_OR_NULL)", 7683 .insns = { 7684 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7685 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7686 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7687 BPF_LD_MAP_FD(BPF_REG_1, 0), 7688 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7689 BPF_FUNC_map_lookup_elem), 7690 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 7691 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 7692 BPF_MOV64_IMM(BPF_REG_2, 0), 7693 BPF_MOV64_IMM(BPF_REG_3, 0), 7694 BPF_MOV64_IMM(BPF_REG_4, 0), 7695 BPF_MOV64_IMM(BPF_REG_5, 0), 7696 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 7697 BPF_EXIT_INSN(), 7698 }, 7699 .fixup_map_hash_8b = { 3 }, 7700 .result = ACCEPT, 7701 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 7702 }, 7703 { 7704 "helper access to variable memory: size possible = 0 allowed on != NULL stack pointer (ARG_PTR_TO_MEM_OR_NULL)", 7705 .insns = { 7706 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7707 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7708 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7709 BPF_LD_MAP_FD(BPF_REG_1, 0), 7710 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7711 BPF_FUNC_map_lookup_elem), 7712 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 7713 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 7714 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 7), 7715 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 7716 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 7717 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, 0), 7718 BPF_MOV64_IMM(BPF_REG_3, 0), 7719 BPF_MOV64_IMM(BPF_REG_4, 0), 7720 BPF_MOV64_IMM(BPF_REG_5, 0), 7721 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 7722 BPF_EXIT_INSN(), 7723 }, 7724 .fixup_map_hash_8b = { 3 }, 7725 .result = ACCEPT, 7726 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 7727 }, 7728 { 7729 "helper access to variable memory: size possible = 0 allowed on != NULL map pointer (ARG_PTR_TO_MEM_OR_NULL)", 7730 .insns = { 7731 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7732 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7733 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7734 BPF_LD_MAP_FD(BPF_REG_1, 0), 7735 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7736 BPF_FUNC_map_lookup_elem), 7737 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 7738 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 7739 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 7740 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 4), 7741 BPF_MOV64_IMM(BPF_REG_3, 0), 7742 BPF_MOV64_IMM(BPF_REG_4, 0), 7743 BPF_MOV64_IMM(BPF_REG_5, 0), 7744 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 7745 BPF_EXIT_INSN(), 7746 }, 7747 .fixup_map_hash_8b = { 3 }, 7748 .result = ACCEPT, 7749 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 7750 }, 7751 { 7752 "helper access to variable memory: size possible = 0 allowed on != NULL packet pointer (ARG_PTR_TO_MEM_OR_NULL)", 7753 .insns = { 7754 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 7755 offsetof(struct __sk_buff, data)), 7756 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 7757 offsetof(struct __sk_buff, data_end)), 7758 BPF_MOV64_REG(BPF_REG_0, BPF_REG_6), 7759 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 7760 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 7), 7761 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 7762 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6, 0), 7763 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 4), 7764 BPF_MOV64_IMM(BPF_REG_3, 0), 7765 BPF_MOV64_IMM(BPF_REG_4, 0), 7766 BPF_MOV64_IMM(BPF_REG_5, 0), 7767 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 7768 BPF_EXIT_INSN(), 7769 }, 7770 .result = ACCEPT, 7771 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 7772 .retval = 0 /* csum_diff of 64-byte packet */, 7773 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 7774 }, 7775 { 7776 "helper access to variable memory: size = 0 not allowed on NULL (!ARG_PTR_TO_MEM_OR_NULL)", 7777 .insns = { 7778 BPF_MOV64_IMM(BPF_REG_1, 0), 7779 BPF_MOV64_IMM(BPF_REG_2, 0), 7780 BPF_MOV64_IMM(BPF_REG_3, 0), 7781 BPF_EMIT_CALL(BPF_FUNC_probe_read), 7782 BPF_EXIT_INSN(), 7783 }, 7784 .errstr = "R1 type=inv expected=fp", 7785 .result = REJECT, 7786 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7787 }, 7788 { 7789 "helper access to variable memory: size > 0 not allowed on NULL (!ARG_PTR_TO_MEM_OR_NULL)", 7790 .insns = { 7791 BPF_MOV64_IMM(BPF_REG_1, 0), 7792 BPF_MOV64_IMM(BPF_REG_2, 1), 7793 BPF_MOV64_IMM(BPF_REG_3, 0), 7794 BPF_EMIT_CALL(BPF_FUNC_probe_read), 7795 BPF_EXIT_INSN(), 7796 }, 7797 .errstr = "R1 type=inv expected=fp", 7798 .result = REJECT, 7799 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7800 }, 7801 { 7802 "helper access to variable memory: size = 0 allowed on != NULL stack pointer (!ARG_PTR_TO_MEM_OR_NULL)", 7803 .insns = { 7804 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 7805 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 7806 BPF_MOV64_IMM(BPF_REG_2, 0), 7807 BPF_MOV64_IMM(BPF_REG_3, 0), 7808 BPF_EMIT_CALL(BPF_FUNC_probe_read), 7809 BPF_EXIT_INSN(), 7810 }, 7811 .result = ACCEPT, 7812 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7813 }, 7814 { 7815 "helper access to variable memory: size = 0 allowed on != NULL map pointer (!ARG_PTR_TO_MEM_OR_NULL)", 7816 .insns = { 7817 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7818 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7819 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7820 BPF_LD_MAP_FD(BPF_REG_1, 0), 7821 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7822 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 7823 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 7824 BPF_MOV64_IMM(BPF_REG_2, 0), 7825 BPF_MOV64_IMM(BPF_REG_3, 0), 7826 BPF_EMIT_CALL(BPF_FUNC_probe_read), 7827 BPF_EXIT_INSN(), 7828 }, 7829 .fixup_map_hash_8b = { 3 }, 7830 .result = ACCEPT, 7831 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7832 }, 7833 { 7834 "helper access to variable memory: size possible = 0 allowed on != NULL stack pointer (!ARG_PTR_TO_MEM_OR_NULL)", 7835 .insns = { 7836 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7837 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7838 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7839 BPF_LD_MAP_FD(BPF_REG_1, 0), 7840 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7841 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 7842 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 7843 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 4), 7844 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 7845 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 7846 BPF_MOV64_IMM(BPF_REG_3, 0), 7847 BPF_EMIT_CALL(BPF_FUNC_probe_read), 7848 BPF_EXIT_INSN(), 7849 }, 7850 .fixup_map_hash_8b = { 3 }, 7851 .result = ACCEPT, 7852 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7853 }, 7854 { 7855 "helper access to variable memory: size possible = 0 allowed on != NULL map pointer (!ARG_PTR_TO_MEM_OR_NULL)", 7856 .insns = { 7857 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7858 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7859 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7860 BPF_LD_MAP_FD(BPF_REG_1, 0), 7861 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7862 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 7863 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 7864 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 7865 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 2), 7866 BPF_MOV64_IMM(BPF_REG_3, 0), 7867 BPF_EMIT_CALL(BPF_FUNC_probe_read), 7868 BPF_EXIT_INSN(), 7869 }, 7870 .fixup_map_hash_8b = { 3 }, 7871 .result = ACCEPT, 7872 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7873 }, 7874 { 7875 "helper access to variable memory: 8 bytes leak", 7876 .insns = { 7877 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 7878 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 7879 BPF_MOV64_IMM(BPF_REG_0, 0), 7880 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64), 7881 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56), 7882 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48), 7883 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40), 7884 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24), 7885 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16), 7886 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 7887 BPF_MOV64_IMM(BPF_REG_2, 1), 7888 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128), 7889 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128), 7890 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 63), 7891 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), 7892 BPF_MOV64_IMM(BPF_REG_3, 0), 7893 BPF_EMIT_CALL(BPF_FUNC_probe_read), 7894 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 7895 BPF_EXIT_INSN(), 7896 }, 7897 .errstr = "invalid indirect read from stack off -64+32 size 64", 7898 .result = REJECT, 7899 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7900 }, 7901 { 7902 "helper access to variable memory: 8 bytes no leak (init memory)", 7903 .insns = { 7904 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 7905 BPF_MOV64_IMM(BPF_REG_0, 0), 7906 BPF_MOV64_IMM(BPF_REG_0, 0), 7907 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64), 7908 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56), 7909 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48), 7910 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40), 7911 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32), 7912 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24), 7913 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16), 7914 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 7915 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 7916 BPF_MOV64_IMM(BPF_REG_2, 0), 7917 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 32), 7918 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 32), 7919 BPF_MOV64_IMM(BPF_REG_3, 0), 7920 BPF_EMIT_CALL(BPF_FUNC_probe_read), 7921 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 7922 BPF_EXIT_INSN(), 7923 }, 7924 .result = ACCEPT, 7925 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7926 }, 7927 { 7928 "invalid and of negative number", 7929 .insns = { 7930 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7931 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7932 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7933 BPF_LD_MAP_FD(BPF_REG_1, 0), 7934 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7935 BPF_FUNC_map_lookup_elem), 7936 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 7937 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7938 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, -4), 7939 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2), 7940 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7941 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 7942 offsetof(struct test_val, foo)), 7943 BPF_EXIT_INSN(), 7944 }, 7945 .fixup_map_hash_48b = { 3 }, 7946 .errstr = "R0 max value is outside of the array range", 7947 .result = REJECT, 7948 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 7949 }, 7950 { 7951 "invalid range check", 7952 .insns = { 7953 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7954 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7955 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7956 BPF_LD_MAP_FD(BPF_REG_1, 0), 7957 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7958 BPF_FUNC_map_lookup_elem), 7959 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 12), 7960 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 7961 BPF_MOV64_IMM(BPF_REG_9, 1), 7962 BPF_ALU32_IMM(BPF_MOD, BPF_REG_1, 2), 7963 BPF_ALU32_IMM(BPF_ADD, BPF_REG_1, 1), 7964 BPF_ALU32_REG(BPF_AND, BPF_REG_9, BPF_REG_1), 7965 BPF_ALU32_IMM(BPF_ADD, BPF_REG_9, 1), 7966 BPF_ALU32_IMM(BPF_RSH, BPF_REG_9, 1), 7967 BPF_MOV32_IMM(BPF_REG_3, 1), 7968 BPF_ALU32_REG(BPF_SUB, BPF_REG_3, BPF_REG_9), 7969 BPF_ALU32_IMM(BPF_MUL, BPF_REG_3, 0x10000000), 7970 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_3), 7971 BPF_STX_MEM(BPF_W, BPF_REG_0, BPF_REG_3, 0), 7972 BPF_MOV64_REG(BPF_REG_0, 0), 7973 BPF_EXIT_INSN(), 7974 }, 7975 .fixup_map_hash_48b = { 3 }, 7976 .errstr = "R0 max value is outside of the array range", 7977 .result = REJECT, 7978 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 7979 }, 7980 { 7981 "map in map access", 7982 .insns = { 7983 BPF_ST_MEM(0, BPF_REG_10, -4, 0), 7984 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7985 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 7986 BPF_LD_MAP_FD(BPF_REG_1, 0), 7987 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7988 BPF_FUNC_map_lookup_elem), 7989 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 7990 BPF_ST_MEM(0, BPF_REG_10, -4, 0), 7991 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7992 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 7993 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 7994 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7995 BPF_FUNC_map_lookup_elem), 7996 BPF_MOV64_IMM(BPF_REG_0, 0), 7997 BPF_EXIT_INSN(), 7998 }, 7999 .fixup_map_in_map = { 3 }, 8000 .result = ACCEPT, 8001 }, 8002 { 8003 "invalid inner map pointer", 8004 .insns = { 8005 BPF_ST_MEM(0, BPF_REG_10, -4, 0), 8006 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8007 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 8008 BPF_LD_MAP_FD(BPF_REG_1, 0), 8009 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8010 BPF_FUNC_map_lookup_elem), 8011 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 8012 BPF_ST_MEM(0, BPF_REG_10, -4, 0), 8013 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8014 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 8015 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 8016 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8017 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8018 BPF_FUNC_map_lookup_elem), 8019 BPF_MOV64_IMM(BPF_REG_0, 0), 8020 BPF_EXIT_INSN(), 8021 }, 8022 .fixup_map_in_map = { 3 }, 8023 .errstr = "R1 pointer arithmetic on map_ptr prohibited", 8024 .result = REJECT, 8025 }, 8026 { 8027 "forgot null checking on the inner map pointer", 8028 .insns = { 8029 BPF_ST_MEM(0, BPF_REG_10, -4, 0), 8030 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8031 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 8032 BPF_LD_MAP_FD(BPF_REG_1, 0), 8033 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8034 BPF_FUNC_map_lookup_elem), 8035 BPF_ST_MEM(0, BPF_REG_10, -4, 0), 8036 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8037 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 8038 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 8039 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8040 BPF_FUNC_map_lookup_elem), 8041 BPF_MOV64_IMM(BPF_REG_0, 0), 8042 BPF_EXIT_INSN(), 8043 }, 8044 .fixup_map_in_map = { 3 }, 8045 .errstr = "R1 type=map_value_or_null expected=map_ptr", 8046 .result = REJECT, 8047 }, 8048 { 8049 "ld_abs: check calling conv, r1", 8050 .insns = { 8051 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8052 BPF_MOV64_IMM(BPF_REG_1, 0), 8053 BPF_LD_ABS(BPF_W, -0x200000), 8054 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 8055 BPF_EXIT_INSN(), 8056 }, 8057 .errstr = "R1 !read_ok", 8058 .result = REJECT, 8059 }, 8060 { 8061 "ld_abs: check calling conv, r2", 8062 .insns = { 8063 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8064 BPF_MOV64_IMM(BPF_REG_2, 0), 8065 BPF_LD_ABS(BPF_W, -0x200000), 8066 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 8067 BPF_EXIT_INSN(), 8068 }, 8069 .errstr = "R2 !read_ok", 8070 .result = REJECT, 8071 }, 8072 { 8073 "ld_abs: check calling conv, r3", 8074 .insns = { 8075 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8076 BPF_MOV64_IMM(BPF_REG_3, 0), 8077 BPF_LD_ABS(BPF_W, -0x200000), 8078 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3), 8079 BPF_EXIT_INSN(), 8080 }, 8081 .errstr = "R3 !read_ok", 8082 .result = REJECT, 8083 }, 8084 { 8085 "ld_abs: check calling conv, r4", 8086 .insns = { 8087 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8088 BPF_MOV64_IMM(BPF_REG_4, 0), 8089 BPF_LD_ABS(BPF_W, -0x200000), 8090 BPF_MOV64_REG(BPF_REG_0, BPF_REG_4), 8091 BPF_EXIT_INSN(), 8092 }, 8093 .errstr = "R4 !read_ok", 8094 .result = REJECT, 8095 }, 8096 { 8097 "ld_abs: check calling conv, r5", 8098 .insns = { 8099 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8100 BPF_MOV64_IMM(BPF_REG_5, 0), 8101 BPF_LD_ABS(BPF_W, -0x200000), 8102 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 8103 BPF_EXIT_INSN(), 8104 }, 8105 .errstr = "R5 !read_ok", 8106 .result = REJECT, 8107 }, 8108 { 8109 "ld_abs: check calling conv, r7", 8110 .insns = { 8111 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8112 BPF_MOV64_IMM(BPF_REG_7, 0), 8113 BPF_LD_ABS(BPF_W, -0x200000), 8114 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 8115 BPF_EXIT_INSN(), 8116 }, 8117 .result = ACCEPT, 8118 }, 8119 { 8120 "ld_abs: tests on r6 and skb data reload helper", 8121 .insns = { 8122 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8123 BPF_LD_ABS(BPF_B, 0), 8124 BPF_LD_ABS(BPF_H, 0), 8125 BPF_LD_ABS(BPF_W, 0), 8126 BPF_MOV64_REG(BPF_REG_7, BPF_REG_6), 8127 BPF_MOV64_IMM(BPF_REG_6, 0), 8128 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 8129 BPF_MOV64_IMM(BPF_REG_2, 1), 8130 BPF_MOV64_IMM(BPF_REG_3, 2), 8131 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8132 BPF_FUNC_skb_vlan_push), 8133 BPF_MOV64_REG(BPF_REG_6, BPF_REG_7), 8134 BPF_LD_ABS(BPF_B, 0), 8135 BPF_LD_ABS(BPF_H, 0), 8136 BPF_LD_ABS(BPF_W, 0), 8137 BPF_MOV64_IMM(BPF_REG_0, 42), 8138 BPF_EXIT_INSN(), 8139 }, 8140 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 8141 .result = ACCEPT, 8142 .retval = 42 /* ultimate return value */, 8143 }, 8144 { 8145 "ld_ind: check calling conv, r1", 8146 .insns = { 8147 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8148 BPF_MOV64_IMM(BPF_REG_1, 1), 8149 BPF_LD_IND(BPF_W, BPF_REG_1, -0x200000), 8150 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 8151 BPF_EXIT_INSN(), 8152 }, 8153 .errstr = "R1 !read_ok", 8154 .result = REJECT, 8155 }, 8156 { 8157 "ld_ind: check calling conv, r2", 8158 .insns = { 8159 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8160 BPF_MOV64_IMM(BPF_REG_2, 1), 8161 BPF_LD_IND(BPF_W, BPF_REG_2, -0x200000), 8162 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 8163 BPF_EXIT_INSN(), 8164 }, 8165 .errstr = "R2 !read_ok", 8166 .result = REJECT, 8167 }, 8168 { 8169 "ld_ind: check calling conv, r3", 8170 .insns = { 8171 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8172 BPF_MOV64_IMM(BPF_REG_3, 1), 8173 BPF_LD_IND(BPF_W, BPF_REG_3, -0x200000), 8174 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3), 8175 BPF_EXIT_INSN(), 8176 }, 8177 .errstr = "R3 !read_ok", 8178 .result = REJECT, 8179 }, 8180 { 8181 "ld_ind: check calling conv, r4", 8182 .insns = { 8183 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8184 BPF_MOV64_IMM(BPF_REG_4, 1), 8185 BPF_LD_IND(BPF_W, BPF_REG_4, -0x200000), 8186 BPF_MOV64_REG(BPF_REG_0, BPF_REG_4), 8187 BPF_EXIT_INSN(), 8188 }, 8189 .errstr = "R4 !read_ok", 8190 .result = REJECT, 8191 }, 8192 { 8193 "ld_ind: check calling conv, r5", 8194 .insns = { 8195 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8196 BPF_MOV64_IMM(BPF_REG_5, 1), 8197 BPF_LD_IND(BPF_W, BPF_REG_5, -0x200000), 8198 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 8199 BPF_EXIT_INSN(), 8200 }, 8201 .errstr = "R5 !read_ok", 8202 .result = REJECT, 8203 }, 8204 { 8205 "ld_ind: check calling conv, r7", 8206 .insns = { 8207 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8208 BPF_MOV64_IMM(BPF_REG_7, 1), 8209 BPF_LD_IND(BPF_W, BPF_REG_7, -0x200000), 8210 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 8211 BPF_EXIT_INSN(), 8212 }, 8213 .result = ACCEPT, 8214 .retval = 1, 8215 }, 8216 { 8217 "check bpf_perf_event_data->sample_period byte load permitted", 8218 .insns = { 8219 BPF_MOV64_IMM(BPF_REG_0, 0), 8220 #if __BYTE_ORDER == __LITTLE_ENDIAN 8221 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 8222 offsetof(struct bpf_perf_event_data, sample_period)), 8223 #else 8224 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 8225 offsetof(struct bpf_perf_event_data, sample_period) + 7), 8226 #endif 8227 BPF_EXIT_INSN(), 8228 }, 8229 .result = ACCEPT, 8230 .prog_type = BPF_PROG_TYPE_PERF_EVENT, 8231 }, 8232 { 8233 "check bpf_perf_event_data->sample_period half load permitted", 8234 .insns = { 8235 BPF_MOV64_IMM(BPF_REG_0, 0), 8236 #if __BYTE_ORDER == __LITTLE_ENDIAN 8237 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 8238 offsetof(struct bpf_perf_event_data, sample_period)), 8239 #else 8240 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 8241 offsetof(struct bpf_perf_event_data, sample_period) + 6), 8242 #endif 8243 BPF_EXIT_INSN(), 8244 }, 8245 .result = ACCEPT, 8246 .prog_type = BPF_PROG_TYPE_PERF_EVENT, 8247 }, 8248 { 8249 "check bpf_perf_event_data->sample_period word load permitted", 8250 .insns = { 8251 BPF_MOV64_IMM(BPF_REG_0, 0), 8252 #if __BYTE_ORDER == __LITTLE_ENDIAN 8253 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 8254 offsetof(struct bpf_perf_event_data, sample_period)), 8255 #else 8256 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 8257 offsetof(struct bpf_perf_event_data, sample_period) + 4), 8258 #endif 8259 BPF_EXIT_INSN(), 8260 }, 8261 .result = ACCEPT, 8262 .prog_type = BPF_PROG_TYPE_PERF_EVENT, 8263 }, 8264 { 8265 "check bpf_perf_event_data->sample_period dword load permitted", 8266 .insns = { 8267 BPF_MOV64_IMM(BPF_REG_0, 0), 8268 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 8269 offsetof(struct bpf_perf_event_data, sample_period)), 8270 BPF_EXIT_INSN(), 8271 }, 8272 .result = ACCEPT, 8273 .prog_type = BPF_PROG_TYPE_PERF_EVENT, 8274 }, 8275 { 8276 "check skb->data half load not permitted", 8277 .insns = { 8278 BPF_MOV64_IMM(BPF_REG_0, 0), 8279 #if __BYTE_ORDER == __LITTLE_ENDIAN 8280 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 8281 offsetof(struct __sk_buff, data)), 8282 #else 8283 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 8284 offsetof(struct __sk_buff, data) + 2), 8285 #endif 8286 BPF_EXIT_INSN(), 8287 }, 8288 .result = REJECT, 8289 .errstr = "invalid bpf_context access", 8290 }, 8291 { 8292 "check skb->tc_classid half load not permitted for lwt prog", 8293 .insns = { 8294 BPF_MOV64_IMM(BPF_REG_0, 0), 8295 #if __BYTE_ORDER == __LITTLE_ENDIAN 8296 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 8297 offsetof(struct __sk_buff, tc_classid)), 8298 #else 8299 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 8300 offsetof(struct __sk_buff, tc_classid) + 2), 8301 #endif 8302 BPF_EXIT_INSN(), 8303 }, 8304 .result = REJECT, 8305 .errstr = "invalid bpf_context access", 8306 .prog_type = BPF_PROG_TYPE_LWT_IN, 8307 }, 8308 { 8309 "bounds checks mixing signed and unsigned, positive bounds", 8310 .insns = { 8311 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8312 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8313 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8314 BPF_LD_MAP_FD(BPF_REG_1, 0), 8315 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8316 BPF_FUNC_map_lookup_elem), 8317 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 8318 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 8319 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 8320 BPF_MOV64_IMM(BPF_REG_2, 2), 8321 BPF_JMP_REG(BPF_JGE, BPF_REG_2, BPF_REG_1, 3), 8322 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 4, 2), 8323 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 8324 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 8325 BPF_MOV64_IMM(BPF_REG_0, 0), 8326 BPF_EXIT_INSN(), 8327 }, 8328 .fixup_map_hash_8b = { 3 }, 8329 .errstr = "unbounded min value", 8330 .result = REJECT, 8331 }, 8332 { 8333 "bounds checks mixing signed and unsigned", 8334 .insns = { 8335 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8336 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8337 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8338 BPF_LD_MAP_FD(BPF_REG_1, 0), 8339 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8340 BPF_FUNC_map_lookup_elem), 8341 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 8342 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 8343 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 8344 BPF_MOV64_IMM(BPF_REG_2, -1), 8345 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, 3), 8346 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 8347 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 8348 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 8349 BPF_MOV64_IMM(BPF_REG_0, 0), 8350 BPF_EXIT_INSN(), 8351 }, 8352 .fixup_map_hash_8b = { 3 }, 8353 .errstr = "unbounded min value", 8354 .result = REJECT, 8355 }, 8356 { 8357 "bounds checks mixing signed and unsigned, variant 2", 8358 .insns = { 8359 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8360 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8361 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8362 BPF_LD_MAP_FD(BPF_REG_1, 0), 8363 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8364 BPF_FUNC_map_lookup_elem), 8365 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 8366 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 8367 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 8368 BPF_MOV64_IMM(BPF_REG_2, -1), 8369 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, 5), 8370 BPF_MOV64_IMM(BPF_REG_8, 0), 8371 BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_1), 8372 BPF_JMP_IMM(BPF_JSGT, BPF_REG_8, 1, 2), 8373 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_8), 8374 BPF_ST_MEM(BPF_B, BPF_REG_8, 0, 0), 8375 BPF_MOV64_IMM(BPF_REG_0, 0), 8376 BPF_EXIT_INSN(), 8377 }, 8378 .fixup_map_hash_8b = { 3 }, 8379 .errstr = "unbounded min value", 8380 .result = REJECT, 8381 }, 8382 { 8383 "bounds checks mixing signed and unsigned, variant 3", 8384 .insns = { 8385 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8386 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8387 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8388 BPF_LD_MAP_FD(BPF_REG_1, 0), 8389 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8390 BPF_FUNC_map_lookup_elem), 8391 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8), 8392 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 8393 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 8394 BPF_MOV64_IMM(BPF_REG_2, -1), 8395 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, 4), 8396 BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 8397 BPF_JMP_IMM(BPF_JSGT, BPF_REG_8, 1, 2), 8398 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_8), 8399 BPF_ST_MEM(BPF_B, BPF_REG_8, 0, 0), 8400 BPF_MOV64_IMM(BPF_REG_0, 0), 8401 BPF_EXIT_INSN(), 8402 }, 8403 .fixup_map_hash_8b = { 3 }, 8404 .errstr = "unbounded min value", 8405 .result = REJECT, 8406 }, 8407 { 8408 "bounds checks mixing signed and unsigned, variant 4", 8409 .insns = { 8410 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8411 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8412 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8413 BPF_LD_MAP_FD(BPF_REG_1, 0), 8414 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8415 BPF_FUNC_map_lookup_elem), 8416 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 8417 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 8418 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 8419 BPF_MOV64_IMM(BPF_REG_2, 1), 8420 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 8421 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 8422 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 8423 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 8424 BPF_MOV64_IMM(BPF_REG_0, 0), 8425 BPF_EXIT_INSN(), 8426 }, 8427 .fixup_map_hash_8b = { 3 }, 8428 .result = ACCEPT, 8429 }, 8430 { 8431 "bounds checks mixing signed and unsigned, variant 5", 8432 .insns = { 8433 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8434 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8435 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8436 BPF_LD_MAP_FD(BPF_REG_1, 0), 8437 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8438 BPF_FUNC_map_lookup_elem), 8439 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 8440 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 8441 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 8442 BPF_MOV64_IMM(BPF_REG_2, -1), 8443 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, 5), 8444 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 4), 8445 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 4), 8446 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 8447 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 8448 BPF_MOV64_IMM(BPF_REG_0, 0), 8449 BPF_EXIT_INSN(), 8450 }, 8451 .fixup_map_hash_8b = { 3 }, 8452 .errstr = "unbounded min value", 8453 .result = REJECT, 8454 }, 8455 { 8456 "bounds checks mixing signed and unsigned, variant 6", 8457 .insns = { 8458 BPF_MOV64_IMM(BPF_REG_2, 0), 8459 BPF_MOV64_REG(BPF_REG_3, BPF_REG_10), 8460 BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, -512), 8461 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 8462 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -16), 8463 BPF_MOV64_IMM(BPF_REG_6, -1), 8464 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_6, 5), 8465 BPF_JMP_IMM(BPF_JSGT, BPF_REG_4, 1, 4), 8466 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 1), 8467 BPF_MOV64_IMM(BPF_REG_5, 0), 8468 BPF_ST_MEM(BPF_H, BPF_REG_10, -512, 0), 8469 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8470 BPF_FUNC_skb_load_bytes), 8471 BPF_MOV64_IMM(BPF_REG_0, 0), 8472 BPF_EXIT_INSN(), 8473 }, 8474 .errstr = "R4 min value is negative, either use unsigned", 8475 .result = REJECT, 8476 }, 8477 { 8478 "bounds checks mixing signed and unsigned, variant 7", 8479 .insns = { 8480 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8481 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8482 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8483 BPF_LD_MAP_FD(BPF_REG_1, 0), 8484 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8485 BPF_FUNC_map_lookup_elem), 8486 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 8487 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 8488 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 8489 BPF_MOV64_IMM(BPF_REG_2, 1024 * 1024 * 1024), 8490 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, 3), 8491 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 8492 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 8493 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 8494 BPF_MOV64_IMM(BPF_REG_0, 0), 8495 BPF_EXIT_INSN(), 8496 }, 8497 .fixup_map_hash_8b = { 3 }, 8498 .result = ACCEPT, 8499 }, 8500 { 8501 "bounds checks mixing signed and unsigned, variant 8", 8502 .insns = { 8503 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8504 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8505 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8506 BPF_LD_MAP_FD(BPF_REG_1, 0), 8507 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8508 BPF_FUNC_map_lookup_elem), 8509 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 8510 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 8511 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 8512 BPF_MOV64_IMM(BPF_REG_2, -1), 8513 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 2), 8514 BPF_MOV64_IMM(BPF_REG_0, 0), 8515 BPF_EXIT_INSN(), 8516 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 8517 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 8518 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 8519 BPF_MOV64_IMM(BPF_REG_0, 0), 8520 BPF_EXIT_INSN(), 8521 }, 8522 .fixup_map_hash_8b = { 3 }, 8523 .errstr = "unbounded min value", 8524 .result = REJECT, 8525 }, 8526 { 8527 "bounds checks mixing signed and unsigned, variant 9", 8528 .insns = { 8529 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8530 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8531 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8532 BPF_LD_MAP_FD(BPF_REG_1, 0), 8533 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8534 BPF_FUNC_map_lookup_elem), 8535 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10), 8536 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 8537 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 8538 BPF_LD_IMM64(BPF_REG_2, -9223372036854775808ULL), 8539 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 2), 8540 BPF_MOV64_IMM(BPF_REG_0, 0), 8541 BPF_EXIT_INSN(), 8542 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 8543 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 8544 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 8545 BPF_MOV64_IMM(BPF_REG_0, 0), 8546 BPF_EXIT_INSN(), 8547 }, 8548 .fixup_map_hash_8b = { 3 }, 8549 .result = ACCEPT, 8550 }, 8551 { 8552 "bounds checks mixing signed and unsigned, variant 10", 8553 .insns = { 8554 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8555 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8556 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8557 BPF_LD_MAP_FD(BPF_REG_1, 0), 8558 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8559 BPF_FUNC_map_lookup_elem), 8560 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 8561 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 8562 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 8563 BPF_MOV64_IMM(BPF_REG_2, 0), 8564 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 2), 8565 BPF_MOV64_IMM(BPF_REG_0, 0), 8566 BPF_EXIT_INSN(), 8567 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 8568 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 8569 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 8570 BPF_MOV64_IMM(BPF_REG_0, 0), 8571 BPF_EXIT_INSN(), 8572 }, 8573 .fixup_map_hash_8b = { 3 }, 8574 .errstr = "unbounded min value", 8575 .result = REJECT, 8576 }, 8577 { 8578 "bounds checks mixing signed and unsigned, variant 11", 8579 .insns = { 8580 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8581 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8582 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8583 BPF_LD_MAP_FD(BPF_REG_1, 0), 8584 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8585 BPF_FUNC_map_lookup_elem), 8586 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 8587 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 8588 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 8589 BPF_MOV64_IMM(BPF_REG_2, -1), 8590 BPF_JMP_REG(BPF_JGE, BPF_REG_2, BPF_REG_1, 2), 8591 /* Dead branch. */ 8592 BPF_MOV64_IMM(BPF_REG_0, 0), 8593 BPF_EXIT_INSN(), 8594 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 8595 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 8596 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 8597 BPF_MOV64_IMM(BPF_REG_0, 0), 8598 BPF_EXIT_INSN(), 8599 }, 8600 .fixup_map_hash_8b = { 3 }, 8601 .errstr = "unbounded min value", 8602 .result = REJECT, 8603 }, 8604 { 8605 "bounds checks mixing signed and unsigned, variant 12", 8606 .insns = { 8607 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8608 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8609 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8610 BPF_LD_MAP_FD(BPF_REG_1, 0), 8611 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8612 BPF_FUNC_map_lookup_elem), 8613 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 8614 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 8615 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 8616 BPF_MOV64_IMM(BPF_REG_2, -6), 8617 BPF_JMP_REG(BPF_JGE, BPF_REG_2, BPF_REG_1, 2), 8618 BPF_MOV64_IMM(BPF_REG_0, 0), 8619 BPF_EXIT_INSN(), 8620 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 8621 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 8622 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 8623 BPF_MOV64_IMM(BPF_REG_0, 0), 8624 BPF_EXIT_INSN(), 8625 }, 8626 .fixup_map_hash_8b = { 3 }, 8627 .errstr = "unbounded min value", 8628 .result = REJECT, 8629 }, 8630 { 8631 "bounds checks mixing signed and unsigned, variant 13", 8632 .insns = { 8633 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8634 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8635 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8636 BPF_LD_MAP_FD(BPF_REG_1, 0), 8637 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8638 BPF_FUNC_map_lookup_elem), 8639 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 8640 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 8641 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 8642 BPF_MOV64_IMM(BPF_REG_2, 2), 8643 BPF_JMP_REG(BPF_JGE, BPF_REG_2, BPF_REG_1, 2), 8644 BPF_MOV64_IMM(BPF_REG_7, 1), 8645 BPF_JMP_IMM(BPF_JSGT, BPF_REG_7, 0, 2), 8646 BPF_MOV64_IMM(BPF_REG_0, 0), 8647 BPF_EXIT_INSN(), 8648 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_1), 8649 BPF_JMP_IMM(BPF_JSGT, BPF_REG_7, 4, 2), 8650 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_7), 8651 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 8652 BPF_MOV64_IMM(BPF_REG_0, 0), 8653 BPF_EXIT_INSN(), 8654 }, 8655 .fixup_map_hash_8b = { 3 }, 8656 .errstr = "unbounded min value", 8657 .result = REJECT, 8658 }, 8659 { 8660 "bounds checks mixing signed and unsigned, variant 14", 8661 .insns = { 8662 BPF_LDX_MEM(BPF_W, BPF_REG_9, BPF_REG_1, 8663 offsetof(struct __sk_buff, mark)), 8664 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8665 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8666 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8667 BPF_LD_MAP_FD(BPF_REG_1, 0), 8668 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8669 BPF_FUNC_map_lookup_elem), 8670 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8), 8671 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 8672 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 8673 BPF_MOV64_IMM(BPF_REG_2, -1), 8674 BPF_MOV64_IMM(BPF_REG_8, 2), 8675 BPF_JMP_IMM(BPF_JEQ, BPF_REG_9, 42, 6), 8676 BPF_JMP_REG(BPF_JSGT, BPF_REG_8, BPF_REG_1, 3), 8677 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 8678 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 8679 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 8680 BPF_MOV64_IMM(BPF_REG_0, 0), 8681 BPF_EXIT_INSN(), 8682 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, -3), 8683 BPF_JMP_IMM(BPF_JA, 0, 0, -7), 8684 }, 8685 .fixup_map_hash_8b = { 4 }, 8686 .errstr = "unbounded min value", 8687 .result = REJECT, 8688 }, 8689 { 8690 "bounds checks mixing signed and unsigned, variant 15", 8691 .insns = { 8692 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8693 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8694 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8695 BPF_LD_MAP_FD(BPF_REG_1, 0), 8696 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8697 BPF_FUNC_map_lookup_elem), 8698 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 8699 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 8700 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 8701 BPF_MOV64_IMM(BPF_REG_2, -6), 8702 BPF_JMP_REG(BPF_JGE, BPF_REG_2, BPF_REG_1, 2), 8703 BPF_MOV64_IMM(BPF_REG_0, 0), 8704 BPF_EXIT_INSN(), 8705 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 8706 BPF_JMP_IMM(BPF_JGT, BPF_REG_0, 1, 2), 8707 BPF_MOV64_IMM(BPF_REG_0, 0), 8708 BPF_EXIT_INSN(), 8709 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 8710 BPF_MOV64_IMM(BPF_REG_0, 0), 8711 BPF_EXIT_INSN(), 8712 }, 8713 .fixup_map_hash_8b = { 3 }, 8714 .errstr = "unbounded min value", 8715 .result = REJECT, 8716 .result_unpriv = REJECT, 8717 }, 8718 { 8719 "subtraction bounds (map value) variant 1", 8720 .insns = { 8721 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8722 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8723 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8724 BPF_LD_MAP_FD(BPF_REG_1, 0), 8725 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8726 BPF_FUNC_map_lookup_elem), 8727 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 8728 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 8729 BPF_JMP_IMM(BPF_JGT, BPF_REG_1, 0xff, 7), 8730 BPF_LDX_MEM(BPF_B, BPF_REG_3, BPF_REG_0, 1), 8731 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 0xff, 5), 8732 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_3), 8733 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 56), 8734 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 8735 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 8736 BPF_EXIT_INSN(), 8737 BPF_MOV64_IMM(BPF_REG_0, 0), 8738 BPF_EXIT_INSN(), 8739 }, 8740 .fixup_map_hash_8b = { 3 }, 8741 .errstr = "R0 max value is outside of the array range", 8742 .result = REJECT, 8743 }, 8744 { 8745 "subtraction bounds (map value) variant 2", 8746 .insns = { 8747 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8748 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8749 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8750 BPF_LD_MAP_FD(BPF_REG_1, 0), 8751 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8752 BPF_FUNC_map_lookup_elem), 8753 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8), 8754 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 8755 BPF_JMP_IMM(BPF_JGT, BPF_REG_1, 0xff, 6), 8756 BPF_LDX_MEM(BPF_B, BPF_REG_3, BPF_REG_0, 1), 8757 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 0xff, 4), 8758 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_3), 8759 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 8760 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 8761 BPF_EXIT_INSN(), 8762 BPF_MOV64_IMM(BPF_REG_0, 0), 8763 BPF_EXIT_INSN(), 8764 }, 8765 .fixup_map_hash_8b = { 3 }, 8766 .errstr = "R0 min value is negative, either use unsigned index or do a if (index >=0) check.", 8767 .result = REJECT, 8768 }, 8769 { 8770 "bounds check based on zero-extended MOV", 8771 .insns = { 8772 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8773 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8774 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8775 BPF_LD_MAP_FD(BPF_REG_1, 0), 8776 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8777 BPF_FUNC_map_lookup_elem), 8778 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 8779 /* r2 = 0x0000'0000'ffff'ffff */ 8780 BPF_MOV32_IMM(BPF_REG_2, 0xffffffff), 8781 /* r2 = 0 */ 8782 BPF_ALU64_IMM(BPF_RSH, BPF_REG_2, 32), 8783 /* no-op */ 8784 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 8785 /* access at offset 0 */ 8786 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 8787 /* exit */ 8788 BPF_MOV64_IMM(BPF_REG_0, 0), 8789 BPF_EXIT_INSN(), 8790 }, 8791 .fixup_map_hash_8b = { 3 }, 8792 .result = ACCEPT 8793 }, 8794 { 8795 "bounds check based on sign-extended MOV. test1", 8796 .insns = { 8797 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8798 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8799 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8800 BPF_LD_MAP_FD(BPF_REG_1, 0), 8801 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8802 BPF_FUNC_map_lookup_elem), 8803 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 8804 /* r2 = 0xffff'ffff'ffff'ffff */ 8805 BPF_MOV64_IMM(BPF_REG_2, 0xffffffff), 8806 /* r2 = 0xffff'ffff */ 8807 BPF_ALU64_IMM(BPF_RSH, BPF_REG_2, 32), 8808 /* r0 = <oob pointer> */ 8809 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 8810 /* access to OOB pointer */ 8811 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 8812 /* exit */ 8813 BPF_MOV64_IMM(BPF_REG_0, 0), 8814 BPF_EXIT_INSN(), 8815 }, 8816 .fixup_map_hash_8b = { 3 }, 8817 .errstr = "map_value pointer and 4294967295", 8818 .result = REJECT 8819 }, 8820 { 8821 "bounds check based on sign-extended MOV. test2", 8822 .insns = { 8823 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8824 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8825 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8826 BPF_LD_MAP_FD(BPF_REG_1, 0), 8827 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8828 BPF_FUNC_map_lookup_elem), 8829 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 8830 /* r2 = 0xffff'ffff'ffff'ffff */ 8831 BPF_MOV64_IMM(BPF_REG_2, 0xffffffff), 8832 /* r2 = 0xfff'ffff */ 8833 BPF_ALU64_IMM(BPF_RSH, BPF_REG_2, 36), 8834 /* r0 = <oob pointer> */ 8835 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 8836 /* access to OOB pointer */ 8837 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 8838 /* exit */ 8839 BPF_MOV64_IMM(BPF_REG_0, 0), 8840 BPF_EXIT_INSN(), 8841 }, 8842 .fixup_map_hash_8b = { 3 }, 8843 .errstr = "R0 min value is outside of the array range", 8844 .result = REJECT 8845 }, 8846 { 8847 "bounds check based on reg_off + var_off + insn_off. test1", 8848 .insns = { 8849 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 8850 offsetof(struct __sk_buff, mark)), 8851 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8852 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8853 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8854 BPF_LD_MAP_FD(BPF_REG_1, 0), 8855 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8856 BPF_FUNC_map_lookup_elem), 8857 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 8858 BPF_ALU64_IMM(BPF_AND, BPF_REG_6, 1), 8859 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, (1 << 29) - 1), 8860 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_6), 8861 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, (1 << 29) - 1), 8862 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 3), 8863 BPF_MOV64_IMM(BPF_REG_0, 0), 8864 BPF_EXIT_INSN(), 8865 }, 8866 .fixup_map_hash_8b = { 4 }, 8867 .errstr = "value_size=8 off=1073741825", 8868 .result = REJECT, 8869 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 8870 }, 8871 { 8872 "bounds check based on reg_off + var_off + insn_off. test2", 8873 .insns = { 8874 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 8875 offsetof(struct __sk_buff, mark)), 8876 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8877 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8878 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8879 BPF_LD_MAP_FD(BPF_REG_1, 0), 8880 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8881 BPF_FUNC_map_lookup_elem), 8882 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 8883 BPF_ALU64_IMM(BPF_AND, BPF_REG_6, 1), 8884 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, (1 << 30) - 1), 8885 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_6), 8886 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, (1 << 29) - 1), 8887 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 3), 8888 BPF_MOV64_IMM(BPF_REG_0, 0), 8889 BPF_EXIT_INSN(), 8890 }, 8891 .fixup_map_hash_8b = { 4 }, 8892 .errstr = "value 1073741823", 8893 .result = REJECT, 8894 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 8895 }, 8896 { 8897 "bounds check after truncation of non-boundary-crossing range", 8898 .insns = { 8899 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8900 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8901 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8902 BPF_LD_MAP_FD(BPF_REG_1, 0), 8903 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8904 BPF_FUNC_map_lookup_elem), 8905 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 8906 /* r1 = [0x00, 0xff] */ 8907 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 8908 BPF_MOV64_IMM(BPF_REG_2, 1), 8909 /* r2 = 0x10'0000'0000 */ 8910 BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 36), 8911 /* r1 = [0x10'0000'0000, 0x10'0000'00ff] */ 8912 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 8913 /* r1 = [0x10'7fff'ffff, 0x10'8000'00fe] */ 8914 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x7fffffff), 8915 /* r1 = [0x00, 0xff] */ 8916 BPF_ALU32_IMM(BPF_SUB, BPF_REG_1, 0x7fffffff), 8917 /* r1 = 0 */ 8918 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8), 8919 /* no-op */ 8920 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 8921 /* access at offset 0 */ 8922 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 8923 /* exit */ 8924 BPF_MOV64_IMM(BPF_REG_0, 0), 8925 BPF_EXIT_INSN(), 8926 }, 8927 .fixup_map_hash_8b = { 3 }, 8928 .result = ACCEPT 8929 }, 8930 { 8931 "bounds check after truncation of boundary-crossing range (1)", 8932 .insns = { 8933 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8934 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8935 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8936 BPF_LD_MAP_FD(BPF_REG_1, 0), 8937 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8938 BPF_FUNC_map_lookup_elem), 8939 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 8940 /* r1 = [0x00, 0xff] */ 8941 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 8942 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0xffffff80 >> 1), 8943 /* r1 = [0xffff'ff80, 0x1'0000'007f] */ 8944 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0xffffff80 >> 1), 8945 /* r1 = [0xffff'ff80, 0xffff'ffff] or 8946 * [0x0000'0000, 0x0000'007f] 8947 */ 8948 BPF_ALU32_IMM(BPF_ADD, BPF_REG_1, 0), 8949 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 0xffffff80 >> 1), 8950 /* r1 = [0x00, 0xff] or 8951 * [0xffff'ffff'0000'0080, 0xffff'ffff'ffff'ffff] 8952 */ 8953 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 0xffffff80 >> 1), 8954 /* r1 = 0 or 8955 * [0x00ff'ffff'ff00'0000, 0x00ff'ffff'ffff'ffff] 8956 */ 8957 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8), 8958 /* no-op or OOB pointer computation */ 8959 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 8960 /* potentially OOB access */ 8961 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 8962 /* exit */ 8963 BPF_MOV64_IMM(BPF_REG_0, 0), 8964 BPF_EXIT_INSN(), 8965 }, 8966 .fixup_map_hash_8b = { 3 }, 8967 /* not actually fully unbounded, but the bound is very high */ 8968 .errstr = "R0 unbounded memory access", 8969 .result = REJECT 8970 }, 8971 { 8972 "bounds check after truncation of boundary-crossing range (2)", 8973 .insns = { 8974 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8975 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8976 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8977 BPF_LD_MAP_FD(BPF_REG_1, 0), 8978 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8979 BPF_FUNC_map_lookup_elem), 8980 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 8981 /* r1 = [0x00, 0xff] */ 8982 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 8983 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0xffffff80 >> 1), 8984 /* r1 = [0xffff'ff80, 0x1'0000'007f] */ 8985 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0xffffff80 >> 1), 8986 /* r1 = [0xffff'ff80, 0xffff'ffff] or 8987 * [0x0000'0000, 0x0000'007f] 8988 * difference to previous test: truncation via MOV32 8989 * instead of ALU32. 8990 */ 8991 BPF_MOV32_REG(BPF_REG_1, BPF_REG_1), 8992 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 0xffffff80 >> 1), 8993 /* r1 = [0x00, 0xff] or 8994 * [0xffff'ffff'0000'0080, 0xffff'ffff'ffff'ffff] 8995 */ 8996 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 0xffffff80 >> 1), 8997 /* r1 = 0 or 8998 * [0x00ff'ffff'ff00'0000, 0x00ff'ffff'ffff'ffff] 8999 */ 9000 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8), 9001 /* no-op or OOB pointer computation */ 9002 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9003 /* potentially OOB access */ 9004 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9005 /* exit */ 9006 BPF_MOV64_IMM(BPF_REG_0, 0), 9007 BPF_EXIT_INSN(), 9008 }, 9009 .fixup_map_hash_8b = { 3 }, 9010 /* not actually fully unbounded, but the bound is very high */ 9011 .errstr = "R0 unbounded memory access", 9012 .result = REJECT 9013 }, 9014 { 9015 "bounds check after wrapping 32-bit addition", 9016 .insns = { 9017 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9018 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9019 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9020 BPF_LD_MAP_FD(BPF_REG_1, 0), 9021 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9022 BPF_FUNC_map_lookup_elem), 9023 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 9024 /* r1 = 0x7fff'ffff */ 9025 BPF_MOV64_IMM(BPF_REG_1, 0x7fffffff), 9026 /* r1 = 0xffff'fffe */ 9027 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x7fffffff), 9028 /* r1 = 0 */ 9029 BPF_ALU32_IMM(BPF_ADD, BPF_REG_1, 2), 9030 /* no-op */ 9031 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9032 /* access at offset 0 */ 9033 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9034 /* exit */ 9035 BPF_MOV64_IMM(BPF_REG_0, 0), 9036 BPF_EXIT_INSN(), 9037 }, 9038 .fixup_map_hash_8b = { 3 }, 9039 .result = ACCEPT 9040 }, 9041 { 9042 "bounds check after shift with oversized count operand", 9043 .insns = { 9044 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9045 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9046 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9047 BPF_LD_MAP_FD(BPF_REG_1, 0), 9048 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9049 BPF_FUNC_map_lookup_elem), 9050 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 9051 BPF_MOV64_IMM(BPF_REG_2, 32), 9052 BPF_MOV64_IMM(BPF_REG_1, 1), 9053 /* r1 = (u32)1 << (u32)32 = ? */ 9054 BPF_ALU32_REG(BPF_LSH, BPF_REG_1, BPF_REG_2), 9055 /* r1 = [0x0000, 0xffff] */ 9056 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xffff), 9057 /* computes unknown pointer, potentially OOB */ 9058 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9059 /* potentially OOB access */ 9060 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9061 /* exit */ 9062 BPF_MOV64_IMM(BPF_REG_0, 0), 9063 BPF_EXIT_INSN(), 9064 }, 9065 .fixup_map_hash_8b = { 3 }, 9066 .errstr = "R0 max value is outside of the array range", 9067 .result = REJECT 9068 }, 9069 { 9070 "bounds check after right shift of maybe-negative number", 9071 .insns = { 9072 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9073 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9074 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9075 BPF_LD_MAP_FD(BPF_REG_1, 0), 9076 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9077 BPF_FUNC_map_lookup_elem), 9078 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 9079 /* r1 = [0x00, 0xff] */ 9080 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 9081 /* r1 = [-0x01, 0xfe] */ 9082 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 1), 9083 /* r1 = 0 or 0xff'ffff'ffff'ffff */ 9084 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8), 9085 /* r1 = 0 or 0xffff'ffff'ffff */ 9086 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8), 9087 /* computes unknown pointer, potentially OOB */ 9088 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9089 /* potentially OOB access */ 9090 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9091 /* exit */ 9092 BPF_MOV64_IMM(BPF_REG_0, 0), 9093 BPF_EXIT_INSN(), 9094 }, 9095 .fixup_map_hash_8b = { 3 }, 9096 .errstr = "R0 unbounded memory access", 9097 .result = REJECT 9098 }, 9099 { 9100 "bounds check map access with off+size signed 32bit overflow. test1", 9101 .insns = { 9102 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9103 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9104 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9105 BPF_LD_MAP_FD(BPF_REG_1, 0), 9106 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9107 BPF_FUNC_map_lookup_elem), 9108 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 9109 BPF_EXIT_INSN(), 9110 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x7ffffffe), 9111 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0), 9112 BPF_JMP_A(0), 9113 BPF_EXIT_INSN(), 9114 }, 9115 .fixup_map_hash_8b = { 3 }, 9116 .errstr = "map_value pointer and 2147483646", 9117 .result = REJECT 9118 }, 9119 { 9120 "bounds check map access with off+size signed 32bit overflow. test2", 9121 .insns = { 9122 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9123 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9124 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9125 BPF_LD_MAP_FD(BPF_REG_1, 0), 9126 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9127 BPF_FUNC_map_lookup_elem), 9128 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 9129 BPF_EXIT_INSN(), 9130 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x1fffffff), 9131 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x1fffffff), 9132 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x1fffffff), 9133 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0), 9134 BPF_JMP_A(0), 9135 BPF_EXIT_INSN(), 9136 }, 9137 .fixup_map_hash_8b = { 3 }, 9138 .errstr = "pointer offset 1073741822", 9139 .result = REJECT 9140 }, 9141 { 9142 "bounds check map access with off+size signed 32bit overflow. test3", 9143 .insns = { 9144 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9145 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9146 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9147 BPF_LD_MAP_FD(BPF_REG_1, 0), 9148 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9149 BPF_FUNC_map_lookup_elem), 9150 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 9151 BPF_EXIT_INSN(), 9152 BPF_ALU64_IMM(BPF_SUB, BPF_REG_0, 0x1fffffff), 9153 BPF_ALU64_IMM(BPF_SUB, BPF_REG_0, 0x1fffffff), 9154 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 2), 9155 BPF_JMP_A(0), 9156 BPF_EXIT_INSN(), 9157 }, 9158 .fixup_map_hash_8b = { 3 }, 9159 .errstr = "pointer offset -1073741822", 9160 .result = REJECT 9161 }, 9162 { 9163 "bounds check map access with off+size signed 32bit overflow. test4", 9164 .insns = { 9165 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9166 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9167 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9168 BPF_LD_MAP_FD(BPF_REG_1, 0), 9169 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9170 BPF_FUNC_map_lookup_elem), 9171 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 9172 BPF_EXIT_INSN(), 9173 BPF_MOV64_IMM(BPF_REG_1, 1000000), 9174 BPF_ALU64_IMM(BPF_MUL, BPF_REG_1, 1000000), 9175 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9176 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 2), 9177 BPF_JMP_A(0), 9178 BPF_EXIT_INSN(), 9179 }, 9180 .fixup_map_hash_8b = { 3 }, 9181 .errstr = "map_value pointer and 1000000000000", 9182 .result = REJECT 9183 }, 9184 { 9185 "pointer/scalar confusion in state equality check (way 1)", 9186 .insns = { 9187 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9188 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9189 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9190 BPF_LD_MAP_FD(BPF_REG_1, 0), 9191 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9192 BPF_FUNC_map_lookup_elem), 9193 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 9194 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0), 9195 BPF_JMP_A(1), 9196 BPF_MOV64_REG(BPF_REG_0, BPF_REG_10), 9197 BPF_JMP_A(0), 9198 BPF_EXIT_INSN(), 9199 }, 9200 .fixup_map_hash_8b = { 3 }, 9201 .result = ACCEPT, 9202 .retval = POINTER_VALUE, 9203 .result_unpriv = REJECT, 9204 .errstr_unpriv = "R0 leaks addr as return value" 9205 }, 9206 { 9207 "pointer/scalar confusion in state equality check (way 2)", 9208 .insns = { 9209 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9210 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9211 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9212 BPF_LD_MAP_FD(BPF_REG_1, 0), 9213 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9214 BPF_FUNC_map_lookup_elem), 9215 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 9216 BPF_MOV64_REG(BPF_REG_0, BPF_REG_10), 9217 BPF_JMP_A(1), 9218 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0), 9219 BPF_EXIT_INSN(), 9220 }, 9221 .fixup_map_hash_8b = { 3 }, 9222 .result = ACCEPT, 9223 .retval = POINTER_VALUE, 9224 .result_unpriv = REJECT, 9225 .errstr_unpriv = "R0 leaks addr as return value" 9226 }, 9227 { 9228 "variable-offset ctx access", 9229 .insns = { 9230 /* Get an unknown value */ 9231 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0), 9232 /* Make it small and 4-byte aligned */ 9233 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4), 9234 /* add it to skb. We now have either &skb->len or 9235 * &skb->pkt_type, but we don't know which 9236 */ 9237 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 9238 /* dereference it */ 9239 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 9240 BPF_EXIT_INSN(), 9241 }, 9242 .errstr = "variable ctx access var_off=(0x0; 0x4)", 9243 .result = REJECT, 9244 .prog_type = BPF_PROG_TYPE_LWT_IN, 9245 }, 9246 { 9247 "variable-offset stack access", 9248 .insns = { 9249 /* Fill the top 8 bytes of the stack */ 9250 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9251 /* Get an unknown value */ 9252 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0), 9253 /* Make it small and 4-byte aligned */ 9254 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4), 9255 BPF_ALU64_IMM(BPF_SUB, BPF_REG_2, 8), 9256 /* add it to fp. We now have either fp-4 or fp-8, but 9257 * we don't know which 9258 */ 9259 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_10), 9260 /* dereference it */ 9261 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_2, 0), 9262 BPF_EXIT_INSN(), 9263 }, 9264 .errstr = "variable stack access var_off=(0xfffffffffffffff8; 0x4)", 9265 .result = REJECT, 9266 .prog_type = BPF_PROG_TYPE_LWT_IN, 9267 }, 9268 { 9269 "indirect variable-offset stack access", 9270 .insns = { 9271 /* Fill the top 8 bytes of the stack */ 9272 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9273 /* Get an unknown value */ 9274 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0), 9275 /* Make it small and 4-byte aligned */ 9276 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4), 9277 BPF_ALU64_IMM(BPF_SUB, BPF_REG_2, 8), 9278 /* add it to fp. We now have either fp-4 or fp-8, but 9279 * we don't know which 9280 */ 9281 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_10), 9282 /* dereference it indirectly */ 9283 BPF_LD_MAP_FD(BPF_REG_1, 0), 9284 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9285 BPF_FUNC_map_lookup_elem), 9286 BPF_MOV64_IMM(BPF_REG_0, 0), 9287 BPF_EXIT_INSN(), 9288 }, 9289 .fixup_map_hash_8b = { 5 }, 9290 .errstr = "variable stack read R2", 9291 .result = REJECT, 9292 .prog_type = BPF_PROG_TYPE_LWT_IN, 9293 }, 9294 { 9295 "direct stack access with 32-bit wraparound. test1", 9296 .insns = { 9297 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 9298 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x7fffffff), 9299 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x7fffffff), 9300 BPF_MOV32_IMM(BPF_REG_0, 0), 9301 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 9302 BPF_EXIT_INSN() 9303 }, 9304 .errstr = "fp pointer and 2147483647", 9305 .result = REJECT 9306 }, 9307 { 9308 "direct stack access with 32-bit wraparound. test2", 9309 .insns = { 9310 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 9311 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x3fffffff), 9312 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x3fffffff), 9313 BPF_MOV32_IMM(BPF_REG_0, 0), 9314 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 9315 BPF_EXIT_INSN() 9316 }, 9317 .errstr = "fp pointer and 1073741823", 9318 .result = REJECT 9319 }, 9320 { 9321 "direct stack access with 32-bit wraparound. test3", 9322 .insns = { 9323 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 9324 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x1fffffff), 9325 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x1fffffff), 9326 BPF_MOV32_IMM(BPF_REG_0, 0), 9327 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 9328 BPF_EXIT_INSN() 9329 }, 9330 .errstr = "fp pointer offset 1073741822", 9331 .result = REJECT 9332 }, 9333 { 9334 "liveness pruning and write screening", 9335 .insns = { 9336 /* Get an unknown value */ 9337 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0), 9338 /* branch conditions teach us nothing about R2 */ 9339 BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1), 9340 BPF_MOV64_IMM(BPF_REG_0, 0), 9341 BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1), 9342 BPF_MOV64_IMM(BPF_REG_0, 0), 9343 BPF_EXIT_INSN(), 9344 }, 9345 .errstr = "R0 !read_ok", 9346 .result = REJECT, 9347 .prog_type = BPF_PROG_TYPE_LWT_IN, 9348 }, 9349 { 9350 "varlen_map_value_access pruning", 9351 .insns = { 9352 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9353 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9354 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9355 BPF_LD_MAP_FD(BPF_REG_1, 0), 9356 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9357 BPF_FUNC_map_lookup_elem), 9358 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8), 9359 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), 9360 BPF_MOV32_IMM(BPF_REG_2, MAX_ENTRIES), 9361 BPF_JMP_REG(BPF_JSGT, BPF_REG_2, BPF_REG_1, 1), 9362 BPF_MOV32_IMM(BPF_REG_1, 0), 9363 BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 2), 9364 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9365 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 9366 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 9367 offsetof(struct test_val, foo)), 9368 BPF_EXIT_INSN(), 9369 }, 9370 .fixup_map_hash_48b = { 3 }, 9371 .errstr_unpriv = "R0 leaks addr", 9372 .errstr = "R0 unbounded memory access", 9373 .result_unpriv = REJECT, 9374 .result = REJECT, 9375 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 9376 }, 9377 { 9378 "invalid 64-bit BPF_END", 9379 .insns = { 9380 BPF_MOV32_IMM(BPF_REG_0, 0), 9381 { 9382 .code = BPF_ALU64 | BPF_END | BPF_TO_LE, 9383 .dst_reg = BPF_REG_0, 9384 .src_reg = 0, 9385 .off = 0, 9386 .imm = 32, 9387 }, 9388 BPF_EXIT_INSN(), 9389 }, 9390 .errstr = "unknown opcode d7", 9391 .result = REJECT, 9392 }, 9393 { 9394 "XDP, using ifindex from netdev", 9395 .insns = { 9396 BPF_MOV64_IMM(BPF_REG_0, 0), 9397 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9398 offsetof(struct xdp_md, ingress_ifindex)), 9399 BPF_JMP_IMM(BPF_JLT, BPF_REG_2, 1, 1), 9400 BPF_MOV64_IMM(BPF_REG_0, 1), 9401 BPF_EXIT_INSN(), 9402 }, 9403 .result = ACCEPT, 9404 .prog_type = BPF_PROG_TYPE_XDP, 9405 .retval = 1, 9406 }, 9407 { 9408 "meta access, test1", 9409 .insns = { 9410 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9411 offsetof(struct xdp_md, data_meta)), 9412 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9413 offsetof(struct xdp_md, data)), 9414 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 9415 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 9416 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 9417 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 9418 BPF_MOV64_IMM(BPF_REG_0, 0), 9419 BPF_EXIT_INSN(), 9420 }, 9421 .result = ACCEPT, 9422 .prog_type = BPF_PROG_TYPE_XDP, 9423 }, 9424 { 9425 "meta access, test2", 9426 .insns = { 9427 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9428 offsetof(struct xdp_md, data_meta)), 9429 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9430 offsetof(struct xdp_md, data)), 9431 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 9432 BPF_ALU64_IMM(BPF_SUB, BPF_REG_0, 8), 9433 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 9434 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8), 9435 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1), 9436 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9437 BPF_MOV64_IMM(BPF_REG_0, 0), 9438 BPF_EXIT_INSN(), 9439 }, 9440 .result = REJECT, 9441 .errstr = "invalid access to packet, off=-8", 9442 .prog_type = BPF_PROG_TYPE_XDP, 9443 }, 9444 { 9445 "meta access, test3", 9446 .insns = { 9447 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9448 offsetof(struct xdp_md, data_meta)), 9449 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9450 offsetof(struct xdp_md, data_end)), 9451 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 9452 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 9453 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 9454 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 9455 BPF_MOV64_IMM(BPF_REG_0, 0), 9456 BPF_EXIT_INSN(), 9457 }, 9458 .result = REJECT, 9459 .errstr = "invalid access to packet", 9460 .prog_type = BPF_PROG_TYPE_XDP, 9461 }, 9462 { 9463 "meta access, test4", 9464 .insns = { 9465 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9466 offsetof(struct xdp_md, data_meta)), 9467 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9468 offsetof(struct xdp_md, data_end)), 9469 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 9470 offsetof(struct xdp_md, data)), 9471 BPF_MOV64_REG(BPF_REG_0, BPF_REG_4), 9472 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 9473 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 9474 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 9475 BPF_MOV64_IMM(BPF_REG_0, 0), 9476 BPF_EXIT_INSN(), 9477 }, 9478 .result = REJECT, 9479 .errstr = "invalid access to packet", 9480 .prog_type = BPF_PROG_TYPE_XDP, 9481 }, 9482 { 9483 "meta access, test5", 9484 .insns = { 9485 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9486 offsetof(struct xdp_md, data_meta)), 9487 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 9488 offsetof(struct xdp_md, data)), 9489 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3), 9490 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 9491 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_4, 3), 9492 BPF_MOV64_IMM(BPF_REG_2, -8), 9493 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9494 BPF_FUNC_xdp_adjust_meta), 9495 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_3, 0), 9496 BPF_MOV64_IMM(BPF_REG_0, 0), 9497 BPF_EXIT_INSN(), 9498 }, 9499 .result = REJECT, 9500 .errstr = "R3 !read_ok", 9501 .prog_type = BPF_PROG_TYPE_XDP, 9502 }, 9503 { 9504 "meta access, test6", 9505 .insns = { 9506 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9507 offsetof(struct xdp_md, data_meta)), 9508 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9509 offsetof(struct xdp_md, data)), 9510 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3), 9511 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 9512 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 9513 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8), 9514 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_0, 1), 9515 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 9516 BPF_MOV64_IMM(BPF_REG_0, 0), 9517 BPF_EXIT_INSN(), 9518 }, 9519 .result = REJECT, 9520 .errstr = "invalid access to packet", 9521 .prog_type = BPF_PROG_TYPE_XDP, 9522 }, 9523 { 9524 "meta access, test7", 9525 .insns = { 9526 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9527 offsetof(struct xdp_md, data_meta)), 9528 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9529 offsetof(struct xdp_md, data)), 9530 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3), 9531 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 9532 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 9533 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8), 9534 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1), 9535 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 9536 BPF_MOV64_IMM(BPF_REG_0, 0), 9537 BPF_EXIT_INSN(), 9538 }, 9539 .result = ACCEPT, 9540 .prog_type = BPF_PROG_TYPE_XDP, 9541 }, 9542 { 9543 "meta access, test8", 9544 .insns = { 9545 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9546 offsetof(struct xdp_md, data_meta)), 9547 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9548 offsetof(struct xdp_md, data)), 9549 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 9550 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 0xFFFF), 9551 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1), 9552 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 9553 BPF_MOV64_IMM(BPF_REG_0, 0), 9554 BPF_EXIT_INSN(), 9555 }, 9556 .result = ACCEPT, 9557 .prog_type = BPF_PROG_TYPE_XDP, 9558 }, 9559 { 9560 "meta access, test9", 9561 .insns = { 9562 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9563 offsetof(struct xdp_md, data_meta)), 9564 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9565 offsetof(struct xdp_md, data)), 9566 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 9567 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 0xFFFF), 9568 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 1), 9569 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1), 9570 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 9571 BPF_MOV64_IMM(BPF_REG_0, 0), 9572 BPF_EXIT_INSN(), 9573 }, 9574 .result = REJECT, 9575 .errstr = "invalid access to packet", 9576 .prog_type = BPF_PROG_TYPE_XDP, 9577 }, 9578 { 9579 "meta access, test10", 9580 .insns = { 9581 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9582 offsetof(struct xdp_md, data_meta)), 9583 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9584 offsetof(struct xdp_md, data)), 9585 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 9586 offsetof(struct xdp_md, data_end)), 9587 BPF_MOV64_IMM(BPF_REG_5, 42), 9588 BPF_MOV64_IMM(BPF_REG_6, 24), 9589 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_5, -8), 9590 BPF_STX_XADD(BPF_DW, BPF_REG_10, BPF_REG_6, -8), 9591 BPF_LDX_MEM(BPF_DW, BPF_REG_5, BPF_REG_10, -8), 9592 BPF_JMP_IMM(BPF_JGT, BPF_REG_5, 100, 6), 9593 BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_5), 9594 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3), 9595 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 9596 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 8), 9597 BPF_JMP_REG(BPF_JGT, BPF_REG_6, BPF_REG_5, 1), 9598 BPF_LDX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 9599 BPF_MOV64_IMM(BPF_REG_0, 0), 9600 BPF_EXIT_INSN(), 9601 }, 9602 .result = REJECT, 9603 .errstr = "invalid access to packet", 9604 .prog_type = BPF_PROG_TYPE_XDP, 9605 }, 9606 { 9607 "meta access, test11", 9608 .insns = { 9609 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9610 offsetof(struct xdp_md, data_meta)), 9611 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9612 offsetof(struct xdp_md, data)), 9613 BPF_MOV64_IMM(BPF_REG_5, 42), 9614 BPF_MOV64_IMM(BPF_REG_6, 24), 9615 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_5, -8), 9616 BPF_STX_XADD(BPF_DW, BPF_REG_10, BPF_REG_6, -8), 9617 BPF_LDX_MEM(BPF_DW, BPF_REG_5, BPF_REG_10, -8), 9618 BPF_JMP_IMM(BPF_JGT, BPF_REG_5, 100, 6), 9619 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_5), 9620 BPF_MOV64_REG(BPF_REG_5, BPF_REG_2), 9621 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 9622 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 8), 9623 BPF_JMP_REG(BPF_JGT, BPF_REG_6, BPF_REG_3, 1), 9624 BPF_LDX_MEM(BPF_B, BPF_REG_5, BPF_REG_5, 0), 9625 BPF_MOV64_IMM(BPF_REG_0, 0), 9626 BPF_EXIT_INSN(), 9627 }, 9628 .result = ACCEPT, 9629 .prog_type = BPF_PROG_TYPE_XDP, 9630 }, 9631 { 9632 "meta access, test12", 9633 .insns = { 9634 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9635 offsetof(struct xdp_md, data_meta)), 9636 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9637 offsetof(struct xdp_md, data)), 9638 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 9639 offsetof(struct xdp_md, data_end)), 9640 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3), 9641 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 16), 9642 BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_4, 5), 9643 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_3, 0), 9644 BPF_MOV64_REG(BPF_REG_5, BPF_REG_2), 9645 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 16), 9646 BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_3, 1), 9647 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 9648 BPF_MOV64_IMM(BPF_REG_0, 0), 9649 BPF_EXIT_INSN(), 9650 }, 9651 .result = ACCEPT, 9652 .prog_type = BPF_PROG_TYPE_XDP, 9653 }, 9654 { 9655 "arithmetic ops make PTR_TO_CTX unusable", 9656 .insns = { 9657 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 9658 offsetof(struct __sk_buff, data) - 9659 offsetof(struct __sk_buff, mark)), 9660 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 9661 offsetof(struct __sk_buff, mark)), 9662 BPF_EXIT_INSN(), 9663 }, 9664 .errstr = "dereference of modified ctx ptr", 9665 .result = REJECT, 9666 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 9667 }, 9668 { 9669 "pkt_end - pkt_start is allowed", 9670 .insns = { 9671 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 9672 offsetof(struct __sk_buff, data_end)), 9673 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9674 offsetof(struct __sk_buff, data)), 9675 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_2), 9676 BPF_EXIT_INSN(), 9677 }, 9678 .result = ACCEPT, 9679 .retval = TEST_DATA_LEN, 9680 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 9681 }, 9682 { 9683 "XDP pkt read, pkt_end mangling, bad access 1", 9684 .insns = { 9685 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9686 offsetof(struct xdp_md, data)), 9687 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9688 offsetof(struct xdp_md, data_end)), 9689 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9690 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9691 BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, 8), 9692 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 9693 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 9694 BPF_MOV64_IMM(BPF_REG_0, 0), 9695 BPF_EXIT_INSN(), 9696 }, 9697 .errstr = "R3 pointer arithmetic on pkt_end", 9698 .result = REJECT, 9699 .prog_type = BPF_PROG_TYPE_XDP, 9700 }, 9701 { 9702 "XDP pkt read, pkt_end mangling, bad access 2", 9703 .insns = { 9704 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9705 offsetof(struct xdp_md, data)), 9706 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9707 offsetof(struct xdp_md, data_end)), 9708 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9709 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9710 BPF_ALU64_IMM(BPF_SUB, BPF_REG_3, 8), 9711 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 9712 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 9713 BPF_MOV64_IMM(BPF_REG_0, 0), 9714 BPF_EXIT_INSN(), 9715 }, 9716 .errstr = "R3 pointer arithmetic on pkt_end", 9717 .result = REJECT, 9718 .prog_type = BPF_PROG_TYPE_XDP, 9719 }, 9720 { 9721 "XDP pkt read, pkt_data' > pkt_end, good access", 9722 .insns = { 9723 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9724 offsetof(struct xdp_md, data)), 9725 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9726 offsetof(struct xdp_md, data_end)), 9727 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9728 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9729 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 9730 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 9731 BPF_MOV64_IMM(BPF_REG_0, 0), 9732 BPF_EXIT_INSN(), 9733 }, 9734 .result = ACCEPT, 9735 .prog_type = BPF_PROG_TYPE_XDP, 9736 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 9737 }, 9738 { 9739 "XDP pkt read, pkt_data' > pkt_end, bad access 1", 9740 .insns = { 9741 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9742 offsetof(struct xdp_md, data)), 9743 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9744 offsetof(struct xdp_md, data_end)), 9745 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9746 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9747 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 9748 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 9749 BPF_MOV64_IMM(BPF_REG_0, 0), 9750 BPF_EXIT_INSN(), 9751 }, 9752 .errstr = "R1 offset is outside of the packet", 9753 .result = REJECT, 9754 .prog_type = BPF_PROG_TYPE_XDP, 9755 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 9756 }, 9757 { 9758 "XDP pkt read, pkt_data' > pkt_end, bad access 2", 9759 .insns = { 9760 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9761 offsetof(struct xdp_md, data)), 9762 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9763 offsetof(struct xdp_md, data_end)), 9764 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9765 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9766 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 0), 9767 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 9768 BPF_MOV64_IMM(BPF_REG_0, 0), 9769 BPF_EXIT_INSN(), 9770 }, 9771 .errstr = "R1 offset is outside of the packet", 9772 .result = REJECT, 9773 .prog_type = BPF_PROG_TYPE_XDP, 9774 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 9775 }, 9776 { 9777 "XDP pkt read, pkt_end > pkt_data', good access", 9778 .insns = { 9779 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9780 offsetof(struct xdp_md, data)), 9781 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9782 offsetof(struct xdp_md, data_end)), 9783 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9784 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9785 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 9786 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 9787 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 9788 BPF_MOV64_IMM(BPF_REG_0, 0), 9789 BPF_EXIT_INSN(), 9790 }, 9791 .result = ACCEPT, 9792 .prog_type = BPF_PROG_TYPE_XDP, 9793 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 9794 }, 9795 { 9796 "XDP pkt read, pkt_end > pkt_data', bad access 1", 9797 .insns = { 9798 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9799 offsetof(struct xdp_md, data)), 9800 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9801 offsetof(struct xdp_md, data_end)), 9802 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9803 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9804 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 9805 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 9806 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 9807 BPF_MOV64_IMM(BPF_REG_0, 0), 9808 BPF_EXIT_INSN(), 9809 }, 9810 .errstr = "R1 offset is outside of the packet", 9811 .result = REJECT, 9812 .prog_type = BPF_PROG_TYPE_XDP, 9813 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 9814 }, 9815 { 9816 "XDP pkt read, pkt_end > pkt_data', bad access 2", 9817 .insns = { 9818 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9819 offsetof(struct xdp_md, data)), 9820 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9821 offsetof(struct xdp_md, data_end)), 9822 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9823 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9824 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 9825 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 9826 BPF_MOV64_IMM(BPF_REG_0, 0), 9827 BPF_EXIT_INSN(), 9828 }, 9829 .errstr = "R1 offset is outside of the packet", 9830 .result = REJECT, 9831 .prog_type = BPF_PROG_TYPE_XDP, 9832 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 9833 }, 9834 { 9835 "XDP pkt read, pkt_data' < pkt_end, good access", 9836 .insns = { 9837 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9838 offsetof(struct xdp_md, data)), 9839 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9840 offsetof(struct xdp_md, data_end)), 9841 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9842 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9843 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 9844 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 9845 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 9846 BPF_MOV64_IMM(BPF_REG_0, 0), 9847 BPF_EXIT_INSN(), 9848 }, 9849 .result = ACCEPT, 9850 .prog_type = BPF_PROG_TYPE_XDP, 9851 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 9852 }, 9853 { 9854 "XDP pkt read, pkt_data' < pkt_end, bad access 1", 9855 .insns = { 9856 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9857 offsetof(struct xdp_md, data)), 9858 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9859 offsetof(struct xdp_md, data_end)), 9860 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9861 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9862 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 9863 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 9864 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 9865 BPF_MOV64_IMM(BPF_REG_0, 0), 9866 BPF_EXIT_INSN(), 9867 }, 9868 .errstr = "R1 offset is outside of the packet", 9869 .result = REJECT, 9870 .prog_type = BPF_PROG_TYPE_XDP, 9871 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 9872 }, 9873 { 9874 "XDP pkt read, pkt_data' < pkt_end, bad access 2", 9875 .insns = { 9876 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9877 offsetof(struct xdp_md, data)), 9878 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9879 offsetof(struct xdp_md, data_end)), 9880 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9881 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9882 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 9883 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 9884 BPF_MOV64_IMM(BPF_REG_0, 0), 9885 BPF_EXIT_INSN(), 9886 }, 9887 .errstr = "R1 offset is outside of the packet", 9888 .result = REJECT, 9889 .prog_type = BPF_PROG_TYPE_XDP, 9890 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 9891 }, 9892 { 9893 "XDP pkt read, pkt_end < pkt_data', good access", 9894 .insns = { 9895 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9896 offsetof(struct xdp_md, data)), 9897 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9898 offsetof(struct xdp_md, data_end)), 9899 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9900 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9901 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1), 9902 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 9903 BPF_MOV64_IMM(BPF_REG_0, 0), 9904 BPF_EXIT_INSN(), 9905 }, 9906 .result = ACCEPT, 9907 .prog_type = BPF_PROG_TYPE_XDP, 9908 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 9909 }, 9910 { 9911 "XDP pkt read, pkt_end < pkt_data', bad access 1", 9912 .insns = { 9913 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9914 offsetof(struct xdp_md, data)), 9915 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9916 offsetof(struct xdp_md, data_end)), 9917 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9918 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9919 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1), 9920 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 9921 BPF_MOV64_IMM(BPF_REG_0, 0), 9922 BPF_EXIT_INSN(), 9923 }, 9924 .errstr = "R1 offset is outside of the packet", 9925 .result = REJECT, 9926 .prog_type = BPF_PROG_TYPE_XDP, 9927 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 9928 }, 9929 { 9930 "XDP pkt read, pkt_end < pkt_data', bad access 2", 9931 .insns = { 9932 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9933 offsetof(struct xdp_md, data)), 9934 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9935 offsetof(struct xdp_md, data_end)), 9936 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9937 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9938 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 0), 9939 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 9940 BPF_MOV64_IMM(BPF_REG_0, 0), 9941 BPF_EXIT_INSN(), 9942 }, 9943 .errstr = "R1 offset is outside of the packet", 9944 .result = REJECT, 9945 .prog_type = BPF_PROG_TYPE_XDP, 9946 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 9947 }, 9948 { 9949 "XDP pkt read, pkt_data' >= pkt_end, good access", 9950 .insns = { 9951 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9952 offsetof(struct xdp_md, data)), 9953 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9954 offsetof(struct xdp_md, data_end)), 9955 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9956 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9957 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), 9958 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 9959 BPF_MOV64_IMM(BPF_REG_0, 0), 9960 BPF_EXIT_INSN(), 9961 }, 9962 .result = ACCEPT, 9963 .prog_type = BPF_PROG_TYPE_XDP, 9964 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 9965 }, 9966 { 9967 "XDP pkt read, pkt_data' >= pkt_end, bad access 1", 9968 .insns = { 9969 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9970 offsetof(struct xdp_md, data)), 9971 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9972 offsetof(struct xdp_md, data_end)), 9973 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9974 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9975 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), 9976 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 9977 BPF_MOV64_IMM(BPF_REG_0, 0), 9978 BPF_EXIT_INSN(), 9979 }, 9980 .errstr = "R1 offset is outside of the packet", 9981 .result = REJECT, 9982 .prog_type = BPF_PROG_TYPE_XDP, 9983 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 9984 }, 9985 { 9986 "XDP pkt read, pkt_data' >= pkt_end, bad access 2", 9987 .insns = { 9988 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9989 offsetof(struct xdp_md, data)), 9990 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9991 offsetof(struct xdp_md, data_end)), 9992 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9993 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9994 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 0), 9995 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 9996 BPF_MOV64_IMM(BPF_REG_0, 0), 9997 BPF_EXIT_INSN(), 9998 }, 9999 .errstr = "R1 offset is outside of the packet", 10000 .result = REJECT, 10001 .prog_type = BPF_PROG_TYPE_XDP, 10002 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10003 }, 10004 { 10005 "XDP pkt read, pkt_end >= pkt_data', good access", 10006 .insns = { 10007 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10008 offsetof(struct xdp_md, data)), 10009 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10010 offsetof(struct xdp_md, data_end)), 10011 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10012 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10013 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 10014 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10015 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10016 BPF_MOV64_IMM(BPF_REG_0, 0), 10017 BPF_EXIT_INSN(), 10018 }, 10019 .result = ACCEPT, 10020 .prog_type = BPF_PROG_TYPE_XDP, 10021 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10022 }, 10023 { 10024 "XDP pkt read, pkt_end >= pkt_data', bad access 1", 10025 .insns = { 10026 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10027 offsetof(struct xdp_md, data)), 10028 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10029 offsetof(struct xdp_md, data_end)), 10030 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10031 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10032 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 10033 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10034 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 10035 BPF_MOV64_IMM(BPF_REG_0, 0), 10036 BPF_EXIT_INSN(), 10037 }, 10038 .errstr = "R1 offset is outside of the packet", 10039 .result = REJECT, 10040 .prog_type = BPF_PROG_TYPE_XDP, 10041 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10042 }, 10043 { 10044 "XDP pkt read, pkt_end >= pkt_data', bad access 2", 10045 .insns = { 10046 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10047 offsetof(struct xdp_md, data)), 10048 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10049 offsetof(struct xdp_md, data_end)), 10050 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10051 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10052 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 10053 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10054 BPF_MOV64_IMM(BPF_REG_0, 0), 10055 BPF_EXIT_INSN(), 10056 }, 10057 .errstr = "R1 offset is outside of the packet", 10058 .result = REJECT, 10059 .prog_type = BPF_PROG_TYPE_XDP, 10060 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10061 }, 10062 { 10063 "XDP pkt read, pkt_data' <= pkt_end, good access", 10064 .insns = { 10065 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10066 offsetof(struct xdp_md, data)), 10067 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10068 offsetof(struct xdp_md, data_end)), 10069 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10070 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10071 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 10072 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10073 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10074 BPF_MOV64_IMM(BPF_REG_0, 0), 10075 BPF_EXIT_INSN(), 10076 }, 10077 .result = ACCEPT, 10078 .prog_type = BPF_PROG_TYPE_XDP, 10079 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10080 }, 10081 { 10082 "XDP pkt read, pkt_data' <= pkt_end, bad access 1", 10083 .insns = { 10084 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10085 offsetof(struct xdp_md, data)), 10086 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10087 offsetof(struct xdp_md, data_end)), 10088 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10089 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10090 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 10091 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10092 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 10093 BPF_MOV64_IMM(BPF_REG_0, 0), 10094 BPF_EXIT_INSN(), 10095 }, 10096 .errstr = "R1 offset is outside of the packet", 10097 .result = REJECT, 10098 .prog_type = BPF_PROG_TYPE_XDP, 10099 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10100 }, 10101 { 10102 "XDP pkt read, pkt_data' <= pkt_end, bad access 2", 10103 .insns = { 10104 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10105 offsetof(struct xdp_md, data)), 10106 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10107 offsetof(struct xdp_md, data_end)), 10108 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10109 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10110 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 10111 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10112 BPF_MOV64_IMM(BPF_REG_0, 0), 10113 BPF_EXIT_INSN(), 10114 }, 10115 .errstr = "R1 offset is outside of the packet", 10116 .result = REJECT, 10117 .prog_type = BPF_PROG_TYPE_XDP, 10118 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10119 }, 10120 { 10121 "XDP pkt read, pkt_end <= pkt_data', good access", 10122 .insns = { 10123 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10124 offsetof(struct xdp_md, data)), 10125 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10126 offsetof(struct xdp_md, data_end)), 10127 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10128 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10129 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), 10130 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 10131 BPF_MOV64_IMM(BPF_REG_0, 0), 10132 BPF_EXIT_INSN(), 10133 }, 10134 .result = ACCEPT, 10135 .prog_type = BPF_PROG_TYPE_XDP, 10136 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10137 }, 10138 { 10139 "XDP pkt read, pkt_end <= pkt_data', bad access 1", 10140 .insns = { 10141 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10142 offsetof(struct xdp_md, data)), 10143 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10144 offsetof(struct xdp_md, data_end)), 10145 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10146 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10147 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), 10148 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10149 BPF_MOV64_IMM(BPF_REG_0, 0), 10150 BPF_EXIT_INSN(), 10151 }, 10152 .errstr = "R1 offset is outside of the packet", 10153 .result = REJECT, 10154 .prog_type = BPF_PROG_TYPE_XDP, 10155 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10156 }, 10157 { 10158 "XDP pkt read, pkt_end <= pkt_data', bad access 2", 10159 .insns = { 10160 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10161 offsetof(struct xdp_md, data)), 10162 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10163 offsetof(struct xdp_md, data_end)), 10164 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10165 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10166 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 0), 10167 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 10168 BPF_MOV64_IMM(BPF_REG_0, 0), 10169 BPF_EXIT_INSN(), 10170 }, 10171 .errstr = "R1 offset is outside of the packet", 10172 .result = REJECT, 10173 .prog_type = BPF_PROG_TYPE_XDP, 10174 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10175 }, 10176 { 10177 "XDP pkt read, pkt_meta' > pkt_data, good access", 10178 .insns = { 10179 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10180 offsetof(struct xdp_md, data_meta)), 10181 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10182 offsetof(struct xdp_md, data)), 10183 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10184 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10185 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 10186 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10187 BPF_MOV64_IMM(BPF_REG_0, 0), 10188 BPF_EXIT_INSN(), 10189 }, 10190 .result = ACCEPT, 10191 .prog_type = BPF_PROG_TYPE_XDP, 10192 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10193 }, 10194 { 10195 "XDP pkt read, pkt_meta' > pkt_data, bad access 1", 10196 .insns = { 10197 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10198 offsetof(struct xdp_md, data_meta)), 10199 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10200 offsetof(struct xdp_md, data)), 10201 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10202 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10203 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 10204 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 10205 BPF_MOV64_IMM(BPF_REG_0, 0), 10206 BPF_EXIT_INSN(), 10207 }, 10208 .errstr = "R1 offset is outside of the packet", 10209 .result = REJECT, 10210 .prog_type = BPF_PROG_TYPE_XDP, 10211 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10212 }, 10213 { 10214 "XDP pkt read, pkt_meta' > pkt_data, bad access 2", 10215 .insns = { 10216 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10217 offsetof(struct xdp_md, data_meta)), 10218 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10219 offsetof(struct xdp_md, data)), 10220 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10221 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10222 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 0), 10223 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10224 BPF_MOV64_IMM(BPF_REG_0, 0), 10225 BPF_EXIT_INSN(), 10226 }, 10227 .errstr = "R1 offset is outside of the packet", 10228 .result = REJECT, 10229 .prog_type = BPF_PROG_TYPE_XDP, 10230 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10231 }, 10232 { 10233 "XDP pkt read, pkt_data > pkt_meta', good access", 10234 .insns = { 10235 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10236 offsetof(struct xdp_md, data_meta)), 10237 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10238 offsetof(struct xdp_md, data)), 10239 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10240 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10241 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 10242 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10243 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 10244 BPF_MOV64_IMM(BPF_REG_0, 0), 10245 BPF_EXIT_INSN(), 10246 }, 10247 .result = ACCEPT, 10248 .prog_type = BPF_PROG_TYPE_XDP, 10249 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10250 }, 10251 { 10252 "XDP pkt read, pkt_data > pkt_meta', bad access 1", 10253 .insns = { 10254 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10255 offsetof(struct xdp_md, data_meta)), 10256 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10257 offsetof(struct xdp_md, data)), 10258 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10259 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10260 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 10261 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10262 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10263 BPF_MOV64_IMM(BPF_REG_0, 0), 10264 BPF_EXIT_INSN(), 10265 }, 10266 .errstr = "R1 offset is outside of the packet", 10267 .result = REJECT, 10268 .prog_type = BPF_PROG_TYPE_XDP, 10269 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10270 }, 10271 { 10272 "XDP pkt read, pkt_data > pkt_meta', bad access 2", 10273 .insns = { 10274 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10275 offsetof(struct xdp_md, data_meta)), 10276 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10277 offsetof(struct xdp_md, data)), 10278 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10279 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10280 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 10281 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10282 BPF_MOV64_IMM(BPF_REG_0, 0), 10283 BPF_EXIT_INSN(), 10284 }, 10285 .errstr = "R1 offset is outside of the packet", 10286 .result = REJECT, 10287 .prog_type = BPF_PROG_TYPE_XDP, 10288 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10289 }, 10290 { 10291 "XDP pkt read, pkt_meta' < pkt_data, good access", 10292 .insns = { 10293 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10294 offsetof(struct xdp_md, data_meta)), 10295 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10296 offsetof(struct xdp_md, data)), 10297 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10298 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10299 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 10300 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10301 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 10302 BPF_MOV64_IMM(BPF_REG_0, 0), 10303 BPF_EXIT_INSN(), 10304 }, 10305 .result = ACCEPT, 10306 .prog_type = BPF_PROG_TYPE_XDP, 10307 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10308 }, 10309 { 10310 "XDP pkt read, pkt_meta' < pkt_data, bad access 1", 10311 .insns = { 10312 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10313 offsetof(struct xdp_md, data_meta)), 10314 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10315 offsetof(struct xdp_md, data)), 10316 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10317 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10318 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 10319 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10320 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10321 BPF_MOV64_IMM(BPF_REG_0, 0), 10322 BPF_EXIT_INSN(), 10323 }, 10324 .errstr = "R1 offset is outside of the packet", 10325 .result = REJECT, 10326 .prog_type = BPF_PROG_TYPE_XDP, 10327 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10328 }, 10329 { 10330 "XDP pkt read, pkt_meta' < pkt_data, bad access 2", 10331 .insns = { 10332 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10333 offsetof(struct xdp_md, data_meta)), 10334 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10335 offsetof(struct xdp_md, data)), 10336 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10337 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10338 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 10339 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10340 BPF_MOV64_IMM(BPF_REG_0, 0), 10341 BPF_EXIT_INSN(), 10342 }, 10343 .errstr = "R1 offset is outside of the packet", 10344 .result = REJECT, 10345 .prog_type = BPF_PROG_TYPE_XDP, 10346 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10347 }, 10348 { 10349 "XDP pkt read, pkt_data < pkt_meta', good access", 10350 .insns = { 10351 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10352 offsetof(struct xdp_md, data_meta)), 10353 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10354 offsetof(struct xdp_md, data)), 10355 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10356 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10357 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1), 10358 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10359 BPF_MOV64_IMM(BPF_REG_0, 0), 10360 BPF_EXIT_INSN(), 10361 }, 10362 .result = ACCEPT, 10363 .prog_type = BPF_PROG_TYPE_XDP, 10364 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10365 }, 10366 { 10367 "XDP pkt read, pkt_data < pkt_meta', bad access 1", 10368 .insns = { 10369 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10370 offsetof(struct xdp_md, data_meta)), 10371 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10372 offsetof(struct xdp_md, data)), 10373 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10374 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10375 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1), 10376 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 10377 BPF_MOV64_IMM(BPF_REG_0, 0), 10378 BPF_EXIT_INSN(), 10379 }, 10380 .errstr = "R1 offset is outside of the packet", 10381 .result = REJECT, 10382 .prog_type = BPF_PROG_TYPE_XDP, 10383 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10384 }, 10385 { 10386 "XDP pkt read, pkt_data < pkt_meta', bad access 2", 10387 .insns = { 10388 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10389 offsetof(struct xdp_md, data_meta)), 10390 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10391 offsetof(struct xdp_md, data)), 10392 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10393 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10394 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 0), 10395 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10396 BPF_MOV64_IMM(BPF_REG_0, 0), 10397 BPF_EXIT_INSN(), 10398 }, 10399 .errstr = "R1 offset is outside of the packet", 10400 .result = REJECT, 10401 .prog_type = BPF_PROG_TYPE_XDP, 10402 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10403 }, 10404 { 10405 "XDP pkt read, pkt_meta' >= pkt_data, good access", 10406 .insns = { 10407 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10408 offsetof(struct xdp_md, data_meta)), 10409 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10410 offsetof(struct xdp_md, data)), 10411 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10412 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10413 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), 10414 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 10415 BPF_MOV64_IMM(BPF_REG_0, 0), 10416 BPF_EXIT_INSN(), 10417 }, 10418 .result = ACCEPT, 10419 .prog_type = BPF_PROG_TYPE_XDP, 10420 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10421 }, 10422 { 10423 "XDP pkt read, pkt_meta' >= pkt_data, bad access 1", 10424 .insns = { 10425 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10426 offsetof(struct xdp_md, data_meta)), 10427 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10428 offsetof(struct xdp_md, data)), 10429 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10430 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10431 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), 10432 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10433 BPF_MOV64_IMM(BPF_REG_0, 0), 10434 BPF_EXIT_INSN(), 10435 }, 10436 .errstr = "R1 offset is outside of the packet", 10437 .result = REJECT, 10438 .prog_type = BPF_PROG_TYPE_XDP, 10439 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10440 }, 10441 { 10442 "XDP pkt read, pkt_meta' >= pkt_data, bad access 2", 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_1, BPF_REG_2), 10449 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10450 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 0), 10451 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 10452 BPF_MOV64_IMM(BPF_REG_0, 0), 10453 BPF_EXIT_INSN(), 10454 }, 10455 .errstr = "R1 offset is outside of the packet", 10456 .result = REJECT, 10457 .prog_type = BPF_PROG_TYPE_XDP, 10458 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10459 }, 10460 { 10461 "XDP pkt read, pkt_data >= pkt_meta', good access", 10462 .insns = { 10463 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10464 offsetof(struct xdp_md, data_meta)), 10465 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10466 offsetof(struct xdp_md, data)), 10467 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10468 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10469 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 10470 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10471 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10472 BPF_MOV64_IMM(BPF_REG_0, 0), 10473 BPF_EXIT_INSN(), 10474 }, 10475 .result = ACCEPT, 10476 .prog_type = BPF_PROG_TYPE_XDP, 10477 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10478 }, 10479 { 10480 "XDP pkt read, pkt_data >= pkt_meta', bad access 1", 10481 .insns = { 10482 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10483 offsetof(struct xdp_md, data_meta)), 10484 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10485 offsetof(struct xdp_md, data)), 10486 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10487 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10488 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 10489 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10490 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 10491 BPF_MOV64_IMM(BPF_REG_0, 0), 10492 BPF_EXIT_INSN(), 10493 }, 10494 .errstr = "R1 offset is outside of the packet", 10495 .result = REJECT, 10496 .prog_type = BPF_PROG_TYPE_XDP, 10497 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10498 }, 10499 { 10500 "XDP pkt read, pkt_data >= pkt_meta', bad access 2", 10501 .insns = { 10502 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10503 offsetof(struct xdp_md, data_meta)), 10504 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10505 offsetof(struct xdp_md, data)), 10506 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10507 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10508 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 10509 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10510 BPF_MOV64_IMM(BPF_REG_0, 0), 10511 BPF_EXIT_INSN(), 10512 }, 10513 .errstr = "R1 offset is outside of the packet", 10514 .result = REJECT, 10515 .prog_type = BPF_PROG_TYPE_XDP, 10516 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10517 }, 10518 { 10519 "XDP pkt read, pkt_meta' <= pkt_data, good access", 10520 .insns = { 10521 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10522 offsetof(struct xdp_md, data_meta)), 10523 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10524 offsetof(struct xdp_md, data)), 10525 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10526 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10527 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 10528 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10529 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10530 BPF_MOV64_IMM(BPF_REG_0, 0), 10531 BPF_EXIT_INSN(), 10532 }, 10533 .result = ACCEPT, 10534 .prog_type = BPF_PROG_TYPE_XDP, 10535 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10536 }, 10537 { 10538 "XDP pkt read, pkt_meta' <= pkt_data, bad access 1", 10539 .insns = { 10540 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10541 offsetof(struct xdp_md, data_meta)), 10542 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10543 offsetof(struct xdp_md, data)), 10544 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10545 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10546 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 10547 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10548 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 10549 BPF_MOV64_IMM(BPF_REG_0, 0), 10550 BPF_EXIT_INSN(), 10551 }, 10552 .errstr = "R1 offset is outside of the packet", 10553 .result = REJECT, 10554 .prog_type = BPF_PROG_TYPE_XDP, 10555 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10556 }, 10557 { 10558 "XDP pkt read, pkt_meta' <= pkt_data, bad access 2", 10559 .insns = { 10560 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10561 offsetof(struct xdp_md, data_meta)), 10562 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10563 offsetof(struct xdp_md, data)), 10564 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10565 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10566 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 10567 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10568 BPF_MOV64_IMM(BPF_REG_0, 0), 10569 BPF_EXIT_INSN(), 10570 }, 10571 .errstr = "R1 offset is outside of the packet", 10572 .result = REJECT, 10573 .prog_type = BPF_PROG_TYPE_XDP, 10574 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10575 }, 10576 { 10577 "XDP pkt read, pkt_data <= pkt_meta', good access", 10578 .insns = { 10579 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10580 offsetof(struct xdp_md, data_meta)), 10581 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10582 offsetof(struct xdp_md, data)), 10583 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10584 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10585 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), 10586 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 10587 BPF_MOV64_IMM(BPF_REG_0, 0), 10588 BPF_EXIT_INSN(), 10589 }, 10590 .result = ACCEPT, 10591 .prog_type = BPF_PROG_TYPE_XDP, 10592 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10593 }, 10594 { 10595 "XDP pkt read, pkt_data <= pkt_meta', bad access 1", 10596 .insns = { 10597 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10598 offsetof(struct xdp_md, data_meta)), 10599 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10600 offsetof(struct xdp_md, data)), 10601 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10602 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10603 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), 10604 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10605 BPF_MOV64_IMM(BPF_REG_0, 0), 10606 BPF_EXIT_INSN(), 10607 }, 10608 .errstr = "R1 offset is outside of the packet", 10609 .result = REJECT, 10610 .prog_type = BPF_PROG_TYPE_XDP, 10611 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10612 }, 10613 { 10614 "XDP pkt read, pkt_data <= pkt_meta', bad access 2", 10615 .insns = { 10616 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10617 offsetof(struct xdp_md, data_meta)), 10618 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10619 offsetof(struct xdp_md, data)), 10620 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10621 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10622 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 0), 10623 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 10624 BPF_MOV64_IMM(BPF_REG_0, 0), 10625 BPF_EXIT_INSN(), 10626 }, 10627 .errstr = "R1 offset is outside of the packet", 10628 .result = REJECT, 10629 .prog_type = BPF_PROG_TYPE_XDP, 10630 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10631 }, 10632 { 10633 "check deducing bounds from const, 1", 10634 .insns = { 10635 BPF_MOV64_IMM(BPF_REG_0, 1), 10636 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 1, 0), 10637 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 10638 BPF_EXIT_INSN(), 10639 }, 10640 .result = REJECT, 10641 .errstr = "R0 tried to subtract pointer from scalar", 10642 }, 10643 { 10644 "check deducing bounds from const, 2", 10645 .insns = { 10646 BPF_MOV64_IMM(BPF_REG_0, 1), 10647 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 1, 1), 10648 BPF_EXIT_INSN(), 10649 BPF_JMP_IMM(BPF_JSLE, BPF_REG_0, 1, 1), 10650 BPF_EXIT_INSN(), 10651 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0), 10652 BPF_EXIT_INSN(), 10653 }, 10654 .result = ACCEPT, 10655 .retval = 1, 10656 }, 10657 { 10658 "check deducing bounds from const, 3", 10659 .insns = { 10660 BPF_MOV64_IMM(BPF_REG_0, 0), 10661 BPF_JMP_IMM(BPF_JSLE, BPF_REG_0, 0, 0), 10662 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 10663 BPF_EXIT_INSN(), 10664 }, 10665 .result = REJECT, 10666 .errstr = "R0 tried to subtract pointer from scalar", 10667 }, 10668 { 10669 "check deducing bounds from const, 4", 10670 .insns = { 10671 BPF_MOV64_IMM(BPF_REG_0, 0), 10672 BPF_JMP_IMM(BPF_JSLE, BPF_REG_0, 0, 1), 10673 BPF_EXIT_INSN(), 10674 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 1), 10675 BPF_EXIT_INSN(), 10676 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0), 10677 BPF_EXIT_INSN(), 10678 }, 10679 .result = ACCEPT, 10680 }, 10681 { 10682 "check deducing bounds from const, 5", 10683 .insns = { 10684 BPF_MOV64_IMM(BPF_REG_0, 0), 10685 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 1, 1), 10686 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 10687 BPF_EXIT_INSN(), 10688 }, 10689 .result = REJECT, 10690 .errstr = "R0 tried to subtract pointer from scalar", 10691 }, 10692 { 10693 "check deducing bounds from const, 6", 10694 .insns = { 10695 BPF_MOV64_IMM(BPF_REG_0, 0), 10696 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 1), 10697 BPF_EXIT_INSN(), 10698 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 10699 BPF_EXIT_INSN(), 10700 }, 10701 .result = REJECT, 10702 .errstr = "R0 tried to subtract pointer from scalar", 10703 }, 10704 { 10705 "check deducing bounds from const, 7", 10706 .insns = { 10707 BPF_MOV64_IMM(BPF_REG_0, ~0), 10708 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 0), 10709 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0), 10710 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 10711 offsetof(struct __sk_buff, mark)), 10712 BPF_EXIT_INSN(), 10713 }, 10714 .result = REJECT, 10715 .errstr = "dereference of modified ctx ptr", 10716 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10717 }, 10718 { 10719 "check deducing bounds from const, 8", 10720 .insns = { 10721 BPF_MOV64_IMM(BPF_REG_0, ~0), 10722 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 1), 10723 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), 10724 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 10725 offsetof(struct __sk_buff, mark)), 10726 BPF_EXIT_INSN(), 10727 }, 10728 .result = REJECT, 10729 .errstr = "dereference of modified ctx ptr", 10730 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10731 }, 10732 { 10733 "check deducing bounds from const, 9", 10734 .insns = { 10735 BPF_MOV64_IMM(BPF_REG_0, 0), 10736 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 0), 10737 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 10738 BPF_EXIT_INSN(), 10739 }, 10740 .result = REJECT, 10741 .errstr = "R0 tried to subtract pointer from scalar", 10742 }, 10743 { 10744 "check deducing bounds from const, 10", 10745 .insns = { 10746 BPF_MOV64_IMM(BPF_REG_0, 0), 10747 BPF_JMP_IMM(BPF_JSLE, BPF_REG_0, 0, 0), 10748 /* Marks reg as unknown. */ 10749 BPF_ALU64_IMM(BPF_NEG, BPF_REG_0, 0), 10750 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 10751 BPF_EXIT_INSN(), 10752 }, 10753 .result = REJECT, 10754 .errstr = "math between ctx pointer and register with unbounded min value is not allowed", 10755 }, 10756 { 10757 "bpf_exit with invalid return code. test1", 10758 .insns = { 10759 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 10760 BPF_EXIT_INSN(), 10761 }, 10762 .errstr = "R0 has value (0x0; 0xffffffff)", 10763 .result = REJECT, 10764 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 10765 }, 10766 { 10767 "bpf_exit with invalid return code. test2", 10768 .insns = { 10769 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 10770 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 10771 BPF_EXIT_INSN(), 10772 }, 10773 .result = ACCEPT, 10774 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 10775 }, 10776 { 10777 "bpf_exit with invalid return code. test3", 10778 .insns = { 10779 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 10780 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 3), 10781 BPF_EXIT_INSN(), 10782 }, 10783 .errstr = "R0 has value (0x0; 0x3)", 10784 .result = REJECT, 10785 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 10786 }, 10787 { 10788 "bpf_exit with invalid return code. test4", 10789 .insns = { 10790 BPF_MOV64_IMM(BPF_REG_0, 1), 10791 BPF_EXIT_INSN(), 10792 }, 10793 .result = ACCEPT, 10794 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 10795 }, 10796 { 10797 "bpf_exit with invalid return code. test5", 10798 .insns = { 10799 BPF_MOV64_IMM(BPF_REG_0, 2), 10800 BPF_EXIT_INSN(), 10801 }, 10802 .errstr = "R0 has value (0x2; 0x0)", 10803 .result = REJECT, 10804 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 10805 }, 10806 { 10807 "bpf_exit with invalid return code. test6", 10808 .insns = { 10809 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 10810 BPF_EXIT_INSN(), 10811 }, 10812 .errstr = "R0 is not a known value (ctx)", 10813 .result = REJECT, 10814 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 10815 }, 10816 { 10817 "bpf_exit with invalid return code. test7", 10818 .insns = { 10819 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 10820 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4), 10821 BPF_ALU64_REG(BPF_MUL, BPF_REG_0, BPF_REG_2), 10822 BPF_EXIT_INSN(), 10823 }, 10824 .errstr = "R0 has unknown scalar value", 10825 .result = REJECT, 10826 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 10827 }, 10828 { 10829 "calls: basic sanity", 10830 .insns = { 10831 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 10832 BPF_MOV64_IMM(BPF_REG_0, 1), 10833 BPF_EXIT_INSN(), 10834 BPF_MOV64_IMM(BPF_REG_0, 2), 10835 BPF_EXIT_INSN(), 10836 }, 10837 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 10838 .result = ACCEPT, 10839 }, 10840 { 10841 "calls: not on unpriviledged", 10842 .insns = { 10843 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 10844 BPF_MOV64_IMM(BPF_REG_0, 1), 10845 BPF_EXIT_INSN(), 10846 BPF_MOV64_IMM(BPF_REG_0, 2), 10847 BPF_EXIT_INSN(), 10848 }, 10849 .errstr_unpriv = "function calls to other bpf functions are allowed for root only", 10850 .result_unpriv = REJECT, 10851 .result = ACCEPT, 10852 .retval = 1, 10853 }, 10854 { 10855 "calls: div by 0 in subprog", 10856 .insns = { 10857 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 10858 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8), 10859 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 10860 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 10861 offsetof(struct __sk_buff, data_end)), 10862 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 10863 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8), 10864 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1), 10865 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 10866 BPF_MOV64_IMM(BPF_REG_0, 1), 10867 BPF_EXIT_INSN(), 10868 BPF_MOV32_IMM(BPF_REG_2, 0), 10869 BPF_MOV32_IMM(BPF_REG_3, 1), 10870 BPF_ALU32_REG(BPF_DIV, BPF_REG_3, BPF_REG_2), 10871 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 10872 offsetof(struct __sk_buff, data)), 10873 BPF_EXIT_INSN(), 10874 }, 10875 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 10876 .result = ACCEPT, 10877 .retval = 1, 10878 }, 10879 { 10880 "calls: multiple ret types in subprog 1", 10881 .insns = { 10882 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 10883 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8), 10884 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 10885 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 10886 offsetof(struct __sk_buff, data_end)), 10887 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 10888 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8), 10889 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1), 10890 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 10891 BPF_MOV64_IMM(BPF_REG_0, 1), 10892 BPF_EXIT_INSN(), 10893 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 10894 offsetof(struct __sk_buff, data)), 10895 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 10896 BPF_MOV32_IMM(BPF_REG_0, 42), 10897 BPF_EXIT_INSN(), 10898 }, 10899 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 10900 .result = REJECT, 10901 .errstr = "R0 invalid mem access 'inv'", 10902 }, 10903 { 10904 "calls: multiple ret types in subprog 2", 10905 .insns = { 10906 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 10907 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8), 10908 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 10909 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 10910 offsetof(struct __sk_buff, data_end)), 10911 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 10912 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8), 10913 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1), 10914 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 10915 BPF_MOV64_IMM(BPF_REG_0, 1), 10916 BPF_EXIT_INSN(), 10917 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 10918 offsetof(struct __sk_buff, data)), 10919 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 10920 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 9), 10921 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 10922 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10923 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 10924 BPF_LD_MAP_FD(BPF_REG_1, 0), 10925 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 10926 BPF_FUNC_map_lookup_elem), 10927 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 10928 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_6, 10929 offsetof(struct __sk_buff, data)), 10930 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 64), 10931 BPF_EXIT_INSN(), 10932 }, 10933 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 10934 .fixup_map_hash_8b = { 16 }, 10935 .result = REJECT, 10936 .errstr = "R0 min value is outside of the array range", 10937 }, 10938 { 10939 "calls: overlapping caller/callee", 10940 .insns = { 10941 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 0), 10942 BPF_MOV64_IMM(BPF_REG_0, 1), 10943 BPF_EXIT_INSN(), 10944 }, 10945 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 10946 .errstr = "last insn is not an exit or jmp", 10947 .result = REJECT, 10948 }, 10949 { 10950 "calls: wrong recursive calls", 10951 .insns = { 10952 BPF_JMP_IMM(BPF_JA, 0, 0, 4), 10953 BPF_JMP_IMM(BPF_JA, 0, 0, 4), 10954 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -2), 10955 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -2), 10956 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -2), 10957 BPF_MOV64_IMM(BPF_REG_0, 1), 10958 BPF_EXIT_INSN(), 10959 }, 10960 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 10961 .errstr = "jump out of range", 10962 .result = REJECT, 10963 }, 10964 { 10965 "calls: wrong src reg", 10966 .insns = { 10967 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 2, 0, 0), 10968 BPF_MOV64_IMM(BPF_REG_0, 1), 10969 BPF_EXIT_INSN(), 10970 }, 10971 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 10972 .errstr = "BPF_CALL uses reserved fields", 10973 .result = REJECT, 10974 }, 10975 { 10976 "calls: wrong off value", 10977 .insns = { 10978 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, -1, 2), 10979 BPF_MOV64_IMM(BPF_REG_0, 1), 10980 BPF_EXIT_INSN(), 10981 BPF_MOV64_IMM(BPF_REG_0, 2), 10982 BPF_EXIT_INSN(), 10983 }, 10984 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 10985 .errstr = "BPF_CALL uses reserved fields", 10986 .result = REJECT, 10987 }, 10988 { 10989 "calls: jump back loop", 10990 .insns = { 10991 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -1), 10992 BPF_MOV64_IMM(BPF_REG_0, 1), 10993 BPF_EXIT_INSN(), 10994 }, 10995 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 10996 .errstr = "back-edge from insn 0 to 0", 10997 .result = REJECT, 10998 }, 10999 { 11000 "calls: conditional call", 11001 .insns = { 11002 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11003 offsetof(struct __sk_buff, mark)), 11004 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 11005 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 11006 BPF_MOV64_IMM(BPF_REG_0, 1), 11007 BPF_EXIT_INSN(), 11008 BPF_MOV64_IMM(BPF_REG_0, 2), 11009 BPF_EXIT_INSN(), 11010 }, 11011 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11012 .errstr = "jump out of range", 11013 .result = REJECT, 11014 }, 11015 { 11016 "calls: conditional call 2", 11017 .insns = { 11018 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11019 offsetof(struct __sk_buff, mark)), 11020 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 11021 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 11022 BPF_MOV64_IMM(BPF_REG_0, 1), 11023 BPF_EXIT_INSN(), 11024 BPF_MOV64_IMM(BPF_REG_0, 2), 11025 BPF_EXIT_INSN(), 11026 BPF_MOV64_IMM(BPF_REG_0, 3), 11027 BPF_EXIT_INSN(), 11028 }, 11029 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11030 .result = ACCEPT, 11031 }, 11032 { 11033 "calls: conditional call 3", 11034 .insns = { 11035 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11036 offsetof(struct __sk_buff, mark)), 11037 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 11038 BPF_JMP_IMM(BPF_JA, 0, 0, 4), 11039 BPF_MOV64_IMM(BPF_REG_0, 1), 11040 BPF_EXIT_INSN(), 11041 BPF_MOV64_IMM(BPF_REG_0, 1), 11042 BPF_JMP_IMM(BPF_JA, 0, 0, -6), 11043 BPF_MOV64_IMM(BPF_REG_0, 3), 11044 BPF_JMP_IMM(BPF_JA, 0, 0, -6), 11045 }, 11046 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11047 .errstr = "back-edge from insn", 11048 .result = REJECT, 11049 }, 11050 { 11051 "calls: conditional call 4", 11052 .insns = { 11053 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11054 offsetof(struct __sk_buff, mark)), 11055 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 11056 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 11057 BPF_MOV64_IMM(BPF_REG_0, 1), 11058 BPF_EXIT_INSN(), 11059 BPF_MOV64_IMM(BPF_REG_0, 1), 11060 BPF_JMP_IMM(BPF_JA, 0, 0, -5), 11061 BPF_MOV64_IMM(BPF_REG_0, 3), 11062 BPF_EXIT_INSN(), 11063 }, 11064 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11065 .result = ACCEPT, 11066 }, 11067 { 11068 "calls: conditional call 5", 11069 .insns = { 11070 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11071 offsetof(struct __sk_buff, mark)), 11072 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 11073 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 11074 BPF_MOV64_IMM(BPF_REG_0, 1), 11075 BPF_EXIT_INSN(), 11076 BPF_MOV64_IMM(BPF_REG_0, 1), 11077 BPF_JMP_IMM(BPF_JA, 0, 0, -6), 11078 BPF_MOV64_IMM(BPF_REG_0, 3), 11079 BPF_EXIT_INSN(), 11080 }, 11081 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11082 .errstr = "back-edge from insn", 11083 .result = REJECT, 11084 }, 11085 { 11086 "calls: conditional call 6", 11087 .insns = { 11088 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 11089 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, -2), 11090 BPF_EXIT_INSN(), 11091 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11092 offsetof(struct __sk_buff, mark)), 11093 BPF_EXIT_INSN(), 11094 }, 11095 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11096 .errstr = "back-edge from insn", 11097 .result = REJECT, 11098 }, 11099 { 11100 "calls: using r0 returned by callee", 11101 .insns = { 11102 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11103 BPF_EXIT_INSN(), 11104 BPF_MOV64_IMM(BPF_REG_0, 2), 11105 BPF_EXIT_INSN(), 11106 }, 11107 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11108 .result = ACCEPT, 11109 }, 11110 { 11111 "calls: using uninit r0 from callee", 11112 .insns = { 11113 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11114 BPF_EXIT_INSN(), 11115 BPF_EXIT_INSN(), 11116 }, 11117 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11118 .errstr = "!read_ok", 11119 .result = REJECT, 11120 }, 11121 { 11122 "calls: callee is using r1", 11123 .insns = { 11124 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11125 BPF_EXIT_INSN(), 11126 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11127 offsetof(struct __sk_buff, len)), 11128 BPF_EXIT_INSN(), 11129 }, 11130 .prog_type = BPF_PROG_TYPE_SCHED_ACT, 11131 .result = ACCEPT, 11132 .retval = TEST_DATA_LEN, 11133 }, 11134 { 11135 "calls: callee using args1", 11136 .insns = { 11137 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11138 BPF_EXIT_INSN(), 11139 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 11140 BPF_EXIT_INSN(), 11141 }, 11142 .errstr_unpriv = "allowed for root only", 11143 .result_unpriv = REJECT, 11144 .result = ACCEPT, 11145 .retval = POINTER_VALUE, 11146 }, 11147 { 11148 "calls: callee using wrong args2", 11149 .insns = { 11150 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11151 BPF_EXIT_INSN(), 11152 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 11153 BPF_EXIT_INSN(), 11154 }, 11155 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11156 .errstr = "R2 !read_ok", 11157 .result = REJECT, 11158 }, 11159 { 11160 "calls: callee using two args", 11161 .insns = { 11162 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11163 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_6, 11164 offsetof(struct __sk_buff, len)), 11165 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_6, 11166 offsetof(struct __sk_buff, len)), 11167 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11168 BPF_EXIT_INSN(), 11169 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 11170 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 11171 BPF_EXIT_INSN(), 11172 }, 11173 .errstr_unpriv = "allowed for root only", 11174 .result_unpriv = REJECT, 11175 .result = ACCEPT, 11176 .retval = TEST_DATA_LEN + TEST_DATA_LEN - ETH_HLEN - ETH_HLEN, 11177 }, 11178 { 11179 "calls: callee changing pkt pointers", 11180 .insns = { 11181 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 11182 offsetof(struct xdp_md, data)), 11183 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 11184 offsetof(struct xdp_md, data_end)), 11185 BPF_MOV64_REG(BPF_REG_8, BPF_REG_6), 11186 BPF_ALU64_IMM(BPF_ADD, BPF_REG_8, 8), 11187 BPF_JMP_REG(BPF_JGT, BPF_REG_8, BPF_REG_7, 2), 11188 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 11189 /* clear_all_pkt_pointers() has to walk all frames 11190 * to make sure that pkt pointers in the caller 11191 * are cleared when callee is calling a helper that 11192 * adjusts packet size 11193 */ 11194 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 11195 BPF_MOV32_IMM(BPF_REG_0, 0), 11196 BPF_EXIT_INSN(), 11197 BPF_MOV64_IMM(BPF_REG_2, 0), 11198 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 11199 BPF_FUNC_xdp_adjust_head), 11200 BPF_EXIT_INSN(), 11201 }, 11202 .result = REJECT, 11203 .errstr = "R6 invalid mem access 'inv'", 11204 .prog_type = BPF_PROG_TYPE_XDP, 11205 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11206 }, 11207 { 11208 "calls: two calls with args", 11209 .insns = { 11210 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11211 BPF_EXIT_INSN(), 11212 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11213 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6), 11214 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0), 11215 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 11216 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 11217 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0), 11218 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 11219 BPF_EXIT_INSN(), 11220 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11221 offsetof(struct __sk_buff, len)), 11222 BPF_EXIT_INSN(), 11223 }, 11224 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11225 .result = ACCEPT, 11226 .retval = TEST_DATA_LEN + TEST_DATA_LEN, 11227 }, 11228 { 11229 "calls: calls with stack arith", 11230 .insns = { 11231 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11232 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -64), 11233 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11234 BPF_EXIT_INSN(), 11235 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -64), 11236 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11237 BPF_EXIT_INSN(), 11238 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -64), 11239 BPF_MOV64_IMM(BPF_REG_0, 42), 11240 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 11241 BPF_EXIT_INSN(), 11242 }, 11243 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11244 .result = ACCEPT, 11245 .retval = 42, 11246 }, 11247 { 11248 "calls: calls with misaligned stack access", 11249 .insns = { 11250 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11251 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -63), 11252 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11253 BPF_EXIT_INSN(), 11254 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -61), 11255 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11256 BPF_EXIT_INSN(), 11257 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -63), 11258 BPF_MOV64_IMM(BPF_REG_0, 42), 11259 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 11260 BPF_EXIT_INSN(), 11261 }, 11262 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11263 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 11264 .errstr = "misaligned stack access", 11265 .result = REJECT, 11266 }, 11267 { 11268 "calls: calls control flow, jump test", 11269 .insns = { 11270 BPF_MOV64_IMM(BPF_REG_0, 42), 11271 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 11272 BPF_MOV64_IMM(BPF_REG_0, 43), 11273 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 11274 BPF_JMP_IMM(BPF_JA, 0, 0, -3), 11275 BPF_EXIT_INSN(), 11276 }, 11277 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11278 .result = ACCEPT, 11279 .retval = 43, 11280 }, 11281 { 11282 "calls: calls control flow, jump test 2", 11283 .insns = { 11284 BPF_MOV64_IMM(BPF_REG_0, 42), 11285 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 11286 BPF_MOV64_IMM(BPF_REG_0, 43), 11287 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 11288 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -3), 11289 BPF_EXIT_INSN(), 11290 }, 11291 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11292 .errstr = "jump out of range from insn 1 to 4", 11293 .result = REJECT, 11294 }, 11295 { 11296 "calls: two calls with bad jump", 11297 .insns = { 11298 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11299 BPF_EXIT_INSN(), 11300 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11301 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6), 11302 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0), 11303 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 11304 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 11305 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0), 11306 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 11307 BPF_EXIT_INSN(), 11308 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11309 offsetof(struct __sk_buff, len)), 11310 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, -3), 11311 BPF_EXIT_INSN(), 11312 }, 11313 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11314 .errstr = "jump out of range from insn 11 to 9", 11315 .result = REJECT, 11316 }, 11317 { 11318 "calls: recursive call. test1", 11319 .insns = { 11320 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11321 BPF_EXIT_INSN(), 11322 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -1), 11323 BPF_EXIT_INSN(), 11324 }, 11325 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11326 .errstr = "back-edge", 11327 .result = REJECT, 11328 }, 11329 { 11330 "calls: recursive call. test2", 11331 .insns = { 11332 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11333 BPF_EXIT_INSN(), 11334 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -3), 11335 BPF_EXIT_INSN(), 11336 }, 11337 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11338 .errstr = "back-edge", 11339 .result = REJECT, 11340 }, 11341 { 11342 "calls: unreachable code", 11343 .insns = { 11344 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11345 BPF_EXIT_INSN(), 11346 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11347 BPF_EXIT_INSN(), 11348 BPF_MOV64_IMM(BPF_REG_0, 0), 11349 BPF_EXIT_INSN(), 11350 BPF_MOV64_IMM(BPF_REG_0, 0), 11351 BPF_EXIT_INSN(), 11352 }, 11353 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11354 .errstr = "unreachable insn 6", 11355 .result = REJECT, 11356 }, 11357 { 11358 "calls: invalid call", 11359 .insns = { 11360 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11361 BPF_EXIT_INSN(), 11362 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -4), 11363 BPF_EXIT_INSN(), 11364 }, 11365 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11366 .errstr = "invalid destination", 11367 .result = REJECT, 11368 }, 11369 { 11370 "calls: invalid call 2", 11371 .insns = { 11372 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11373 BPF_EXIT_INSN(), 11374 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 0x7fffffff), 11375 BPF_EXIT_INSN(), 11376 }, 11377 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11378 .errstr = "invalid destination", 11379 .result = REJECT, 11380 }, 11381 { 11382 "calls: jumping across function bodies. test1", 11383 .insns = { 11384 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 11385 BPF_MOV64_IMM(BPF_REG_0, 0), 11386 BPF_EXIT_INSN(), 11387 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, -3), 11388 BPF_EXIT_INSN(), 11389 }, 11390 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11391 .errstr = "jump out of range", 11392 .result = REJECT, 11393 }, 11394 { 11395 "calls: jumping across function bodies. test2", 11396 .insns = { 11397 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3), 11398 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 11399 BPF_MOV64_IMM(BPF_REG_0, 0), 11400 BPF_EXIT_INSN(), 11401 BPF_EXIT_INSN(), 11402 }, 11403 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11404 .errstr = "jump out of range", 11405 .result = REJECT, 11406 }, 11407 { 11408 "calls: call without exit", 11409 .insns = { 11410 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11411 BPF_EXIT_INSN(), 11412 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11413 BPF_EXIT_INSN(), 11414 BPF_MOV64_IMM(BPF_REG_0, 0), 11415 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, -2), 11416 }, 11417 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11418 .errstr = "not an exit", 11419 .result = REJECT, 11420 }, 11421 { 11422 "calls: call into middle of ld_imm64", 11423 .insns = { 11424 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 11425 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 11426 BPF_MOV64_IMM(BPF_REG_0, 0), 11427 BPF_EXIT_INSN(), 11428 BPF_LD_IMM64(BPF_REG_0, 0), 11429 BPF_EXIT_INSN(), 11430 }, 11431 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11432 .errstr = "last insn", 11433 .result = REJECT, 11434 }, 11435 { 11436 "calls: call into middle of other call", 11437 .insns = { 11438 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 11439 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 11440 BPF_MOV64_IMM(BPF_REG_0, 0), 11441 BPF_EXIT_INSN(), 11442 BPF_MOV64_IMM(BPF_REG_0, 0), 11443 BPF_MOV64_IMM(BPF_REG_0, 0), 11444 BPF_EXIT_INSN(), 11445 }, 11446 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11447 .errstr = "last insn", 11448 .result = REJECT, 11449 }, 11450 { 11451 "calls: ld_abs with changing ctx data in callee", 11452 .insns = { 11453 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11454 BPF_LD_ABS(BPF_B, 0), 11455 BPF_LD_ABS(BPF_H, 0), 11456 BPF_LD_ABS(BPF_W, 0), 11457 BPF_MOV64_REG(BPF_REG_7, BPF_REG_6), 11458 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 5), 11459 BPF_MOV64_REG(BPF_REG_6, BPF_REG_7), 11460 BPF_LD_ABS(BPF_B, 0), 11461 BPF_LD_ABS(BPF_H, 0), 11462 BPF_LD_ABS(BPF_W, 0), 11463 BPF_EXIT_INSN(), 11464 BPF_MOV64_IMM(BPF_REG_2, 1), 11465 BPF_MOV64_IMM(BPF_REG_3, 2), 11466 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 11467 BPF_FUNC_skb_vlan_push), 11468 BPF_EXIT_INSN(), 11469 }, 11470 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11471 .errstr = "BPF_LD_[ABS|IND] instructions cannot be mixed", 11472 .result = REJECT, 11473 }, 11474 { 11475 "calls: two calls with bad fallthrough", 11476 .insns = { 11477 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11478 BPF_EXIT_INSN(), 11479 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11480 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6), 11481 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0), 11482 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 11483 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 11484 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0), 11485 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 11486 BPF_MOV64_REG(BPF_REG_0, BPF_REG_0), 11487 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11488 offsetof(struct __sk_buff, len)), 11489 BPF_EXIT_INSN(), 11490 }, 11491 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11492 .errstr = "not an exit", 11493 .result = REJECT, 11494 }, 11495 { 11496 "calls: two calls with stack read", 11497 .insns = { 11498 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 11499 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 11500 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 11501 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11502 BPF_EXIT_INSN(), 11503 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11504 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6), 11505 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0), 11506 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 11507 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 11508 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0), 11509 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 11510 BPF_EXIT_INSN(), 11511 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 11512 BPF_EXIT_INSN(), 11513 }, 11514 .prog_type = BPF_PROG_TYPE_XDP, 11515 .result = ACCEPT, 11516 }, 11517 { 11518 "calls: two calls with stack write", 11519 .insns = { 11520 /* main prog */ 11521 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 11522 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 11523 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 11524 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11525 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 11526 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 11527 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -16), 11528 BPF_EXIT_INSN(), 11529 11530 /* subprog 1 */ 11531 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11532 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 11533 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 7), 11534 BPF_MOV64_REG(BPF_REG_8, BPF_REG_0), 11535 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 11536 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 11537 BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_0), 11538 BPF_MOV64_REG(BPF_REG_0, BPF_REG_8), 11539 /* write into stack frame of main prog */ 11540 BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 11541 BPF_EXIT_INSN(), 11542 11543 /* subprog 2 */ 11544 /* read from stack frame of main prog */ 11545 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 11546 BPF_EXIT_INSN(), 11547 }, 11548 .prog_type = BPF_PROG_TYPE_XDP, 11549 .result = ACCEPT, 11550 }, 11551 { 11552 "calls: stack overflow using two frames (pre-call access)", 11553 .insns = { 11554 /* prog 1 */ 11555 BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 11556 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), 11557 BPF_EXIT_INSN(), 11558 11559 /* prog 2 */ 11560 BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 11561 BPF_MOV64_IMM(BPF_REG_0, 0), 11562 BPF_EXIT_INSN(), 11563 }, 11564 .prog_type = BPF_PROG_TYPE_XDP, 11565 .errstr = "combined stack size", 11566 .result = REJECT, 11567 }, 11568 { 11569 "calls: stack overflow using two frames (post-call access)", 11570 .insns = { 11571 /* prog 1 */ 11572 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 2), 11573 BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 11574 BPF_EXIT_INSN(), 11575 11576 /* prog 2 */ 11577 BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 11578 BPF_MOV64_IMM(BPF_REG_0, 0), 11579 BPF_EXIT_INSN(), 11580 }, 11581 .prog_type = BPF_PROG_TYPE_XDP, 11582 .errstr = "combined stack size", 11583 .result = REJECT, 11584 }, 11585 { 11586 "calls: stack depth check using three frames. test1", 11587 .insns = { 11588 /* main */ 11589 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 4), /* call A */ 11590 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 5), /* call B */ 11591 BPF_ST_MEM(BPF_B, BPF_REG_10, -32, 0), 11592 BPF_MOV64_IMM(BPF_REG_0, 0), 11593 BPF_EXIT_INSN(), 11594 /* A */ 11595 BPF_ST_MEM(BPF_B, BPF_REG_10, -256, 0), 11596 BPF_EXIT_INSN(), 11597 /* B */ 11598 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, -3), /* call A */ 11599 BPF_ST_MEM(BPF_B, BPF_REG_10, -64, 0), 11600 BPF_EXIT_INSN(), 11601 }, 11602 .prog_type = BPF_PROG_TYPE_XDP, 11603 /* stack_main=32, stack_A=256, stack_B=64 11604 * and max(main+A, main+A+B) < 512 11605 */ 11606 .result = ACCEPT, 11607 }, 11608 { 11609 "calls: stack depth check using three frames. test2", 11610 .insns = { 11611 /* main */ 11612 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 4), /* call A */ 11613 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 5), /* call B */ 11614 BPF_ST_MEM(BPF_B, BPF_REG_10, -32, 0), 11615 BPF_MOV64_IMM(BPF_REG_0, 0), 11616 BPF_EXIT_INSN(), 11617 /* A */ 11618 BPF_ST_MEM(BPF_B, BPF_REG_10, -64, 0), 11619 BPF_EXIT_INSN(), 11620 /* B */ 11621 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, -3), /* call A */ 11622 BPF_ST_MEM(BPF_B, BPF_REG_10, -256, 0), 11623 BPF_EXIT_INSN(), 11624 }, 11625 .prog_type = BPF_PROG_TYPE_XDP, 11626 /* stack_main=32, stack_A=64, stack_B=256 11627 * and max(main+A, main+A+B) < 512 11628 */ 11629 .result = ACCEPT, 11630 }, 11631 { 11632 "calls: stack depth check using three frames. test3", 11633 .insns = { 11634 /* main */ 11635 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11636 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 6), /* call A */ 11637 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 11638 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 8), /* call B */ 11639 BPF_JMP_IMM(BPF_JGE, BPF_REG_6, 0, 1), 11640 BPF_ST_MEM(BPF_B, BPF_REG_10, -64, 0), 11641 BPF_MOV64_IMM(BPF_REG_0, 0), 11642 BPF_EXIT_INSN(), 11643 /* A */ 11644 BPF_JMP_IMM(BPF_JLT, BPF_REG_1, 10, 1), 11645 BPF_EXIT_INSN(), 11646 BPF_ST_MEM(BPF_B, BPF_REG_10, -224, 0), 11647 BPF_JMP_IMM(BPF_JA, 0, 0, -3), 11648 /* B */ 11649 BPF_JMP_IMM(BPF_JGT, BPF_REG_1, 2, 1), 11650 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, -6), /* call A */ 11651 BPF_ST_MEM(BPF_B, BPF_REG_10, -256, 0), 11652 BPF_EXIT_INSN(), 11653 }, 11654 .prog_type = BPF_PROG_TYPE_XDP, 11655 /* stack_main=64, stack_A=224, stack_B=256 11656 * and max(main+A, main+A+B) > 512 11657 */ 11658 .errstr = "combined stack", 11659 .result = REJECT, 11660 }, 11661 { 11662 "calls: stack depth check using three frames. test4", 11663 /* void main(void) { 11664 * func1(0); 11665 * func1(1); 11666 * func2(1); 11667 * } 11668 * void func1(int alloc_or_recurse) { 11669 * if (alloc_or_recurse) { 11670 * frame_pointer[-300] = 1; 11671 * } else { 11672 * func2(alloc_or_recurse); 11673 * } 11674 * } 11675 * void func2(int alloc_or_recurse) { 11676 * if (alloc_or_recurse) { 11677 * frame_pointer[-300] = 1; 11678 * } 11679 * } 11680 */ 11681 .insns = { 11682 /* main */ 11683 BPF_MOV64_IMM(BPF_REG_1, 0), 11684 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 6), /* call A */ 11685 BPF_MOV64_IMM(BPF_REG_1, 1), 11686 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 4), /* call A */ 11687 BPF_MOV64_IMM(BPF_REG_1, 1), 11688 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 7), /* call B */ 11689 BPF_MOV64_IMM(BPF_REG_0, 0), 11690 BPF_EXIT_INSN(), 11691 /* A */ 11692 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 2), 11693 BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 11694 BPF_EXIT_INSN(), 11695 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call B */ 11696 BPF_EXIT_INSN(), 11697 /* B */ 11698 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 11699 BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 11700 BPF_EXIT_INSN(), 11701 }, 11702 .prog_type = BPF_PROG_TYPE_XDP, 11703 .result = REJECT, 11704 .errstr = "combined stack", 11705 }, 11706 { 11707 "calls: stack depth check using three frames. test5", 11708 .insns = { 11709 /* main */ 11710 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call A */ 11711 BPF_EXIT_INSN(), 11712 /* A */ 11713 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call B */ 11714 BPF_EXIT_INSN(), 11715 /* B */ 11716 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call C */ 11717 BPF_EXIT_INSN(), 11718 /* C */ 11719 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call D */ 11720 BPF_EXIT_INSN(), 11721 /* D */ 11722 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call E */ 11723 BPF_EXIT_INSN(), 11724 /* E */ 11725 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call F */ 11726 BPF_EXIT_INSN(), 11727 /* F */ 11728 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call G */ 11729 BPF_EXIT_INSN(), 11730 /* G */ 11731 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call H */ 11732 BPF_EXIT_INSN(), 11733 /* H */ 11734 BPF_MOV64_IMM(BPF_REG_0, 0), 11735 BPF_EXIT_INSN(), 11736 }, 11737 .prog_type = BPF_PROG_TYPE_XDP, 11738 .errstr = "call stack", 11739 .result = REJECT, 11740 }, 11741 { 11742 "calls: spill into caller stack frame", 11743 .insns = { 11744 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 11745 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 11746 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 11747 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11748 BPF_EXIT_INSN(), 11749 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, 0), 11750 BPF_MOV64_IMM(BPF_REG_0, 0), 11751 BPF_EXIT_INSN(), 11752 }, 11753 .prog_type = BPF_PROG_TYPE_XDP, 11754 .errstr = "cannot spill", 11755 .result = REJECT, 11756 }, 11757 { 11758 "calls: write into caller stack frame", 11759 .insns = { 11760 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 11761 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 11762 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11763 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 11764 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 11765 BPF_EXIT_INSN(), 11766 BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 42), 11767 BPF_MOV64_IMM(BPF_REG_0, 0), 11768 BPF_EXIT_INSN(), 11769 }, 11770 .prog_type = BPF_PROG_TYPE_XDP, 11771 .result = ACCEPT, 11772 .retval = 42, 11773 }, 11774 { 11775 "calls: write into callee stack frame", 11776 .insns = { 11777 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 11778 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42), 11779 BPF_EXIT_INSN(), 11780 BPF_MOV64_REG(BPF_REG_0, BPF_REG_10), 11781 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, -8), 11782 BPF_EXIT_INSN(), 11783 }, 11784 .prog_type = BPF_PROG_TYPE_XDP, 11785 .errstr = "cannot return stack pointer", 11786 .result = REJECT, 11787 }, 11788 { 11789 "calls: two calls with stack write and void return", 11790 .insns = { 11791 /* main prog */ 11792 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 11793 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 11794 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 11795 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11796 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 11797 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 11798 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -16), 11799 BPF_EXIT_INSN(), 11800 11801 /* subprog 1 */ 11802 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11803 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 11804 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 11805 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 11806 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11807 BPF_EXIT_INSN(), 11808 11809 /* subprog 2 */ 11810 /* write into stack frame of main prog */ 11811 BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 0), 11812 BPF_EXIT_INSN(), /* void return */ 11813 }, 11814 .prog_type = BPF_PROG_TYPE_XDP, 11815 .result = ACCEPT, 11816 }, 11817 { 11818 "calls: ambiguous return value", 11819 .insns = { 11820 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11821 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 5), 11822 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 11823 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 11824 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 11825 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 11826 BPF_EXIT_INSN(), 11827 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 11828 BPF_MOV64_IMM(BPF_REG_0, 0), 11829 BPF_EXIT_INSN(), 11830 }, 11831 .errstr_unpriv = "allowed for root only", 11832 .result_unpriv = REJECT, 11833 .errstr = "R0 !read_ok", 11834 .result = REJECT, 11835 }, 11836 { 11837 "calls: two calls that return map_value", 11838 .insns = { 11839 /* main prog */ 11840 /* pass fp-16, fp-8 into a function */ 11841 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 11842 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 11843 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11844 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 11845 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8), 11846 11847 /* fetch map_value_ptr from the stack of this function */ 11848 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 11849 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 11850 /* write into map value */ 11851 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 11852 /* fetch secound map_value_ptr from the stack */ 11853 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -16), 11854 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 11855 /* write into map value */ 11856 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 11857 BPF_MOV64_IMM(BPF_REG_0, 0), 11858 BPF_EXIT_INSN(), 11859 11860 /* subprog 1 */ 11861 /* call 3rd function twice */ 11862 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11863 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 11864 /* first time with fp-8 */ 11865 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 11866 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 11867 /* second time with fp-16 */ 11868 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11869 BPF_EXIT_INSN(), 11870 11871 /* subprog 2 */ 11872 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11873 /* lookup from map */ 11874 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 11875 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11876 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 11877 BPF_LD_MAP_FD(BPF_REG_1, 0), 11878 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 11879 BPF_FUNC_map_lookup_elem), 11880 /* write map_value_ptr into stack frame of main prog */ 11881 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 11882 BPF_MOV64_IMM(BPF_REG_0, 0), 11883 BPF_EXIT_INSN(), /* return 0 */ 11884 }, 11885 .prog_type = BPF_PROG_TYPE_XDP, 11886 .fixup_map_hash_8b = { 23 }, 11887 .result = ACCEPT, 11888 }, 11889 { 11890 "calls: two calls that return map_value with bool condition", 11891 .insns = { 11892 /* main prog */ 11893 /* pass fp-16, fp-8 into a function */ 11894 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 11895 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 11896 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11897 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 11898 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 11899 BPF_MOV64_IMM(BPF_REG_0, 0), 11900 BPF_EXIT_INSN(), 11901 11902 /* subprog 1 */ 11903 /* call 3rd function twice */ 11904 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11905 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 11906 /* first time with fp-8 */ 11907 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 9), 11908 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2), 11909 /* fetch map_value_ptr from the stack of this function */ 11910 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 11911 /* write into map value */ 11912 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 11913 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 11914 /* second time with fp-16 */ 11915 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 11916 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2), 11917 /* fetch secound map_value_ptr from the stack */ 11918 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0), 11919 /* write into map value */ 11920 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 11921 BPF_EXIT_INSN(), 11922 11923 /* subprog 2 */ 11924 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11925 /* lookup from map */ 11926 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 11927 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11928 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 11929 BPF_LD_MAP_FD(BPF_REG_1, 0), 11930 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 11931 BPF_FUNC_map_lookup_elem), 11932 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 11933 BPF_MOV64_IMM(BPF_REG_0, 0), 11934 BPF_EXIT_INSN(), /* return 0 */ 11935 /* write map_value_ptr into stack frame of main prog */ 11936 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 11937 BPF_MOV64_IMM(BPF_REG_0, 1), 11938 BPF_EXIT_INSN(), /* return 1 */ 11939 }, 11940 .prog_type = BPF_PROG_TYPE_XDP, 11941 .fixup_map_hash_8b = { 23 }, 11942 .result = ACCEPT, 11943 }, 11944 { 11945 "calls: two calls that return map_value with incorrect bool check", 11946 .insns = { 11947 /* main prog */ 11948 /* pass fp-16, fp-8 into a function */ 11949 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 11950 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 11951 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11952 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 11953 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 11954 BPF_MOV64_IMM(BPF_REG_0, 0), 11955 BPF_EXIT_INSN(), 11956 11957 /* subprog 1 */ 11958 /* call 3rd function twice */ 11959 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11960 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 11961 /* first time with fp-8 */ 11962 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 9), 11963 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2), 11964 /* fetch map_value_ptr from the stack of this function */ 11965 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 11966 /* write into map value */ 11967 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 11968 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 11969 /* second time with fp-16 */ 11970 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 11971 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 11972 /* fetch secound map_value_ptr from the stack */ 11973 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0), 11974 /* write into map value */ 11975 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 11976 BPF_EXIT_INSN(), 11977 11978 /* subprog 2 */ 11979 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11980 /* lookup from map */ 11981 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 11982 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11983 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 11984 BPF_LD_MAP_FD(BPF_REG_1, 0), 11985 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 11986 BPF_FUNC_map_lookup_elem), 11987 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 11988 BPF_MOV64_IMM(BPF_REG_0, 0), 11989 BPF_EXIT_INSN(), /* return 0 */ 11990 /* write map_value_ptr into stack frame of main prog */ 11991 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 11992 BPF_MOV64_IMM(BPF_REG_0, 1), 11993 BPF_EXIT_INSN(), /* return 1 */ 11994 }, 11995 .prog_type = BPF_PROG_TYPE_XDP, 11996 .fixup_map_hash_8b = { 23 }, 11997 .result = REJECT, 11998 .errstr = "invalid read from stack off -16+0 size 8", 11999 }, 12000 { 12001 "calls: two calls that receive map_value via arg=ptr_stack_of_caller. test1", 12002 .insns = { 12003 /* main prog */ 12004 /* pass fp-16, fp-8 into a function */ 12005 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 12006 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 12007 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12008 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 12009 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 12010 BPF_MOV64_IMM(BPF_REG_0, 0), 12011 BPF_EXIT_INSN(), 12012 12013 /* subprog 1 */ 12014 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12015 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 12016 /* 1st lookup from map */ 12017 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 12018 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12019 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12020 BPF_LD_MAP_FD(BPF_REG_1, 0), 12021 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12022 BPF_FUNC_map_lookup_elem), 12023 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12024 BPF_MOV64_IMM(BPF_REG_8, 0), 12025 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 12026 /* write map_value_ptr into stack frame of main prog at fp-8 */ 12027 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 12028 BPF_MOV64_IMM(BPF_REG_8, 1), 12029 12030 /* 2nd lookup from map */ 12031 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), /* 20 */ 12032 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12033 BPF_LD_MAP_FD(BPF_REG_1, 0), 12034 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, /* 24 */ 12035 BPF_FUNC_map_lookup_elem), 12036 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12037 BPF_MOV64_IMM(BPF_REG_9, 0), 12038 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 12039 /* write map_value_ptr into stack frame of main prog at fp-16 */ 12040 BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 12041 BPF_MOV64_IMM(BPF_REG_9, 1), 12042 12043 /* call 3rd func with fp-8, 0|1, fp-16, 0|1 */ 12044 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), /* 30 */ 12045 BPF_MOV64_REG(BPF_REG_2, BPF_REG_8), 12046 BPF_MOV64_REG(BPF_REG_3, BPF_REG_7), 12047 BPF_MOV64_REG(BPF_REG_4, BPF_REG_9), 12048 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), /* 34 */ 12049 BPF_EXIT_INSN(), 12050 12051 /* subprog 2 */ 12052 /* if arg2 == 1 do *arg1 = 0 */ 12053 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2), 12054 /* fetch map_value_ptr from the stack of this function */ 12055 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 12056 /* write into map value */ 12057 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 12058 12059 /* if arg4 == 1 do *arg3 = 0 */ 12060 BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2), 12061 /* fetch map_value_ptr from the stack of this function */ 12062 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 12063 /* write into map value */ 12064 BPF_ST_MEM(BPF_DW, BPF_REG_0, 2, 0), 12065 BPF_EXIT_INSN(), 12066 }, 12067 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12068 .fixup_map_hash_8b = { 12, 22 }, 12069 .result = REJECT, 12070 .errstr = "invalid access to map value, value_size=8 off=2 size=8", 12071 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 12072 }, 12073 { 12074 "calls: two calls that receive map_value via arg=ptr_stack_of_caller. test2", 12075 .insns = { 12076 /* main prog */ 12077 /* pass fp-16, fp-8 into a function */ 12078 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 12079 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 12080 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12081 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 12082 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 12083 BPF_MOV64_IMM(BPF_REG_0, 0), 12084 BPF_EXIT_INSN(), 12085 12086 /* subprog 1 */ 12087 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12088 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 12089 /* 1st lookup from map */ 12090 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 12091 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12092 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12093 BPF_LD_MAP_FD(BPF_REG_1, 0), 12094 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12095 BPF_FUNC_map_lookup_elem), 12096 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12097 BPF_MOV64_IMM(BPF_REG_8, 0), 12098 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 12099 /* write map_value_ptr into stack frame of main prog at fp-8 */ 12100 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 12101 BPF_MOV64_IMM(BPF_REG_8, 1), 12102 12103 /* 2nd lookup from map */ 12104 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), /* 20 */ 12105 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12106 BPF_LD_MAP_FD(BPF_REG_1, 0), 12107 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, /* 24 */ 12108 BPF_FUNC_map_lookup_elem), 12109 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12110 BPF_MOV64_IMM(BPF_REG_9, 0), 12111 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 12112 /* write map_value_ptr into stack frame of main prog at fp-16 */ 12113 BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 12114 BPF_MOV64_IMM(BPF_REG_9, 1), 12115 12116 /* call 3rd func with fp-8, 0|1, fp-16, 0|1 */ 12117 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), /* 30 */ 12118 BPF_MOV64_REG(BPF_REG_2, BPF_REG_8), 12119 BPF_MOV64_REG(BPF_REG_3, BPF_REG_7), 12120 BPF_MOV64_REG(BPF_REG_4, BPF_REG_9), 12121 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), /* 34 */ 12122 BPF_EXIT_INSN(), 12123 12124 /* subprog 2 */ 12125 /* if arg2 == 1 do *arg1 = 0 */ 12126 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2), 12127 /* fetch map_value_ptr from the stack of this function */ 12128 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 12129 /* write into map value */ 12130 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 12131 12132 /* if arg4 == 1 do *arg3 = 0 */ 12133 BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2), 12134 /* fetch map_value_ptr from the stack of this function */ 12135 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 12136 /* write into map value */ 12137 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 12138 BPF_EXIT_INSN(), 12139 }, 12140 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12141 .fixup_map_hash_8b = { 12, 22 }, 12142 .result = ACCEPT, 12143 }, 12144 { 12145 "calls: two jumps that receive map_value via arg=ptr_stack_of_jumper. test3", 12146 .insns = { 12147 /* main prog */ 12148 /* pass fp-16, fp-8 into a function */ 12149 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 12150 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 12151 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12152 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 12153 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2), 12154 BPF_MOV64_IMM(BPF_REG_0, 0), 12155 BPF_EXIT_INSN(), 12156 12157 /* subprog 1 */ 12158 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12159 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 12160 /* 1st lookup from map */ 12161 BPF_ST_MEM(BPF_DW, BPF_REG_10, -24, 0), 12162 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12163 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -24), 12164 BPF_LD_MAP_FD(BPF_REG_1, 0), 12165 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12166 BPF_FUNC_map_lookup_elem), 12167 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12168 BPF_MOV64_IMM(BPF_REG_8, 0), 12169 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 12170 /* write map_value_ptr into stack frame of main prog at fp-8 */ 12171 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 12172 BPF_MOV64_IMM(BPF_REG_8, 1), 12173 12174 /* 2nd lookup from map */ 12175 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12176 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -24), 12177 BPF_LD_MAP_FD(BPF_REG_1, 0), 12178 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12179 BPF_FUNC_map_lookup_elem), 12180 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12181 BPF_MOV64_IMM(BPF_REG_9, 0), // 26 12182 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 12183 /* write map_value_ptr into stack frame of main prog at fp-16 */ 12184 BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 12185 BPF_MOV64_IMM(BPF_REG_9, 1), 12186 12187 /* call 3rd func with fp-8, 0|1, fp-16, 0|1 */ 12188 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), // 30 12189 BPF_MOV64_REG(BPF_REG_2, BPF_REG_8), 12190 BPF_MOV64_REG(BPF_REG_3, BPF_REG_7), 12191 BPF_MOV64_REG(BPF_REG_4, BPF_REG_9), 12192 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), // 34 12193 BPF_JMP_IMM(BPF_JA, 0, 0, -30), 12194 12195 /* subprog 2 */ 12196 /* if arg2 == 1 do *arg1 = 0 */ 12197 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2), 12198 /* fetch map_value_ptr from the stack of this function */ 12199 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 12200 /* write into map value */ 12201 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 12202 12203 /* if arg4 == 1 do *arg3 = 0 */ 12204 BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2), 12205 /* fetch map_value_ptr from the stack of this function */ 12206 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 12207 /* write into map value */ 12208 BPF_ST_MEM(BPF_DW, BPF_REG_0, 2, 0), 12209 BPF_JMP_IMM(BPF_JA, 0, 0, -8), 12210 }, 12211 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12212 .fixup_map_hash_8b = { 12, 22 }, 12213 .result = REJECT, 12214 .errstr = "invalid access to map value, value_size=8 off=2 size=8", 12215 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 12216 }, 12217 { 12218 "calls: two calls that receive map_value_ptr_or_null via arg. test1", 12219 .insns = { 12220 /* main prog */ 12221 /* pass fp-16, fp-8 into a function */ 12222 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 12223 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 12224 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12225 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 12226 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 12227 BPF_MOV64_IMM(BPF_REG_0, 0), 12228 BPF_EXIT_INSN(), 12229 12230 /* subprog 1 */ 12231 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12232 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 12233 /* 1st lookup from map */ 12234 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 12235 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12236 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12237 BPF_LD_MAP_FD(BPF_REG_1, 0), 12238 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12239 BPF_FUNC_map_lookup_elem), 12240 /* write map_value_ptr_or_null into stack frame of main prog at fp-8 */ 12241 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 12242 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12243 BPF_MOV64_IMM(BPF_REG_8, 0), 12244 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 12245 BPF_MOV64_IMM(BPF_REG_8, 1), 12246 12247 /* 2nd lookup from map */ 12248 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12249 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12250 BPF_LD_MAP_FD(BPF_REG_1, 0), 12251 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12252 BPF_FUNC_map_lookup_elem), 12253 /* write map_value_ptr_or_null into stack frame of main prog at fp-16 */ 12254 BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 12255 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12256 BPF_MOV64_IMM(BPF_REG_9, 0), 12257 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 12258 BPF_MOV64_IMM(BPF_REG_9, 1), 12259 12260 /* call 3rd func with fp-8, 0|1, fp-16, 0|1 */ 12261 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 12262 BPF_MOV64_REG(BPF_REG_2, BPF_REG_8), 12263 BPF_MOV64_REG(BPF_REG_3, BPF_REG_7), 12264 BPF_MOV64_REG(BPF_REG_4, BPF_REG_9), 12265 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12266 BPF_EXIT_INSN(), 12267 12268 /* subprog 2 */ 12269 /* if arg2 == 1 do *arg1 = 0 */ 12270 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2), 12271 /* fetch map_value_ptr from the stack of this function */ 12272 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 12273 /* write into map value */ 12274 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 12275 12276 /* if arg4 == 1 do *arg3 = 0 */ 12277 BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2), 12278 /* fetch map_value_ptr from the stack of this function */ 12279 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 12280 /* write into map value */ 12281 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 12282 BPF_EXIT_INSN(), 12283 }, 12284 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12285 .fixup_map_hash_8b = { 12, 22 }, 12286 .result = ACCEPT, 12287 }, 12288 { 12289 "calls: two calls that receive map_value_ptr_or_null via arg. test2", 12290 .insns = { 12291 /* main prog */ 12292 /* pass fp-16, fp-8 into a function */ 12293 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 12294 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 12295 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12296 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 12297 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 12298 BPF_MOV64_IMM(BPF_REG_0, 0), 12299 BPF_EXIT_INSN(), 12300 12301 /* subprog 1 */ 12302 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12303 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 12304 /* 1st lookup from map */ 12305 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 12306 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12307 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12308 BPF_LD_MAP_FD(BPF_REG_1, 0), 12309 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12310 BPF_FUNC_map_lookup_elem), 12311 /* write map_value_ptr_or_null into stack frame of main prog at fp-8 */ 12312 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 12313 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12314 BPF_MOV64_IMM(BPF_REG_8, 0), 12315 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 12316 BPF_MOV64_IMM(BPF_REG_8, 1), 12317 12318 /* 2nd lookup from map */ 12319 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12320 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12321 BPF_LD_MAP_FD(BPF_REG_1, 0), 12322 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12323 BPF_FUNC_map_lookup_elem), 12324 /* write map_value_ptr_or_null into stack frame of main prog at fp-16 */ 12325 BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 12326 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12327 BPF_MOV64_IMM(BPF_REG_9, 0), 12328 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 12329 BPF_MOV64_IMM(BPF_REG_9, 1), 12330 12331 /* call 3rd func with fp-8, 0|1, fp-16, 0|1 */ 12332 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 12333 BPF_MOV64_REG(BPF_REG_2, BPF_REG_8), 12334 BPF_MOV64_REG(BPF_REG_3, BPF_REG_7), 12335 BPF_MOV64_REG(BPF_REG_4, BPF_REG_9), 12336 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12337 BPF_EXIT_INSN(), 12338 12339 /* subprog 2 */ 12340 /* if arg2 == 1 do *arg1 = 0 */ 12341 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2), 12342 /* fetch map_value_ptr from the stack of this function */ 12343 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 12344 /* write into map value */ 12345 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 12346 12347 /* if arg4 == 0 do *arg3 = 0 */ 12348 BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 0, 2), 12349 /* fetch map_value_ptr from the stack of this function */ 12350 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 12351 /* write into map value */ 12352 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 12353 BPF_EXIT_INSN(), 12354 }, 12355 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12356 .fixup_map_hash_8b = { 12, 22 }, 12357 .result = REJECT, 12358 .errstr = "R0 invalid mem access 'inv'", 12359 }, 12360 { 12361 "calls: pkt_ptr spill into caller stack", 12362 .insns = { 12363 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 12364 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 12365 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12366 BPF_EXIT_INSN(), 12367 12368 /* subprog 1 */ 12369 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 12370 offsetof(struct __sk_buff, data)), 12371 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 12372 offsetof(struct __sk_buff, data_end)), 12373 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 12374 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 12375 /* spill unchecked pkt_ptr into stack of caller */ 12376 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 12377 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 12378 /* now the pkt range is verified, read pkt_ptr from stack */ 12379 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0), 12380 /* write 4 bytes into packet */ 12381 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 12382 BPF_EXIT_INSN(), 12383 }, 12384 .result = ACCEPT, 12385 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12386 .retval = POINTER_VALUE, 12387 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 12388 }, 12389 { 12390 "calls: pkt_ptr spill into caller stack 2", 12391 .insns = { 12392 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 12393 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 12394 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12395 /* Marking is still kept, but not in all cases safe. */ 12396 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 12397 BPF_ST_MEM(BPF_W, BPF_REG_4, 0, 0), 12398 BPF_EXIT_INSN(), 12399 12400 /* subprog 1 */ 12401 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 12402 offsetof(struct __sk_buff, data)), 12403 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 12404 offsetof(struct __sk_buff, data_end)), 12405 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 12406 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 12407 /* spill unchecked pkt_ptr into stack of caller */ 12408 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 12409 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 12410 /* now the pkt range is verified, read pkt_ptr from stack */ 12411 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0), 12412 /* write 4 bytes into packet */ 12413 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 12414 BPF_EXIT_INSN(), 12415 }, 12416 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12417 .errstr = "invalid access to packet", 12418 .result = REJECT, 12419 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 12420 }, 12421 { 12422 "calls: pkt_ptr spill into caller stack 3", 12423 .insns = { 12424 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 12425 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 12426 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 12427 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 12428 /* Marking is still kept and safe here. */ 12429 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 12430 BPF_ST_MEM(BPF_W, BPF_REG_4, 0, 0), 12431 BPF_EXIT_INSN(), 12432 12433 /* subprog 1 */ 12434 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 12435 offsetof(struct __sk_buff, data)), 12436 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 12437 offsetof(struct __sk_buff, data_end)), 12438 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 12439 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 12440 /* spill unchecked pkt_ptr into stack of caller */ 12441 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 12442 BPF_MOV64_IMM(BPF_REG_5, 0), 12443 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 12444 BPF_MOV64_IMM(BPF_REG_5, 1), 12445 /* now the pkt range is verified, read pkt_ptr from stack */ 12446 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0), 12447 /* write 4 bytes into packet */ 12448 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 12449 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 12450 BPF_EXIT_INSN(), 12451 }, 12452 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12453 .result = ACCEPT, 12454 .retval = 1, 12455 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 12456 }, 12457 { 12458 "calls: pkt_ptr spill into caller stack 4", 12459 .insns = { 12460 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 12461 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 12462 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 12463 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 12464 /* Check marking propagated. */ 12465 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 12466 BPF_ST_MEM(BPF_W, BPF_REG_4, 0, 0), 12467 BPF_EXIT_INSN(), 12468 12469 /* subprog 1 */ 12470 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 12471 offsetof(struct __sk_buff, data)), 12472 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 12473 offsetof(struct __sk_buff, data_end)), 12474 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 12475 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 12476 /* spill unchecked pkt_ptr into stack of caller */ 12477 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 12478 BPF_MOV64_IMM(BPF_REG_5, 0), 12479 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 12480 BPF_MOV64_IMM(BPF_REG_5, 1), 12481 /* don't read back pkt_ptr from stack here */ 12482 /* write 4 bytes into packet */ 12483 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 12484 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 12485 BPF_EXIT_INSN(), 12486 }, 12487 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12488 .result = ACCEPT, 12489 .retval = 1, 12490 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 12491 }, 12492 { 12493 "calls: pkt_ptr spill into caller stack 5", 12494 .insns = { 12495 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 12496 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 12497 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_1, 0), 12498 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12499 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 12500 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0), 12501 BPF_EXIT_INSN(), 12502 12503 /* subprog 1 */ 12504 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 12505 offsetof(struct __sk_buff, data)), 12506 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 12507 offsetof(struct __sk_buff, data_end)), 12508 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 12509 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 12510 BPF_MOV64_IMM(BPF_REG_5, 0), 12511 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 12512 /* spill checked pkt_ptr into stack of caller */ 12513 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 12514 BPF_MOV64_IMM(BPF_REG_5, 1), 12515 /* don't read back pkt_ptr from stack here */ 12516 /* write 4 bytes into packet */ 12517 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 12518 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 12519 BPF_EXIT_INSN(), 12520 }, 12521 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12522 .errstr = "same insn cannot be used with different", 12523 .result = REJECT, 12524 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 12525 }, 12526 { 12527 "calls: pkt_ptr spill into caller stack 6", 12528 .insns = { 12529 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 12530 offsetof(struct __sk_buff, data_end)), 12531 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 12532 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 12533 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 12534 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12535 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 12536 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0), 12537 BPF_EXIT_INSN(), 12538 12539 /* subprog 1 */ 12540 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 12541 offsetof(struct __sk_buff, data)), 12542 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 12543 offsetof(struct __sk_buff, data_end)), 12544 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 12545 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 12546 BPF_MOV64_IMM(BPF_REG_5, 0), 12547 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 12548 /* spill checked pkt_ptr into stack of caller */ 12549 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 12550 BPF_MOV64_IMM(BPF_REG_5, 1), 12551 /* don't read back pkt_ptr from stack here */ 12552 /* write 4 bytes into packet */ 12553 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 12554 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 12555 BPF_EXIT_INSN(), 12556 }, 12557 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12558 .errstr = "R4 invalid mem access", 12559 .result = REJECT, 12560 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 12561 }, 12562 { 12563 "calls: pkt_ptr spill into caller stack 7", 12564 .insns = { 12565 BPF_MOV64_IMM(BPF_REG_2, 0), 12566 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 12567 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 12568 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 12569 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12570 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 12571 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0), 12572 BPF_EXIT_INSN(), 12573 12574 /* subprog 1 */ 12575 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 12576 offsetof(struct __sk_buff, data)), 12577 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 12578 offsetof(struct __sk_buff, data_end)), 12579 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 12580 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 12581 BPF_MOV64_IMM(BPF_REG_5, 0), 12582 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 12583 /* spill checked pkt_ptr into stack of caller */ 12584 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 12585 BPF_MOV64_IMM(BPF_REG_5, 1), 12586 /* don't read back pkt_ptr from stack here */ 12587 /* write 4 bytes into packet */ 12588 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 12589 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 12590 BPF_EXIT_INSN(), 12591 }, 12592 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12593 .errstr = "R4 invalid mem access", 12594 .result = REJECT, 12595 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 12596 }, 12597 { 12598 "calls: pkt_ptr spill into caller stack 8", 12599 .insns = { 12600 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 12601 offsetof(struct __sk_buff, data)), 12602 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 12603 offsetof(struct __sk_buff, data_end)), 12604 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 12605 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 12606 BPF_JMP_REG(BPF_JLE, BPF_REG_0, BPF_REG_3, 1), 12607 BPF_EXIT_INSN(), 12608 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 12609 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 12610 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 12611 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12612 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 12613 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0), 12614 BPF_EXIT_INSN(), 12615 12616 /* subprog 1 */ 12617 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 12618 offsetof(struct __sk_buff, data)), 12619 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 12620 offsetof(struct __sk_buff, data_end)), 12621 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 12622 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 12623 BPF_MOV64_IMM(BPF_REG_5, 0), 12624 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 12625 /* spill checked pkt_ptr into stack of caller */ 12626 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 12627 BPF_MOV64_IMM(BPF_REG_5, 1), 12628 /* don't read back pkt_ptr from stack here */ 12629 /* write 4 bytes into packet */ 12630 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 12631 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 12632 BPF_EXIT_INSN(), 12633 }, 12634 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12635 .result = ACCEPT, 12636 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 12637 }, 12638 { 12639 "calls: pkt_ptr spill into caller stack 9", 12640 .insns = { 12641 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 12642 offsetof(struct __sk_buff, data)), 12643 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 12644 offsetof(struct __sk_buff, data_end)), 12645 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 12646 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 12647 BPF_JMP_REG(BPF_JLE, BPF_REG_0, BPF_REG_3, 1), 12648 BPF_EXIT_INSN(), 12649 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 12650 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 12651 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 12652 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12653 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 12654 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0), 12655 BPF_EXIT_INSN(), 12656 12657 /* subprog 1 */ 12658 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 12659 offsetof(struct __sk_buff, data)), 12660 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 12661 offsetof(struct __sk_buff, data_end)), 12662 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 12663 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 12664 BPF_MOV64_IMM(BPF_REG_5, 0), 12665 /* spill unchecked pkt_ptr into stack of caller */ 12666 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 12667 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 12668 BPF_MOV64_IMM(BPF_REG_5, 1), 12669 /* don't read back pkt_ptr from stack here */ 12670 /* write 4 bytes into packet */ 12671 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 12672 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 12673 BPF_EXIT_INSN(), 12674 }, 12675 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12676 .errstr = "invalid access to packet", 12677 .result = REJECT, 12678 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 12679 }, 12680 { 12681 "calls: caller stack init to zero or map_value_or_null", 12682 .insns = { 12683 BPF_MOV64_IMM(BPF_REG_0, 0), 12684 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 12685 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12686 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12687 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 12688 /* fetch map_value_or_null or const_zero from stack */ 12689 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 12690 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 12691 /* store into map_value */ 12692 BPF_ST_MEM(BPF_W, BPF_REG_0, 0, 0), 12693 BPF_EXIT_INSN(), 12694 12695 /* subprog 1 */ 12696 /* if (ctx == 0) return; */ 12697 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 8), 12698 /* else bpf_map_lookup() and *(fp - 8) = r0 */ 12699 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 12700 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12701 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12702 BPF_LD_MAP_FD(BPF_REG_1, 0), 12703 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 12704 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12705 BPF_FUNC_map_lookup_elem), 12706 /* write map_value_ptr_or_null into stack frame of main prog at fp-8 */ 12707 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 12708 BPF_EXIT_INSN(), 12709 }, 12710 .fixup_map_hash_8b = { 13 }, 12711 .result = ACCEPT, 12712 .prog_type = BPF_PROG_TYPE_XDP, 12713 }, 12714 { 12715 "calls: stack init to zero and pruning", 12716 .insns = { 12717 /* first make allocated_stack 16 byte */ 12718 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, 0), 12719 /* now fork the execution such that the false branch 12720 * of JGT insn will be verified second and it skisp zero 12721 * init of fp-8 stack slot. If stack liveness marking 12722 * is missing live_read marks from call map_lookup 12723 * processing then pruning will incorrectly assume 12724 * that fp-8 stack slot was unused in the fall-through 12725 * branch and will accept the program incorrectly 12726 */ 12727 BPF_JMP_IMM(BPF_JGT, BPF_REG_1, 2, 2), 12728 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 12729 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 12730 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12731 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12732 BPF_LD_MAP_FD(BPF_REG_1, 0), 12733 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12734 BPF_FUNC_map_lookup_elem), 12735 BPF_EXIT_INSN(), 12736 }, 12737 .fixup_map_hash_48b = { 6 }, 12738 .errstr = "invalid indirect read from stack off -8+0 size 8", 12739 .result = REJECT, 12740 .prog_type = BPF_PROG_TYPE_XDP, 12741 }, 12742 { 12743 "calls: two calls returning different map pointers for lookup (hash, array)", 12744 .insns = { 12745 /* main prog */ 12746 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2), 12747 BPF_CALL_REL(11), 12748 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 12749 BPF_CALL_REL(12), 12750 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 12751 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 12752 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12753 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12754 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12755 BPF_FUNC_map_lookup_elem), 12756 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 12757 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 12758 offsetof(struct test_val, foo)), 12759 BPF_MOV64_IMM(BPF_REG_0, 1), 12760 BPF_EXIT_INSN(), 12761 /* subprog 1 */ 12762 BPF_LD_MAP_FD(BPF_REG_0, 0), 12763 BPF_EXIT_INSN(), 12764 /* subprog 2 */ 12765 BPF_LD_MAP_FD(BPF_REG_0, 0), 12766 BPF_EXIT_INSN(), 12767 }, 12768 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12769 .fixup_map_hash_48b = { 13 }, 12770 .fixup_map_array_48b = { 16 }, 12771 .result = ACCEPT, 12772 .retval = 1, 12773 }, 12774 { 12775 "calls: two calls returning different map pointers for lookup (hash, map in map)", 12776 .insns = { 12777 /* main prog */ 12778 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2), 12779 BPF_CALL_REL(11), 12780 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 12781 BPF_CALL_REL(12), 12782 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 12783 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 12784 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12785 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12786 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12787 BPF_FUNC_map_lookup_elem), 12788 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 12789 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 12790 offsetof(struct test_val, foo)), 12791 BPF_MOV64_IMM(BPF_REG_0, 1), 12792 BPF_EXIT_INSN(), 12793 /* subprog 1 */ 12794 BPF_LD_MAP_FD(BPF_REG_0, 0), 12795 BPF_EXIT_INSN(), 12796 /* subprog 2 */ 12797 BPF_LD_MAP_FD(BPF_REG_0, 0), 12798 BPF_EXIT_INSN(), 12799 }, 12800 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12801 .fixup_map_in_map = { 16 }, 12802 .fixup_map_array_48b = { 13 }, 12803 .result = REJECT, 12804 .errstr = "R0 invalid mem access 'map_ptr'", 12805 }, 12806 { 12807 "cond: two branches returning different map pointers for lookup (tail, tail)", 12808 .insns = { 12809 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 12810 offsetof(struct __sk_buff, mark)), 12811 BPF_JMP_IMM(BPF_JNE, BPF_REG_6, 0, 3), 12812 BPF_LD_MAP_FD(BPF_REG_2, 0), 12813 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 12814 BPF_LD_MAP_FD(BPF_REG_2, 0), 12815 BPF_MOV64_IMM(BPF_REG_3, 7), 12816 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12817 BPF_FUNC_tail_call), 12818 BPF_MOV64_IMM(BPF_REG_0, 1), 12819 BPF_EXIT_INSN(), 12820 }, 12821 .fixup_prog1 = { 5 }, 12822 .fixup_prog2 = { 2 }, 12823 .result_unpriv = REJECT, 12824 .errstr_unpriv = "tail_call abusing map_ptr", 12825 .result = ACCEPT, 12826 .retval = 42, 12827 }, 12828 { 12829 "cond: two branches returning same map pointers for lookup (tail, tail)", 12830 .insns = { 12831 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 12832 offsetof(struct __sk_buff, mark)), 12833 BPF_JMP_IMM(BPF_JEQ, BPF_REG_6, 0, 3), 12834 BPF_LD_MAP_FD(BPF_REG_2, 0), 12835 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 12836 BPF_LD_MAP_FD(BPF_REG_2, 0), 12837 BPF_MOV64_IMM(BPF_REG_3, 7), 12838 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12839 BPF_FUNC_tail_call), 12840 BPF_MOV64_IMM(BPF_REG_0, 1), 12841 BPF_EXIT_INSN(), 12842 }, 12843 .fixup_prog2 = { 2, 5 }, 12844 .result_unpriv = ACCEPT, 12845 .result = ACCEPT, 12846 .retval = 42, 12847 }, 12848 { 12849 "search pruning: all branches should be verified (nop operation)", 12850 .insns = { 12851 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12852 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12853 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 12854 BPF_LD_MAP_FD(BPF_REG_1, 0), 12855 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 12856 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11), 12857 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0), 12858 BPF_JMP_IMM(BPF_JEQ, BPF_REG_3, 0xbeef, 2), 12859 BPF_MOV64_IMM(BPF_REG_4, 0), 12860 BPF_JMP_A(1), 12861 BPF_MOV64_IMM(BPF_REG_4, 1), 12862 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_4, -16), 12863 BPF_EMIT_CALL(BPF_FUNC_ktime_get_ns), 12864 BPF_LDX_MEM(BPF_DW, BPF_REG_5, BPF_REG_10, -16), 12865 BPF_JMP_IMM(BPF_JEQ, BPF_REG_5, 0, 2), 12866 BPF_MOV64_IMM(BPF_REG_6, 0), 12867 BPF_ST_MEM(BPF_DW, BPF_REG_6, 0, 0xdead), 12868 BPF_EXIT_INSN(), 12869 }, 12870 .fixup_map_hash_8b = { 3 }, 12871 .errstr = "R6 invalid mem access 'inv'", 12872 .result = REJECT, 12873 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12874 }, 12875 { 12876 "search pruning: all branches should be verified (invalid stack access)", 12877 .insns = { 12878 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12879 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12880 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 12881 BPF_LD_MAP_FD(BPF_REG_1, 0), 12882 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 12883 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8), 12884 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0), 12885 BPF_MOV64_IMM(BPF_REG_4, 0), 12886 BPF_JMP_IMM(BPF_JEQ, BPF_REG_3, 0xbeef, 2), 12887 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_4, -16), 12888 BPF_JMP_A(1), 12889 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_4, -24), 12890 BPF_EMIT_CALL(BPF_FUNC_ktime_get_ns), 12891 BPF_LDX_MEM(BPF_DW, BPF_REG_5, BPF_REG_10, -16), 12892 BPF_EXIT_INSN(), 12893 }, 12894 .fixup_map_hash_8b = { 3 }, 12895 .errstr = "invalid read from stack off -16+0 size 8", 12896 .result = REJECT, 12897 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12898 }, 12899 { 12900 "jit: lsh, rsh, arsh by 1", 12901 .insns = { 12902 BPF_MOV64_IMM(BPF_REG_0, 1), 12903 BPF_MOV64_IMM(BPF_REG_1, 0xff), 12904 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 1), 12905 BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 1), 12906 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0x3fc, 1), 12907 BPF_EXIT_INSN(), 12908 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 1), 12909 BPF_ALU32_IMM(BPF_RSH, BPF_REG_1, 1), 12910 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0xff, 1), 12911 BPF_EXIT_INSN(), 12912 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_1, 1), 12913 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0x7f, 1), 12914 BPF_EXIT_INSN(), 12915 BPF_MOV64_IMM(BPF_REG_0, 2), 12916 BPF_EXIT_INSN(), 12917 }, 12918 .result = ACCEPT, 12919 .retval = 2, 12920 }, 12921 { 12922 "jit: mov32 for ldimm64, 1", 12923 .insns = { 12924 BPF_MOV64_IMM(BPF_REG_0, 2), 12925 BPF_LD_IMM64(BPF_REG_1, 0xfeffffffffffffffULL), 12926 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 32), 12927 BPF_LD_IMM64(BPF_REG_2, 0xfeffffffULL), 12928 BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 12929 BPF_MOV64_IMM(BPF_REG_0, 1), 12930 BPF_EXIT_INSN(), 12931 }, 12932 .result = ACCEPT, 12933 .retval = 2, 12934 }, 12935 { 12936 "jit: mov32 for ldimm64, 2", 12937 .insns = { 12938 BPF_MOV64_IMM(BPF_REG_0, 1), 12939 BPF_LD_IMM64(BPF_REG_1, 0x1ffffffffULL), 12940 BPF_LD_IMM64(BPF_REG_2, 0xffffffffULL), 12941 BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 12942 BPF_MOV64_IMM(BPF_REG_0, 2), 12943 BPF_EXIT_INSN(), 12944 }, 12945 .result = ACCEPT, 12946 .retval = 2, 12947 }, 12948 { 12949 "jit: various mul tests", 12950 .insns = { 12951 BPF_LD_IMM64(BPF_REG_2, 0xeeff0d413122ULL), 12952 BPF_LD_IMM64(BPF_REG_0, 0xfefefeULL), 12953 BPF_LD_IMM64(BPF_REG_1, 0xefefefULL), 12954 BPF_ALU64_REG(BPF_MUL, BPF_REG_0, BPF_REG_1), 12955 BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_2, 2), 12956 BPF_MOV64_IMM(BPF_REG_0, 1), 12957 BPF_EXIT_INSN(), 12958 BPF_LD_IMM64(BPF_REG_3, 0xfefefeULL), 12959 BPF_ALU64_REG(BPF_MUL, BPF_REG_3, BPF_REG_1), 12960 BPF_JMP_REG(BPF_JEQ, BPF_REG_3, BPF_REG_2, 2), 12961 BPF_MOV64_IMM(BPF_REG_0, 1), 12962 BPF_EXIT_INSN(), 12963 BPF_MOV32_REG(BPF_REG_2, BPF_REG_2), 12964 BPF_LD_IMM64(BPF_REG_0, 0xfefefeULL), 12965 BPF_ALU32_REG(BPF_MUL, BPF_REG_0, BPF_REG_1), 12966 BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_2, 2), 12967 BPF_MOV64_IMM(BPF_REG_0, 1), 12968 BPF_EXIT_INSN(), 12969 BPF_LD_IMM64(BPF_REG_3, 0xfefefeULL), 12970 BPF_ALU32_REG(BPF_MUL, BPF_REG_3, BPF_REG_1), 12971 BPF_JMP_REG(BPF_JEQ, BPF_REG_3, BPF_REG_2, 2), 12972 BPF_MOV64_IMM(BPF_REG_0, 1), 12973 BPF_EXIT_INSN(), 12974 BPF_LD_IMM64(BPF_REG_0, 0x952a7bbcULL), 12975 BPF_LD_IMM64(BPF_REG_1, 0xfefefeULL), 12976 BPF_LD_IMM64(BPF_REG_2, 0xeeff0d413122ULL), 12977 BPF_ALU32_REG(BPF_MUL, BPF_REG_2, BPF_REG_1), 12978 BPF_JMP_REG(BPF_JEQ, BPF_REG_2, BPF_REG_0, 2), 12979 BPF_MOV64_IMM(BPF_REG_0, 1), 12980 BPF_EXIT_INSN(), 12981 BPF_MOV64_IMM(BPF_REG_0, 2), 12982 BPF_EXIT_INSN(), 12983 }, 12984 .result = ACCEPT, 12985 .retval = 2, 12986 }, 12987 { 12988 "xadd/w check unaligned stack", 12989 .insns = { 12990 BPF_MOV64_IMM(BPF_REG_0, 1), 12991 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 12992 BPF_STX_XADD(BPF_W, BPF_REG_10, BPF_REG_0, -7), 12993 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 12994 BPF_EXIT_INSN(), 12995 }, 12996 .result = REJECT, 12997 .errstr = "misaligned stack access off", 12998 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12999 }, 13000 { 13001 "xadd/w check unaligned map", 13002 .insns = { 13003 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 13004 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13005 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13006 BPF_LD_MAP_FD(BPF_REG_1, 0), 13007 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13008 BPF_FUNC_map_lookup_elem), 13009 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 13010 BPF_EXIT_INSN(), 13011 BPF_MOV64_IMM(BPF_REG_1, 1), 13012 BPF_STX_XADD(BPF_W, BPF_REG_0, BPF_REG_1, 3), 13013 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 3), 13014 BPF_EXIT_INSN(), 13015 }, 13016 .fixup_map_hash_8b = { 3 }, 13017 .result = REJECT, 13018 .errstr = "misaligned value access off", 13019 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13020 }, 13021 { 13022 "xadd/w check unaligned pkt", 13023 .insns = { 13024 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13025 offsetof(struct xdp_md, data)), 13026 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 13027 offsetof(struct xdp_md, data_end)), 13028 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 13029 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 13030 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 2), 13031 BPF_MOV64_IMM(BPF_REG_0, 99), 13032 BPF_JMP_IMM(BPF_JA, 0, 0, 6), 13033 BPF_MOV64_IMM(BPF_REG_0, 1), 13034 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 13035 BPF_ST_MEM(BPF_W, BPF_REG_2, 3, 0), 13036 BPF_STX_XADD(BPF_W, BPF_REG_2, BPF_REG_0, 1), 13037 BPF_STX_XADD(BPF_W, BPF_REG_2, BPF_REG_0, 2), 13038 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_2, 1), 13039 BPF_EXIT_INSN(), 13040 }, 13041 .result = REJECT, 13042 .errstr = "BPF_XADD stores into R2 pkt is not allowed", 13043 .prog_type = BPF_PROG_TYPE_XDP, 13044 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 13045 }, 13046 { 13047 "xadd/w check whether src/dst got mangled, 1", 13048 .insns = { 13049 BPF_MOV64_IMM(BPF_REG_0, 1), 13050 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 13051 BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 13052 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 13053 BPF_STX_XADD(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 13054 BPF_STX_XADD(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 13055 BPF_JMP_REG(BPF_JNE, BPF_REG_6, BPF_REG_0, 3), 13056 BPF_JMP_REG(BPF_JNE, BPF_REG_7, BPF_REG_10, 2), 13057 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 13058 BPF_EXIT_INSN(), 13059 BPF_MOV64_IMM(BPF_REG_0, 42), 13060 BPF_EXIT_INSN(), 13061 }, 13062 .result = ACCEPT, 13063 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13064 .retval = 3, 13065 }, 13066 { 13067 "xadd/w check whether src/dst got mangled, 2", 13068 .insns = { 13069 BPF_MOV64_IMM(BPF_REG_0, 1), 13070 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 13071 BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 13072 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -8), 13073 BPF_STX_XADD(BPF_W, BPF_REG_10, BPF_REG_0, -8), 13074 BPF_STX_XADD(BPF_W, BPF_REG_10, BPF_REG_0, -8), 13075 BPF_JMP_REG(BPF_JNE, BPF_REG_6, BPF_REG_0, 3), 13076 BPF_JMP_REG(BPF_JNE, BPF_REG_7, BPF_REG_10, 2), 13077 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -8), 13078 BPF_EXIT_INSN(), 13079 BPF_MOV64_IMM(BPF_REG_0, 42), 13080 BPF_EXIT_INSN(), 13081 }, 13082 .result = ACCEPT, 13083 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13084 .retval = 3, 13085 }, 13086 { 13087 "bpf_get_stack return R0 within range", 13088 .insns = { 13089 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 13090 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 13091 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13092 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13093 BPF_LD_MAP_FD(BPF_REG_1, 0), 13094 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13095 BPF_FUNC_map_lookup_elem), 13096 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 28), 13097 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0), 13098 BPF_MOV64_IMM(BPF_REG_9, sizeof(struct test_val)), 13099 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 13100 BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 13101 BPF_MOV64_IMM(BPF_REG_3, sizeof(struct test_val)), 13102 BPF_MOV64_IMM(BPF_REG_4, 256), 13103 BPF_EMIT_CALL(BPF_FUNC_get_stack), 13104 BPF_MOV64_IMM(BPF_REG_1, 0), 13105 BPF_MOV64_REG(BPF_REG_8, BPF_REG_0), 13106 BPF_ALU64_IMM(BPF_LSH, BPF_REG_8, 32), 13107 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_8, 32), 13108 BPF_JMP_REG(BPF_JSLT, BPF_REG_1, BPF_REG_8, 16), 13109 BPF_ALU64_REG(BPF_SUB, BPF_REG_9, BPF_REG_8), 13110 BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 13111 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_8), 13112 BPF_MOV64_REG(BPF_REG_1, BPF_REG_9), 13113 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 32), 13114 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_1, 32), 13115 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 13116 BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_1), 13117 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 13118 BPF_MOV64_IMM(BPF_REG_5, sizeof(struct test_val)), 13119 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_5), 13120 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 4), 13121 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 13122 BPF_MOV64_REG(BPF_REG_3, BPF_REG_9), 13123 BPF_MOV64_IMM(BPF_REG_4, 0), 13124 BPF_EMIT_CALL(BPF_FUNC_get_stack), 13125 BPF_EXIT_INSN(), 13126 }, 13127 .fixup_map_hash_48b = { 4 }, 13128 .result = ACCEPT, 13129 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 13130 }, 13131 { 13132 "ld_abs: invalid op 1", 13133 .insns = { 13134 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 13135 BPF_LD_ABS(BPF_DW, 0), 13136 BPF_EXIT_INSN(), 13137 }, 13138 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13139 .result = REJECT, 13140 .errstr = "unknown opcode", 13141 }, 13142 { 13143 "ld_abs: invalid op 2", 13144 .insns = { 13145 BPF_MOV32_IMM(BPF_REG_0, 256), 13146 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 13147 BPF_LD_IND(BPF_DW, BPF_REG_0, 0), 13148 BPF_EXIT_INSN(), 13149 }, 13150 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13151 .result = REJECT, 13152 .errstr = "unknown opcode", 13153 }, 13154 { 13155 "ld_abs: nmap reduced", 13156 .insns = { 13157 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 13158 BPF_LD_ABS(BPF_H, 12), 13159 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x806, 28), 13160 BPF_LD_ABS(BPF_H, 12), 13161 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x806, 26), 13162 BPF_MOV32_IMM(BPF_REG_0, 18), 13163 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -64), 13164 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -64), 13165 BPF_LD_IND(BPF_W, BPF_REG_7, 14), 13166 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -60), 13167 BPF_MOV32_IMM(BPF_REG_0, 280971478), 13168 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -56), 13169 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -56), 13170 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -60), 13171 BPF_ALU32_REG(BPF_SUB, BPF_REG_0, BPF_REG_7), 13172 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 15), 13173 BPF_LD_ABS(BPF_H, 12), 13174 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x806, 13), 13175 BPF_MOV32_IMM(BPF_REG_0, 22), 13176 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -56), 13177 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -56), 13178 BPF_LD_IND(BPF_H, BPF_REG_7, 14), 13179 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -52), 13180 BPF_MOV32_IMM(BPF_REG_0, 17366), 13181 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -48), 13182 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -48), 13183 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -52), 13184 BPF_ALU32_REG(BPF_SUB, BPF_REG_0, BPF_REG_7), 13185 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 13186 BPF_MOV32_IMM(BPF_REG_0, 256), 13187 BPF_EXIT_INSN(), 13188 BPF_MOV32_IMM(BPF_REG_0, 0), 13189 BPF_EXIT_INSN(), 13190 }, 13191 .data = { 13192 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x06, 0, 13193 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13194 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6, 13195 }, 13196 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13197 .result = ACCEPT, 13198 .retval = 256, 13199 }, 13200 { 13201 "ld_abs: div + abs, test 1", 13202 .insns = { 13203 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 13204 BPF_LD_ABS(BPF_B, 3), 13205 BPF_ALU64_IMM(BPF_MOV, BPF_REG_2, 2), 13206 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_2), 13207 BPF_ALU64_REG(BPF_MOV, BPF_REG_8, BPF_REG_0), 13208 BPF_LD_ABS(BPF_B, 4), 13209 BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_0), 13210 BPF_LD_IND(BPF_B, BPF_REG_8, -70), 13211 BPF_EXIT_INSN(), 13212 }, 13213 .data = { 13214 10, 20, 30, 40, 50, 13215 }, 13216 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13217 .result = ACCEPT, 13218 .retval = 10, 13219 }, 13220 { 13221 "ld_abs: div + abs, test 2", 13222 .insns = { 13223 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 13224 BPF_LD_ABS(BPF_B, 3), 13225 BPF_ALU64_IMM(BPF_MOV, BPF_REG_2, 2), 13226 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_2), 13227 BPF_ALU64_REG(BPF_MOV, BPF_REG_8, BPF_REG_0), 13228 BPF_LD_ABS(BPF_B, 128), 13229 BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_0), 13230 BPF_LD_IND(BPF_B, BPF_REG_8, -70), 13231 BPF_EXIT_INSN(), 13232 }, 13233 .data = { 13234 10, 20, 30, 40, 50, 13235 }, 13236 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13237 .result = ACCEPT, 13238 .retval = 0, 13239 }, 13240 { 13241 "ld_abs: div + abs, test 3", 13242 .insns = { 13243 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 13244 BPF_ALU64_IMM(BPF_MOV, BPF_REG_7, 0), 13245 BPF_LD_ABS(BPF_B, 3), 13246 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_7), 13247 BPF_EXIT_INSN(), 13248 }, 13249 .data = { 13250 10, 20, 30, 40, 50, 13251 }, 13252 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13253 .result = ACCEPT, 13254 .retval = 0, 13255 }, 13256 { 13257 "ld_abs: div + abs, test 4", 13258 .insns = { 13259 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 13260 BPF_ALU64_IMM(BPF_MOV, BPF_REG_7, 0), 13261 BPF_LD_ABS(BPF_B, 256), 13262 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_7), 13263 BPF_EXIT_INSN(), 13264 }, 13265 .data = { 13266 10, 20, 30, 40, 50, 13267 }, 13268 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13269 .result = ACCEPT, 13270 .retval = 0, 13271 }, 13272 { 13273 "ld_abs: vlan + abs, test 1", 13274 .insns = { }, 13275 .data = { 13276 0x34, 13277 }, 13278 .fill_helper = bpf_fill_ld_abs_vlan_push_pop, 13279 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13280 .result = ACCEPT, 13281 .retval = 0xbef, 13282 }, 13283 { 13284 "ld_abs: vlan + abs, test 2", 13285 .insns = { 13286 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 13287 BPF_LD_ABS(BPF_B, 0), 13288 BPF_LD_ABS(BPF_H, 0), 13289 BPF_LD_ABS(BPF_W, 0), 13290 BPF_MOV64_REG(BPF_REG_7, BPF_REG_6), 13291 BPF_MOV64_IMM(BPF_REG_6, 0), 13292 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 13293 BPF_MOV64_IMM(BPF_REG_2, 1), 13294 BPF_MOV64_IMM(BPF_REG_3, 2), 13295 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13296 BPF_FUNC_skb_vlan_push), 13297 BPF_MOV64_REG(BPF_REG_6, BPF_REG_7), 13298 BPF_LD_ABS(BPF_B, 0), 13299 BPF_LD_ABS(BPF_H, 0), 13300 BPF_LD_ABS(BPF_W, 0), 13301 BPF_MOV64_IMM(BPF_REG_0, 42), 13302 BPF_EXIT_INSN(), 13303 }, 13304 .data = { 13305 0x34, 13306 }, 13307 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13308 .result = ACCEPT, 13309 .retval = 42, 13310 }, 13311 { 13312 "ld_abs: jump around ld_abs", 13313 .insns = { }, 13314 .data = { 13315 10, 11, 13316 }, 13317 .fill_helper = bpf_fill_jump_around_ld_abs, 13318 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13319 .result = ACCEPT, 13320 .retval = 10, 13321 }, 13322 { 13323 "ld_dw: xor semi-random 64 bit imms, test 1", 13324 .insns = { }, 13325 .data = { }, 13326 .fill_helper = bpf_fill_rand_ld_dw, 13327 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13328 .result = ACCEPT, 13329 .retval = 4090, 13330 }, 13331 { 13332 "ld_dw: xor semi-random 64 bit imms, test 2", 13333 .insns = { }, 13334 .data = { }, 13335 .fill_helper = bpf_fill_rand_ld_dw, 13336 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13337 .result = ACCEPT, 13338 .retval = 2047, 13339 }, 13340 { 13341 "ld_dw: xor semi-random 64 bit imms, test 3", 13342 .insns = { }, 13343 .data = { }, 13344 .fill_helper = bpf_fill_rand_ld_dw, 13345 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13346 .result = ACCEPT, 13347 .retval = 511, 13348 }, 13349 { 13350 "ld_dw: xor semi-random 64 bit imms, test 4", 13351 .insns = { }, 13352 .data = { }, 13353 .fill_helper = bpf_fill_rand_ld_dw, 13354 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13355 .result = ACCEPT, 13356 .retval = 5, 13357 }, 13358 { 13359 "pass unmodified ctx pointer to helper", 13360 .insns = { 13361 BPF_MOV64_IMM(BPF_REG_2, 0), 13362 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13363 BPF_FUNC_csum_update), 13364 BPF_MOV64_IMM(BPF_REG_0, 0), 13365 BPF_EXIT_INSN(), 13366 }, 13367 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13368 .result = ACCEPT, 13369 }, 13370 { 13371 "reference tracking: leak potential reference", 13372 .insns = { 13373 BPF_SK_LOOKUP, 13374 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), /* leak reference */ 13375 BPF_EXIT_INSN(), 13376 }, 13377 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13378 .errstr = "Unreleased reference", 13379 .result = REJECT, 13380 }, 13381 { 13382 "reference tracking: leak potential reference on stack", 13383 .insns = { 13384 BPF_SK_LOOKUP, 13385 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 13386 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 13387 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_0, 0), 13388 BPF_MOV64_IMM(BPF_REG_0, 0), 13389 BPF_EXIT_INSN(), 13390 }, 13391 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13392 .errstr = "Unreleased reference", 13393 .result = REJECT, 13394 }, 13395 { 13396 "reference tracking: leak potential reference on stack 2", 13397 .insns = { 13398 BPF_SK_LOOKUP, 13399 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 13400 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 13401 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_0, 0), 13402 BPF_MOV64_IMM(BPF_REG_0, 0), 13403 BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0), 13404 BPF_EXIT_INSN(), 13405 }, 13406 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13407 .errstr = "Unreleased reference", 13408 .result = REJECT, 13409 }, 13410 { 13411 "reference tracking: zero potential reference", 13412 .insns = { 13413 BPF_SK_LOOKUP, 13414 BPF_MOV64_IMM(BPF_REG_0, 0), /* leak reference */ 13415 BPF_EXIT_INSN(), 13416 }, 13417 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13418 .errstr = "Unreleased reference", 13419 .result = REJECT, 13420 }, 13421 { 13422 "reference tracking: copy and zero potential references", 13423 .insns = { 13424 BPF_SK_LOOKUP, 13425 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0), 13426 BPF_MOV64_IMM(BPF_REG_0, 0), 13427 BPF_MOV64_IMM(BPF_REG_7, 0), /* leak reference */ 13428 BPF_EXIT_INSN(), 13429 }, 13430 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13431 .errstr = "Unreleased reference", 13432 .result = REJECT, 13433 }, 13434 { 13435 "reference tracking: release reference without check", 13436 .insns = { 13437 BPF_SK_LOOKUP, 13438 /* reference in r0 may be NULL */ 13439 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 13440 BPF_MOV64_IMM(BPF_REG_2, 0), 13441 BPF_EMIT_CALL(BPF_FUNC_sk_release), 13442 BPF_EXIT_INSN(), 13443 }, 13444 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13445 .errstr = "type=sock_or_null expected=sock", 13446 .result = REJECT, 13447 }, 13448 { 13449 "reference tracking: release reference", 13450 .insns = { 13451 BPF_SK_LOOKUP, 13452 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 13453 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 13454 BPF_EMIT_CALL(BPF_FUNC_sk_release), 13455 BPF_EXIT_INSN(), 13456 }, 13457 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13458 .result = ACCEPT, 13459 }, 13460 { 13461 "reference tracking: release reference 2", 13462 .insns = { 13463 BPF_SK_LOOKUP, 13464 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 13465 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 13466 BPF_EXIT_INSN(), 13467 BPF_EMIT_CALL(BPF_FUNC_sk_release), 13468 BPF_EXIT_INSN(), 13469 }, 13470 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13471 .result = ACCEPT, 13472 }, 13473 { 13474 "reference tracking: release reference twice", 13475 .insns = { 13476 BPF_SK_LOOKUP, 13477 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 13478 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 13479 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 13480 BPF_EMIT_CALL(BPF_FUNC_sk_release), 13481 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 13482 BPF_EMIT_CALL(BPF_FUNC_sk_release), 13483 BPF_EXIT_INSN(), 13484 }, 13485 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13486 .errstr = "type=inv expected=sock", 13487 .result = REJECT, 13488 }, 13489 { 13490 "reference tracking: release reference twice inside branch", 13491 .insns = { 13492 BPF_SK_LOOKUP, 13493 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 13494 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 13495 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), /* goto end */ 13496 BPF_EMIT_CALL(BPF_FUNC_sk_release), 13497 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 13498 BPF_EMIT_CALL(BPF_FUNC_sk_release), 13499 BPF_EXIT_INSN(), 13500 }, 13501 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13502 .errstr = "type=inv expected=sock", 13503 .result = REJECT, 13504 }, 13505 { 13506 "reference tracking: alloc, check, free in one subbranch", 13507 .insns = { 13508 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13509 offsetof(struct __sk_buff, data)), 13510 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 13511 offsetof(struct __sk_buff, data_end)), 13512 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 13513 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 16), 13514 /* if (offsetof(skb, mark) > data_len) exit; */ 13515 BPF_JMP_REG(BPF_JLE, BPF_REG_0, BPF_REG_3, 1), 13516 BPF_EXIT_INSN(), 13517 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_2, 13518 offsetof(struct __sk_buff, mark)), 13519 BPF_SK_LOOKUP, 13520 BPF_JMP_IMM(BPF_JEQ, BPF_REG_6, 0, 1), /* mark == 0? */ 13521 /* Leak reference in R0 */ 13522 BPF_EXIT_INSN(), 13523 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), /* sk NULL? */ 13524 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 13525 BPF_EMIT_CALL(BPF_FUNC_sk_release), 13526 BPF_EXIT_INSN(), 13527 }, 13528 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13529 .errstr = "Unreleased reference", 13530 .result = REJECT, 13531 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 13532 }, 13533 { 13534 "reference tracking: alloc, check, free in both subbranches", 13535 .insns = { 13536 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13537 offsetof(struct __sk_buff, data)), 13538 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 13539 offsetof(struct __sk_buff, data_end)), 13540 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 13541 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 16), 13542 /* if (offsetof(skb, mark) > data_len) exit; */ 13543 BPF_JMP_REG(BPF_JLE, BPF_REG_0, BPF_REG_3, 1), 13544 BPF_EXIT_INSN(), 13545 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_2, 13546 offsetof(struct __sk_buff, mark)), 13547 BPF_SK_LOOKUP, 13548 BPF_JMP_IMM(BPF_JEQ, BPF_REG_6, 0, 4), /* mark == 0? */ 13549 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), /* sk NULL? */ 13550 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 13551 BPF_EMIT_CALL(BPF_FUNC_sk_release), 13552 BPF_EXIT_INSN(), 13553 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), /* sk NULL? */ 13554 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 13555 BPF_EMIT_CALL(BPF_FUNC_sk_release), 13556 BPF_EXIT_INSN(), 13557 }, 13558 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13559 .result = ACCEPT, 13560 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 13561 }, 13562 { 13563 "reference tracking in call: free reference in subprog", 13564 .insns = { 13565 BPF_SK_LOOKUP, 13566 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), /* unchecked reference */ 13567 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 13568 BPF_MOV64_IMM(BPF_REG_0, 0), 13569 BPF_EXIT_INSN(), 13570 13571 /* subprog 1 */ 13572 BPF_MOV64_REG(BPF_REG_2, BPF_REG_1), 13573 BPF_JMP_IMM(BPF_JEQ, BPF_REG_2, 0, 1), 13574 BPF_EMIT_CALL(BPF_FUNC_sk_release), 13575 BPF_EXIT_INSN(), 13576 }, 13577 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13578 .result = ACCEPT, 13579 }, 13580 { 13581 "pass modified ctx pointer to helper, 1", 13582 .insns = { 13583 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -612), 13584 BPF_MOV64_IMM(BPF_REG_2, 0), 13585 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13586 BPF_FUNC_csum_update), 13587 BPF_MOV64_IMM(BPF_REG_0, 0), 13588 BPF_EXIT_INSN(), 13589 }, 13590 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13591 .result = REJECT, 13592 .errstr = "dereference of modified ctx ptr", 13593 }, 13594 { 13595 "pass modified ctx pointer to helper, 2", 13596 .insns = { 13597 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -612), 13598 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13599 BPF_FUNC_get_socket_cookie), 13600 BPF_MOV64_IMM(BPF_REG_0, 0), 13601 BPF_EXIT_INSN(), 13602 }, 13603 .result_unpriv = REJECT, 13604 .result = REJECT, 13605 .errstr_unpriv = "dereference of modified ctx ptr", 13606 .errstr = "dereference of modified ctx ptr", 13607 }, 13608 { 13609 "pass modified ctx pointer to helper, 3", 13610 .insns = { 13611 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 0), 13612 BPF_ALU64_IMM(BPF_AND, BPF_REG_3, 4), 13613 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 13614 BPF_MOV64_IMM(BPF_REG_2, 0), 13615 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13616 BPF_FUNC_csum_update), 13617 BPF_MOV64_IMM(BPF_REG_0, 0), 13618 BPF_EXIT_INSN(), 13619 }, 13620 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13621 .result = REJECT, 13622 .errstr = "variable ctx access var_off=(0x0; 0x4)", 13623 }, 13624 { 13625 "mov64 src == dst", 13626 .insns = { 13627 BPF_MOV64_IMM(BPF_REG_2, 0), 13628 BPF_MOV64_REG(BPF_REG_2, BPF_REG_2), 13629 // Check bounds are OK 13630 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 13631 BPF_MOV64_IMM(BPF_REG_0, 0), 13632 BPF_EXIT_INSN(), 13633 }, 13634 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13635 .result = ACCEPT, 13636 }, 13637 { 13638 "mov64 src != dst", 13639 .insns = { 13640 BPF_MOV64_IMM(BPF_REG_3, 0), 13641 BPF_MOV64_REG(BPF_REG_2, BPF_REG_3), 13642 // Check bounds are OK 13643 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 13644 BPF_MOV64_IMM(BPF_REG_0, 0), 13645 BPF_EXIT_INSN(), 13646 }, 13647 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13648 .result = ACCEPT, 13649 }, 13650 { 13651 "reference tracking in call: free reference in subprog and outside", 13652 .insns = { 13653 BPF_SK_LOOKUP, 13654 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), /* unchecked reference */ 13655 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 13656 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 13657 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 13658 BPF_EMIT_CALL(BPF_FUNC_sk_release), 13659 BPF_EXIT_INSN(), 13660 13661 /* subprog 1 */ 13662 BPF_MOV64_REG(BPF_REG_2, BPF_REG_1), 13663 BPF_JMP_IMM(BPF_JEQ, BPF_REG_2, 0, 1), 13664 BPF_EMIT_CALL(BPF_FUNC_sk_release), 13665 BPF_EXIT_INSN(), 13666 }, 13667 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13668 .errstr = "type=inv expected=sock", 13669 .result = REJECT, 13670 }, 13671 { 13672 "reference tracking in call: alloc & leak reference in subprog", 13673 .insns = { 13674 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 13675 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 13676 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 13677 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 13678 BPF_MOV64_IMM(BPF_REG_0, 0), 13679 BPF_EXIT_INSN(), 13680 13681 /* subprog 1 */ 13682 BPF_MOV64_REG(BPF_REG_6, BPF_REG_4), 13683 BPF_SK_LOOKUP, 13684 /* spill unchecked sk_ptr into stack of caller */ 13685 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 13686 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 13687 BPF_EXIT_INSN(), 13688 }, 13689 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13690 .errstr = "Unreleased reference", 13691 .result = REJECT, 13692 }, 13693 { 13694 "reference tracking in call: alloc in subprog, release outside", 13695 .insns = { 13696 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 13697 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 13698 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 13699 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 13700 BPF_EMIT_CALL(BPF_FUNC_sk_release), 13701 BPF_EXIT_INSN(), 13702 13703 /* subprog 1 */ 13704 BPF_SK_LOOKUP, 13705 BPF_EXIT_INSN(), /* return sk */ 13706 }, 13707 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13708 .retval = POINTER_VALUE, 13709 .result = ACCEPT, 13710 }, 13711 { 13712 "reference tracking in call: sk_ptr leak into caller stack", 13713 .insns = { 13714 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 13715 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 13716 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 13717 BPF_MOV64_IMM(BPF_REG_0, 0), 13718 BPF_EXIT_INSN(), 13719 13720 /* subprog 1 */ 13721 BPF_MOV64_REG(BPF_REG_5, BPF_REG_10), 13722 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, -8), 13723 BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_4, 0), 13724 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 5), 13725 /* spill unchecked sk_ptr into stack of caller */ 13726 BPF_MOV64_REG(BPF_REG_5, BPF_REG_10), 13727 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, -8), 13728 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_5, 0), 13729 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_0, 0), 13730 BPF_EXIT_INSN(), 13731 13732 /* subprog 2 */ 13733 BPF_SK_LOOKUP, 13734 BPF_EXIT_INSN(), 13735 }, 13736 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13737 .errstr = "Unreleased reference", 13738 .result = REJECT, 13739 }, 13740 { 13741 "reference tracking in call: sk_ptr spill into caller stack", 13742 .insns = { 13743 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 13744 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 13745 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 13746 BPF_MOV64_IMM(BPF_REG_0, 0), 13747 BPF_EXIT_INSN(), 13748 13749 /* subprog 1 */ 13750 BPF_MOV64_REG(BPF_REG_5, BPF_REG_10), 13751 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, -8), 13752 BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_4, 0), 13753 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8), 13754 /* spill unchecked sk_ptr into stack of caller */ 13755 BPF_MOV64_REG(BPF_REG_5, BPF_REG_10), 13756 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, -8), 13757 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_5, 0), 13758 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_0, 0), 13759 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 13760 /* now the sk_ptr is verified, free the reference */ 13761 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_4, 0), 13762 BPF_EMIT_CALL(BPF_FUNC_sk_release), 13763 BPF_EXIT_INSN(), 13764 13765 /* subprog 2 */ 13766 BPF_SK_LOOKUP, 13767 BPF_EXIT_INSN(), 13768 }, 13769 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13770 .result = ACCEPT, 13771 }, 13772 { 13773 "reference tracking: allow LD_ABS", 13774 .insns = { 13775 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 13776 BPF_SK_LOOKUP, 13777 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 13778 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 13779 BPF_EMIT_CALL(BPF_FUNC_sk_release), 13780 BPF_LD_ABS(BPF_B, 0), 13781 BPF_LD_ABS(BPF_H, 0), 13782 BPF_LD_ABS(BPF_W, 0), 13783 BPF_EXIT_INSN(), 13784 }, 13785 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13786 .result = ACCEPT, 13787 }, 13788 { 13789 "reference tracking: forbid LD_ABS while holding reference", 13790 .insns = { 13791 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 13792 BPF_SK_LOOKUP, 13793 BPF_LD_ABS(BPF_B, 0), 13794 BPF_LD_ABS(BPF_H, 0), 13795 BPF_LD_ABS(BPF_W, 0), 13796 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 13797 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 13798 BPF_EMIT_CALL(BPF_FUNC_sk_release), 13799 BPF_EXIT_INSN(), 13800 }, 13801 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13802 .errstr = "BPF_LD_[ABS|IND] cannot be mixed with socket references", 13803 .result = REJECT, 13804 }, 13805 { 13806 "reference tracking: allow LD_IND", 13807 .insns = { 13808 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 13809 BPF_SK_LOOKUP, 13810 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 13811 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 13812 BPF_EMIT_CALL(BPF_FUNC_sk_release), 13813 BPF_MOV64_IMM(BPF_REG_7, 1), 13814 BPF_LD_IND(BPF_W, BPF_REG_7, -0x200000), 13815 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 13816 BPF_EXIT_INSN(), 13817 }, 13818 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13819 .result = ACCEPT, 13820 .retval = 1, 13821 }, 13822 { 13823 "reference tracking: forbid LD_IND while holding reference", 13824 .insns = { 13825 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 13826 BPF_SK_LOOKUP, 13827 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 13828 BPF_MOV64_IMM(BPF_REG_7, 1), 13829 BPF_LD_IND(BPF_W, BPF_REG_7, -0x200000), 13830 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 13831 BPF_MOV64_REG(BPF_REG_1, BPF_REG_4), 13832 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 13833 BPF_EMIT_CALL(BPF_FUNC_sk_release), 13834 BPF_EXIT_INSN(), 13835 }, 13836 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13837 .errstr = "BPF_LD_[ABS|IND] cannot be mixed with socket references", 13838 .result = REJECT, 13839 }, 13840 { 13841 "reference tracking: check reference or tail call", 13842 .insns = { 13843 BPF_MOV64_REG(BPF_REG_7, BPF_REG_1), 13844 BPF_SK_LOOKUP, 13845 /* if (sk) bpf_sk_release() */ 13846 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 13847 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 7), 13848 /* bpf_tail_call() */ 13849 BPF_MOV64_IMM(BPF_REG_3, 2), 13850 BPF_LD_MAP_FD(BPF_REG_2, 0), 13851 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 13852 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13853 BPF_FUNC_tail_call), 13854 BPF_MOV64_IMM(BPF_REG_0, 0), 13855 BPF_EXIT_INSN(), 13856 BPF_EMIT_CALL(BPF_FUNC_sk_release), 13857 BPF_EXIT_INSN(), 13858 }, 13859 .fixup_prog1 = { 17 }, 13860 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13861 .result = ACCEPT, 13862 }, 13863 { 13864 "reference tracking: release reference then tail call", 13865 .insns = { 13866 BPF_MOV64_REG(BPF_REG_7, BPF_REG_1), 13867 BPF_SK_LOOKUP, 13868 /* if (sk) bpf_sk_release() */ 13869 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 13870 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 13871 BPF_EMIT_CALL(BPF_FUNC_sk_release), 13872 /* bpf_tail_call() */ 13873 BPF_MOV64_IMM(BPF_REG_3, 2), 13874 BPF_LD_MAP_FD(BPF_REG_2, 0), 13875 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 13876 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13877 BPF_FUNC_tail_call), 13878 BPF_MOV64_IMM(BPF_REG_0, 0), 13879 BPF_EXIT_INSN(), 13880 }, 13881 .fixup_prog1 = { 18 }, 13882 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13883 .result = ACCEPT, 13884 }, 13885 { 13886 "reference tracking: leak possible reference over tail call", 13887 .insns = { 13888 BPF_MOV64_REG(BPF_REG_7, BPF_REG_1), 13889 /* Look up socket and store in REG_6 */ 13890 BPF_SK_LOOKUP, 13891 /* bpf_tail_call() */ 13892 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 13893 BPF_MOV64_IMM(BPF_REG_3, 2), 13894 BPF_LD_MAP_FD(BPF_REG_2, 0), 13895 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 13896 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13897 BPF_FUNC_tail_call), 13898 BPF_MOV64_IMM(BPF_REG_0, 0), 13899 /* if (sk) bpf_sk_release() */ 13900 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 13901 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 13902 BPF_EMIT_CALL(BPF_FUNC_sk_release), 13903 BPF_EXIT_INSN(), 13904 }, 13905 .fixup_prog1 = { 16 }, 13906 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13907 .errstr = "tail_call would lead to reference leak", 13908 .result = REJECT, 13909 }, 13910 { 13911 "reference tracking: leak checked reference over tail call", 13912 .insns = { 13913 BPF_MOV64_REG(BPF_REG_7, BPF_REG_1), 13914 /* Look up socket and store in REG_6 */ 13915 BPF_SK_LOOKUP, 13916 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 13917 /* if (!sk) goto end */ 13918 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 13919 /* bpf_tail_call() */ 13920 BPF_MOV64_IMM(BPF_REG_3, 0), 13921 BPF_LD_MAP_FD(BPF_REG_2, 0), 13922 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 13923 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13924 BPF_FUNC_tail_call), 13925 BPF_MOV64_IMM(BPF_REG_0, 0), 13926 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 13927 BPF_EMIT_CALL(BPF_FUNC_sk_release), 13928 BPF_EXIT_INSN(), 13929 }, 13930 .fixup_prog1 = { 17 }, 13931 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13932 .errstr = "tail_call would lead to reference leak", 13933 .result = REJECT, 13934 }, 13935 { 13936 "reference tracking: mangle and release sock_or_null", 13937 .insns = { 13938 BPF_SK_LOOKUP, 13939 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 13940 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 5), 13941 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 13942 BPF_EMIT_CALL(BPF_FUNC_sk_release), 13943 BPF_EXIT_INSN(), 13944 }, 13945 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13946 .errstr = "R1 pointer arithmetic on sock_or_null prohibited", 13947 .result = REJECT, 13948 }, 13949 { 13950 "reference tracking: mangle and release sock", 13951 .insns = { 13952 BPF_SK_LOOKUP, 13953 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 13954 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 13955 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 5), 13956 BPF_EMIT_CALL(BPF_FUNC_sk_release), 13957 BPF_EXIT_INSN(), 13958 }, 13959 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13960 .errstr = "R1 pointer arithmetic on sock prohibited", 13961 .result = REJECT, 13962 }, 13963 { 13964 "reference tracking: access member", 13965 .insns = { 13966 BPF_SK_LOOKUP, 13967 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 13968 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 13969 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_0, 4), 13970 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 13971 BPF_EMIT_CALL(BPF_FUNC_sk_release), 13972 BPF_EXIT_INSN(), 13973 }, 13974 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13975 .result = ACCEPT, 13976 }, 13977 { 13978 "reference tracking: write to member", 13979 .insns = { 13980 BPF_SK_LOOKUP, 13981 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 13982 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 13983 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 13984 BPF_LD_IMM64(BPF_REG_2, 42), 13985 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_2, 13986 offsetof(struct bpf_sock, mark)), 13987 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 13988 BPF_EMIT_CALL(BPF_FUNC_sk_release), 13989 BPF_LD_IMM64(BPF_REG_0, 0), 13990 BPF_EXIT_INSN(), 13991 }, 13992 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13993 .errstr = "cannot write into socket", 13994 .result = REJECT, 13995 }, 13996 { 13997 "reference tracking: invalid 64-bit access of member", 13998 .insns = { 13999 BPF_SK_LOOKUP, 14000 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 14001 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 14002 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 14003 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 14004 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14005 BPF_EXIT_INSN(), 14006 }, 14007 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14008 .errstr = "invalid bpf_sock access off=0 size=8", 14009 .result = REJECT, 14010 }, 14011 { 14012 "reference tracking: access after release", 14013 .insns = { 14014 BPF_SK_LOOKUP, 14015 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 14016 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 14017 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14018 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0), 14019 BPF_EXIT_INSN(), 14020 }, 14021 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14022 .errstr = "!read_ok", 14023 .result = REJECT, 14024 }, 14025 { 14026 "reference tracking: direct access for lookup", 14027 .insns = { 14028 /* Check that the packet is at least 64B long */ 14029 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 14030 offsetof(struct __sk_buff, data)), 14031 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 14032 offsetof(struct __sk_buff, data_end)), 14033 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 14034 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 64), 14035 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 9), 14036 /* sk = sk_lookup_tcp(ctx, skb->data, ...) */ 14037 BPF_MOV64_IMM(BPF_REG_3, sizeof(struct bpf_sock_tuple)), 14038 BPF_MOV64_IMM(BPF_REG_4, 0), 14039 BPF_MOV64_IMM(BPF_REG_5, 0), 14040 BPF_EMIT_CALL(BPF_FUNC_sk_lookup_tcp), 14041 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 14042 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 14043 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_0, 4), 14044 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 14045 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14046 BPF_EXIT_INSN(), 14047 }, 14048 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14049 .result = ACCEPT, 14050 }, 14051 { 14052 "calls: ctx read at start of subprog", 14053 .insns = { 14054 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 14055 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 5), 14056 BPF_JMP_REG(BPF_JSGT, BPF_REG_0, BPF_REG_0, 0), 14057 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 14058 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 14059 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 14060 BPF_EXIT_INSN(), 14061 BPF_LDX_MEM(BPF_B, BPF_REG_9, BPF_REG_1, 0), 14062 BPF_MOV64_IMM(BPF_REG_0, 0), 14063 BPF_EXIT_INSN(), 14064 }, 14065 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 14066 .errstr_unpriv = "function calls to other bpf functions are allowed for root only", 14067 .result_unpriv = REJECT, 14068 .result = ACCEPT, 14069 }, 14070 { 14071 "check wire_len is not readable by sockets", 14072 .insns = { 14073 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 14074 offsetof(struct __sk_buff, wire_len)), 14075 BPF_EXIT_INSN(), 14076 }, 14077 .errstr = "invalid bpf_context access", 14078 .result = REJECT, 14079 }, 14080 { 14081 "check wire_len is readable by tc classifier", 14082 .insns = { 14083 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 14084 offsetof(struct __sk_buff, wire_len)), 14085 BPF_EXIT_INSN(), 14086 }, 14087 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14088 .result = ACCEPT, 14089 }, 14090 { 14091 "check wire_len is not writable by tc classifier", 14092 .insns = { 14093 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 14094 offsetof(struct __sk_buff, wire_len)), 14095 BPF_EXIT_INSN(), 14096 }, 14097 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14098 .errstr = "invalid bpf_context access", 14099 .errstr_unpriv = "R1 leaks addr", 14100 .result = REJECT, 14101 }, 14102 }; 14103 14104 static int probe_filter_length(const struct bpf_insn *fp) 14105 { 14106 int len; 14107 14108 for (len = MAX_INSNS - 1; len > 0; --len) 14109 if (fp[len].code != 0 || fp[len].imm != 0) 14110 break; 14111 return len + 1; 14112 } 14113 14114 static int create_map(uint32_t type, uint32_t size_key, 14115 uint32_t size_value, uint32_t max_elem) 14116 { 14117 int fd; 14118 14119 fd = bpf_create_map(type, size_key, size_value, max_elem, 14120 type == BPF_MAP_TYPE_HASH ? BPF_F_NO_PREALLOC : 0); 14121 if (fd < 0) 14122 printf("Failed to create hash map '%s'!\n", strerror(errno)); 14123 14124 return fd; 14125 } 14126 14127 static int create_prog_dummy1(enum bpf_map_type prog_type) 14128 { 14129 struct bpf_insn prog[] = { 14130 BPF_MOV64_IMM(BPF_REG_0, 42), 14131 BPF_EXIT_INSN(), 14132 }; 14133 14134 return bpf_load_program(prog_type, prog, 14135 ARRAY_SIZE(prog), "GPL", 0, NULL, 0); 14136 } 14137 14138 static int create_prog_dummy2(enum bpf_map_type prog_type, int mfd, int idx) 14139 { 14140 struct bpf_insn prog[] = { 14141 BPF_MOV64_IMM(BPF_REG_3, idx), 14142 BPF_LD_MAP_FD(BPF_REG_2, mfd), 14143 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 14144 BPF_FUNC_tail_call), 14145 BPF_MOV64_IMM(BPF_REG_0, 41), 14146 BPF_EXIT_INSN(), 14147 }; 14148 14149 return bpf_load_program(prog_type, prog, 14150 ARRAY_SIZE(prog), "GPL", 0, NULL, 0); 14151 } 14152 14153 static int create_prog_array(enum bpf_map_type prog_type, uint32_t max_elem, 14154 int p1key) 14155 { 14156 int p2key = 1; 14157 int mfd, p1fd, p2fd; 14158 14159 mfd = bpf_create_map(BPF_MAP_TYPE_PROG_ARRAY, sizeof(int), 14160 sizeof(int), max_elem, 0); 14161 if (mfd < 0) { 14162 printf("Failed to create prog array '%s'!\n", strerror(errno)); 14163 return -1; 14164 } 14165 14166 p1fd = create_prog_dummy1(prog_type); 14167 p2fd = create_prog_dummy2(prog_type, mfd, p2key); 14168 if (p1fd < 0 || p2fd < 0) 14169 goto out; 14170 if (bpf_map_update_elem(mfd, &p1key, &p1fd, BPF_ANY) < 0) 14171 goto out; 14172 if (bpf_map_update_elem(mfd, &p2key, &p2fd, BPF_ANY) < 0) 14173 goto out; 14174 close(p2fd); 14175 close(p1fd); 14176 14177 return mfd; 14178 out: 14179 close(p2fd); 14180 close(p1fd); 14181 close(mfd); 14182 return -1; 14183 } 14184 14185 static int create_map_in_map(void) 14186 { 14187 int inner_map_fd, outer_map_fd; 14188 14189 inner_map_fd = bpf_create_map(BPF_MAP_TYPE_ARRAY, sizeof(int), 14190 sizeof(int), 1, 0); 14191 if (inner_map_fd < 0) { 14192 printf("Failed to create array '%s'!\n", strerror(errno)); 14193 return inner_map_fd; 14194 } 14195 14196 outer_map_fd = bpf_create_map_in_map(BPF_MAP_TYPE_ARRAY_OF_MAPS, NULL, 14197 sizeof(int), inner_map_fd, 1, 0); 14198 if (outer_map_fd < 0) 14199 printf("Failed to create array of maps '%s'!\n", 14200 strerror(errno)); 14201 14202 close(inner_map_fd); 14203 14204 return outer_map_fd; 14205 } 14206 14207 static int create_cgroup_storage(bool percpu) 14208 { 14209 enum bpf_map_type type = percpu ? BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE : 14210 BPF_MAP_TYPE_CGROUP_STORAGE; 14211 int fd; 14212 14213 fd = bpf_create_map(type, sizeof(struct bpf_cgroup_storage_key), 14214 TEST_DATA_LEN, 0, 0); 14215 if (fd < 0) 14216 printf("Failed to create cgroup storage '%s'!\n", 14217 strerror(errno)); 14218 14219 return fd; 14220 } 14221 14222 static char bpf_vlog[UINT_MAX >> 8]; 14223 14224 static void do_test_fixup(struct bpf_test *test, enum bpf_map_type prog_type, 14225 struct bpf_insn *prog, int *map_fds) 14226 { 14227 int *fixup_map_hash_8b = test->fixup_map_hash_8b; 14228 int *fixup_map_hash_48b = test->fixup_map_hash_48b; 14229 int *fixup_map_hash_16b = test->fixup_map_hash_16b; 14230 int *fixup_map_array_48b = test->fixup_map_array_48b; 14231 int *fixup_map_sockmap = test->fixup_map_sockmap; 14232 int *fixup_map_sockhash = test->fixup_map_sockhash; 14233 int *fixup_map_xskmap = test->fixup_map_xskmap; 14234 int *fixup_map_stacktrace = test->fixup_map_stacktrace; 14235 int *fixup_prog1 = test->fixup_prog1; 14236 int *fixup_prog2 = test->fixup_prog2; 14237 int *fixup_map_in_map = test->fixup_map_in_map; 14238 int *fixup_cgroup_storage = test->fixup_cgroup_storage; 14239 int *fixup_percpu_cgroup_storage = test->fixup_percpu_cgroup_storage; 14240 14241 if (test->fill_helper) 14242 test->fill_helper(test); 14243 14244 /* Allocating HTs with 1 elem is fine here, since we only test 14245 * for verifier and not do a runtime lookup, so the only thing 14246 * that really matters is value size in this case. 14247 */ 14248 if (*fixup_map_hash_8b) { 14249 map_fds[0] = create_map(BPF_MAP_TYPE_HASH, sizeof(long long), 14250 sizeof(long long), 1); 14251 do { 14252 prog[*fixup_map_hash_8b].imm = map_fds[0]; 14253 fixup_map_hash_8b++; 14254 } while (*fixup_map_hash_8b); 14255 } 14256 14257 if (*fixup_map_hash_48b) { 14258 map_fds[1] = create_map(BPF_MAP_TYPE_HASH, sizeof(long long), 14259 sizeof(struct test_val), 1); 14260 do { 14261 prog[*fixup_map_hash_48b].imm = map_fds[1]; 14262 fixup_map_hash_48b++; 14263 } while (*fixup_map_hash_48b); 14264 } 14265 14266 if (*fixup_map_hash_16b) { 14267 map_fds[2] = create_map(BPF_MAP_TYPE_HASH, sizeof(long long), 14268 sizeof(struct other_val), 1); 14269 do { 14270 prog[*fixup_map_hash_16b].imm = map_fds[2]; 14271 fixup_map_hash_16b++; 14272 } while (*fixup_map_hash_16b); 14273 } 14274 14275 if (*fixup_map_array_48b) { 14276 map_fds[3] = create_map(BPF_MAP_TYPE_ARRAY, sizeof(int), 14277 sizeof(struct test_val), 1); 14278 do { 14279 prog[*fixup_map_array_48b].imm = map_fds[3]; 14280 fixup_map_array_48b++; 14281 } while (*fixup_map_array_48b); 14282 } 14283 14284 if (*fixup_prog1) { 14285 map_fds[4] = create_prog_array(prog_type, 4, 0); 14286 do { 14287 prog[*fixup_prog1].imm = map_fds[4]; 14288 fixup_prog1++; 14289 } while (*fixup_prog1); 14290 } 14291 14292 if (*fixup_prog2) { 14293 map_fds[5] = create_prog_array(prog_type, 8, 7); 14294 do { 14295 prog[*fixup_prog2].imm = map_fds[5]; 14296 fixup_prog2++; 14297 } while (*fixup_prog2); 14298 } 14299 14300 if (*fixup_map_in_map) { 14301 map_fds[6] = create_map_in_map(); 14302 do { 14303 prog[*fixup_map_in_map].imm = map_fds[6]; 14304 fixup_map_in_map++; 14305 } while (*fixup_map_in_map); 14306 } 14307 14308 if (*fixup_cgroup_storage) { 14309 map_fds[7] = create_cgroup_storage(false); 14310 do { 14311 prog[*fixup_cgroup_storage].imm = map_fds[7]; 14312 fixup_cgroup_storage++; 14313 } while (*fixup_cgroup_storage); 14314 } 14315 14316 if (*fixup_percpu_cgroup_storage) { 14317 map_fds[8] = create_cgroup_storage(true); 14318 do { 14319 prog[*fixup_percpu_cgroup_storage].imm = map_fds[8]; 14320 fixup_percpu_cgroup_storage++; 14321 } while (*fixup_percpu_cgroup_storage); 14322 } 14323 if (*fixup_map_sockmap) { 14324 map_fds[9] = create_map(BPF_MAP_TYPE_SOCKMAP, sizeof(int), 14325 sizeof(int), 1); 14326 do { 14327 prog[*fixup_map_sockmap].imm = map_fds[9]; 14328 fixup_map_sockmap++; 14329 } while (*fixup_map_sockmap); 14330 } 14331 if (*fixup_map_sockhash) { 14332 map_fds[10] = create_map(BPF_MAP_TYPE_SOCKHASH, sizeof(int), 14333 sizeof(int), 1); 14334 do { 14335 prog[*fixup_map_sockhash].imm = map_fds[10]; 14336 fixup_map_sockhash++; 14337 } while (*fixup_map_sockhash); 14338 } 14339 if (*fixup_map_xskmap) { 14340 map_fds[11] = create_map(BPF_MAP_TYPE_XSKMAP, sizeof(int), 14341 sizeof(int), 1); 14342 do { 14343 prog[*fixup_map_xskmap].imm = map_fds[11]; 14344 fixup_map_xskmap++; 14345 } while (*fixup_map_xskmap); 14346 } 14347 if (*fixup_map_stacktrace) { 14348 map_fds[12] = create_map(BPF_MAP_TYPE_STACK_TRACE, sizeof(u32), 14349 sizeof(u64), 1); 14350 do { 14351 prog[*fixup_map_stacktrace].imm = map_fds[12]; 14352 fixup_map_stacktrace++; 14353 } while (fixup_map_stacktrace); 14354 } 14355 } 14356 14357 static int set_admin(bool admin) 14358 { 14359 cap_t caps; 14360 const cap_value_t cap_val = CAP_SYS_ADMIN; 14361 int ret = -1; 14362 14363 caps = cap_get_proc(); 14364 if (!caps) { 14365 perror("cap_get_proc"); 14366 return -1; 14367 } 14368 if (cap_set_flag(caps, CAP_EFFECTIVE, 1, &cap_val, 14369 admin ? CAP_SET : CAP_CLEAR)) { 14370 perror("cap_set_flag"); 14371 goto out; 14372 } 14373 if (cap_set_proc(caps)) { 14374 perror("cap_set_proc"); 14375 goto out; 14376 } 14377 ret = 0; 14378 out: 14379 if (cap_free(caps)) 14380 perror("cap_free"); 14381 return ret; 14382 } 14383 14384 static void do_test_single(struct bpf_test *test, bool unpriv, 14385 int *passes, int *errors) 14386 { 14387 int fd_prog, expected_ret, alignment_prevented_execution; 14388 int prog_len, prog_type = test->prog_type; 14389 struct bpf_insn *prog = test->insns; 14390 int map_fds[MAX_NR_MAPS]; 14391 const char *expected_err; 14392 uint32_t expected_val; 14393 uint32_t retval; 14394 __u32 pflags; 14395 int i, err; 14396 14397 for (i = 0; i < MAX_NR_MAPS; i++) 14398 map_fds[i] = -1; 14399 14400 if (!prog_type) 14401 prog_type = BPF_PROG_TYPE_SOCKET_FILTER; 14402 do_test_fixup(test, prog_type, prog, map_fds); 14403 prog_len = probe_filter_length(prog); 14404 14405 pflags = 0; 14406 if (test->flags & F_LOAD_WITH_STRICT_ALIGNMENT) 14407 pflags |= BPF_F_STRICT_ALIGNMENT; 14408 if (test->flags & F_NEEDS_EFFICIENT_UNALIGNED_ACCESS) 14409 pflags |= BPF_F_ANY_ALIGNMENT; 14410 fd_prog = bpf_verify_program(prog_type, prog, prog_len, pflags, 14411 "GPL", 0, bpf_vlog, sizeof(bpf_vlog), 1); 14412 14413 expected_ret = unpriv && test->result_unpriv != UNDEF ? 14414 test->result_unpriv : test->result; 14415 expected_err = unpriv && test->errstr_unpriv ? 14416 test->errstr_unpriv : test->errstr; 14417 expected_val = unpriv && test->retval_unpriv ? 14418 test->retval_unpriv : test->retval; 14419 14420 alignment_prevented_execution = 0; 14421 14422 if (expected_ret == ACCEPT) { 14423 if (fd_prog < 0) { 14424 printf("FAIL\nFailed to load prog '%s'!\n", 14425 strerror(errno)); 14426 goto fail_log; 14427 } 14428 #ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS 14429 if (fd_prog >= 0 && 14430 (test->flags & F_NEEDS_EFFICIENT_UNALIGNED_ACCESS)) { 14431 alignment_prevented_execution = 1; 14432 goto test_ok; 14433 } 14434 #endif 14435 } else { 14436 if (fd_prog >= 0) { 14437 printf("FAIL\nUnexpected success to load!\n"); 14438 goto fail_log; 14439 } 14440 if (!strstr(bpf_vlog, expected_err)) { 14441 printf("FAIL\nUnexpected error message!\n\tEXP: %s\n\tRES: %s\n", 14442 expected_err, bpf_vlog); 14443 goto fail_log; 14444 } 14445 } 14446 14447 if (fd_prog >= 0) { 14448 __u8 tmp[TEST_DATA_LEN << 2]; 14449 __u32 size_tmp = sizeof(tmp); 14450 14451 if (unpriv) 14452 set_admin(true); 14453 err = bpf_prog_test_run(fd_prog, 1, test->data, 14454 sizeof(test->data), tmp, &size_tmp, 14455 &retval, NULL); 14456 if (unpriv) 14457 set_admin(false); 14458 if (err && errno != 524/*ENOTSUPP*/ && errno != EPERM) { 14459 printf("Unexpected bpf_prog_test_run error\n"); 14460 goto fail_log; 14461 } 14462 if (!err && retval != expected_val && 14463 expected_val != POINTER_VALUE) { 14464 printf("FAIL retval %d != %d\n", retval, expected_val); 14465 goto fail_log; 14466 } 14467 } 14468 #ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS 14469 test_ok: 14470 #endif 14471 (*passes)++; 14472 printf("OK%s\n", alignment_prevented_execution ? 14473 " (NOTE: not executed due to unknown alignment)" : ""); 14474 close_fds: 14475 close(fd_prog); 14476 for (i = 0; i < MAX_NR_MAPS; i++) 14477 close(map_fds[i]); 14478 sched_yield(); 14479 return; 14480 fail_log: 14481 (*errors)++; 14482 printf("%s", bpf_vlog); 14483 goto close_fds; 14484 } 14485 14486 static bool is_admin(void) 14487 { 14488 cap_t caps; 14489 cap_flag_value_t sysadmin = CAP_CLEAR; 14490 const cap_value_t cap_val = CAP_SYS_ADMIN; 14491 14492 #ifdef CAP_IS_SUPPORTED 14493 if (!CAP_IS_SUPPORTED(CAP_SETFCAP)) { 14494 perror("cap_get_flag"); 14495 return false; 14496 } 14497 #endif 14498 caps = cap_get_proc(); 14499 if (!caps) { 14500 perror("cap_get_proc"); 14501 return false; 14502 } 14503 if (cap_get_flag(caps, cap_val, CAP_EFFECTIVE, &sysadmin)) 14504 perror("cap_get_flag"); 14505 if (cap_free(caps)) 14506 perror("cap_free"); 14507 return (sysadmin == CAP_SET); 14508 } 14509 14510 static void get_unpriv_disabled() 14511 { 14512 char buf[2]; 14513 FILE *fd; 14514 14515 fd = fopen("/proc/sys/"UNPRIV_SYSCTL, "r"); 14516 if (!fd) { 14517 perror("fopen /proc/sys/"UNPRIV_SYSCTL); 14518 unpriv_disabled = true; 14519 return; 14520 } 14521 if (fgets(buf, 2, fd) == buf && atoi(buf)) 14522 unpriv_disabled = true; 14523 fclose(fd); 14524 } 14525 14526 static bool test_as_unpriv(struct bpf_test *test) 14527 { 14528 return !test->prog_type || 14529 test->prog_type == BPF_PROG_TYPE_SOCKET_FILTER || 14530 test->prog_type == BPF_PROG_TYPE_CGROUP_SKB; 14531 } 14532 14533 static int do_test(bool unpriv, unsigned int from, unsigned int to) 14534 { 14535 int i, passes = 0, errors = 0, skips = 0; 14536 14537 for (i = from; i < to; i++) { 14538 struct bpf_test *test = &tests[i]; 14539 14540 /* Program types that are not supported by non-root we 14541 * skip right away. 14542 */ 14543 if (test_as_unpriv(test) && unpriv_disabled) { 14544 printf("#%d/u %s SKIP\n", i, test->descr); 14545 skips++; 14546 } else if (test_as_unpriv(test)) { 14547 if (!unpriv) 14548 set_admin(false); 14549 printf("#%d/u %s ", i, test->descr); 14550 do_test_single(test, true, &passes, &errors); 14551 if (!unpriv) 14552 set_admin(true); 14553 } 14554 14555 if (unpriv) { 14556 printf("#%d/p %s SKIP\n", i, test->descr); 14557 skips++; 14558 } else { 14559 printf("#%d/p %s ", i, test->descr); 14560 do_test_single(test, false, &passes, &errors); 14561 } 14562 } 14563 14564 printf("Summary: %d PASSED, %d SKIPPED, %d FAILED\n", passes, 14565 skips, errors); 14566 return errors ? EXIT_FAILURE : EXIT_SUCCESS; 14567 } 14568 14569 int main(int argc, char **argv) 14570 { 14571 unsigned int from = 0, to = ARRAY_SIZE(tests); 14572 bool unpriv = !is_admin(); 14573 14574 if (argc == 3) { 14575 unsigned int l = atoi(argv[argc - 2]); 14576 unsigned int u = atoi(argv[argc - 1]); 14577 14578 if (l < to && u < to) { 14579 from = l; 14580 to = u + 1; 14581 } 14582 } else if (argc == 2) { 14583 unsigned int t = atoi(argv[argc - 1]); 14584 14585 if (t < to) { 14586 from = t; 14587 to = t + 1; 14588 } 14589 } 14590 14591 get_unpriv_disabled(); 14592 if (unpriv && unpriv_disabled) { 14593 printf("Cannot run as unprivileged user with sysctl %s.\n", 14594 UNPRIV_SYSCTL); 14595 return EXIT_FAILURE; 14596 } 14597 14598 bpf_semi_rand_init(); 14599 return do_test(unpriv, from, to); 14600 } 14601