18c2ecf20Sopenharmony_ci{ 28c2ecf20Sopenharmony_ci "unpriv: return pointer", 38c2ecf20Sopenharmony_ci .insns = { 48c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_10), 58c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 68c2ecf20Sopenharmony_ci }, 78c2ecf20Sopenharmony_ci .result = ACCEPT, 88c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 98c2ecf20Sopenharmony_ci .errstr_unpriv = "R0 leaks addr", 108c2ecf20Sopenharmony_ci .retval = POINTER_VALUE, 118c2ecf20Sopenharmony_ci}, 128c2ecf20Sopenharmony_ci{ 138c2ecf20Sopenharmony_ci "unpriv: add const to pointer", 148c2ecf20Sopenharmony_ci .insns = { 158c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 168c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 178c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 188c2ecf20Sopenharmony_ci }, 198c2ecf20Sopenharmony_ci .result = ACCEPT, 208c2ecf20Sopenharmony_ci}, 218c2ecf20Sopenharmony_ci{ 228c2ecf20Sopenharmony_ci "unpriv: add pointer to pointer", 238c2ecf20Sopenharmony_ci .insns = { 248c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_10), 258c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 268c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 278c2ecf20Sopenharmony_ci }, 288c2ecf20Sopenharmony_ci .result = REJECT, 298c2ecf20Sopenharmony_ci .errstr = "R1 pointer += pointer", 308c2ecf20Sopenharmony_ci}, 318c2ecf20Sopenharmony_ci{ 328c2ecf20Sopenharmony_ci "unpriv: neg pointer", 338c2ecf20Sopenharmony_ci .insns = { 348c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_NEG, BPF_REG_1, 0), 358c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 368c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 378c2ecf20Sopenharmony_ci }, 388c2ecf20Sopenharmony_ci .result = ACCEPT, 398c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 408c2ecf20Sopenharmony_ci .errstr_unpriv = "R1 pointer arithmetic", 418c2ecf20Sopenharmony_ci}, 428c2ecf20Sopenharmony_ci{ 438c2ecf20Sopenharmony_ci "unpriv: cmp pointer with const", 448c2ecf20Sopenharmony_ci .insns = { 458c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 0), 468c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 478c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 488c2ecf20Sopenharmony_ci }, 498c2ecf20Sopenharmony_ci .result = ACCEPT, 508c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 518c2ecf20Sopenharmony_ci .errstr_unpriv = "R1 pointer comparison", 528c2ecf20Sopenharmony_ci}, 538c2ecf20Sopenharmony_ci{ 548c2ecf20Sopenharmony_ci "unpriv: cmp pointer with pointer", 558c2ecf20Sopenharmony_ci .insns = { 568c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0), 578c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 588c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 598c2ecf20Sopenharmony_ci }, 608c2ecf20Sopenharmony_ci .result = ACCEPT, 618c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 628c2ecf20Sopenharmony_ci .errstr_unpriv = "R10 pointer comparison", 638c2ecf20Sopenharmony_ci}, 648c2ecf20Sopenharmony_ci{ 658c2ecf20Sopenharmony_ci "unpriv: check that printk is disallowed", 668c2ecf20Sopenharmony_ci .insns = { 678c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 688c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 698c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 708c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_2, 8), 718c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_3, BPF_REG_1), 728c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_trace_printk), 738c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 748c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 758c2ecf20Sopenharmony_ci }, 768c2ecf20Sopenharmony_ci .errstr_unpriv = "unknown func bpf_trace_printk#6", 778c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 788c2ecf20Sopenharmony_ci .result = ACCEPT, 798c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 808c2ecf20Sopenharmony_ci}, 818c2ecf20Sopenharmony_ci{ 828c2ecf20Sopenharmony_ci "unpriv: pass pointer to helper function", 838c2ecf20Sopenharmony_ci .insns = { 848c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 858c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 868c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 878c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_1, 0), 888c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 898c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 908c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_update_elem), 918c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 928c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 938c2ecf20Sopenharmony_ci }, 948c2ecf20Sopenharmony_ci .fixup_map_hash_8b = { 3 }, 958c2ecf20Sopenharmony_ci .errstr_unpriv = "R4 leaks addr", 968c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 978c2ecf20Sopenharmony_ci .result = ACCEPT, 988c2ecf20Sopenharmony_ci}, 998c2ecf20Sopenharmony_ci{ 1008c2ecf20Sopenharmony_ci "unpriv: indirectly pass pointer on stack to helper function", 1018c2ecf20Sopenharmony_ci .insns = { 1028c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8), 1038c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1048c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1058c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_1, 0), 1068c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem), 1078c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 1088c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1098c2ecf20Sopenharmony_ci }, 1108c2ecf20Sopenharmony_ci .fixup_map_hash_8b = { 3 }, 1118c2ecf20Sopenharmony_ci .errstr_unpriv = "invalid indirect read from stack R2 off -8+0 size 8", 1128c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 1138c2ecf20Sopenharmony_ci .result = ACCEPT, 1148c2ecf20Sopenharmony_ci}, 1158c2ecf20Sopenharmony_ci{ 1168c2ecf20Sopenharmony_ci "unpriv: mangle pointer on stack 1", 1178c2ecf20Sopenharmony_ci .insns = { 1188c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8), 1198c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_W, BPF_REG_10, -8, 0), 1208c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 1218c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1228c2ecf20Sopenharmony_ci }, 1238c2ecf20Sopenharmony_ci .errstr_unpriv = "attempt to corrupt spilled", 1248c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 1258c2ecf20Sopenharmony_ci .result = ACCEPT, 1268c2ecf20Sopenharmony_ci}, 1278c2ecf20Sopenharmony_ci{ 1288c2ecf20Sopenharmony_ci "unpriv: mangle pointer on stack 2", 1298c2ecf20Sopenharmony_ci .insns = { 1308c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8), 1318c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_B, BPF_REG_10, -1, 0), 1328c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 1338c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1348c2ecf20Sopenharmony_ci }, 1358c2ecf20Sopenharmony_ci .errstr_unpriv = "attempt to corrupt spilled", 1368c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 1378c2ecf20Sopenharmony_ci .result = ACCEPT, 1388c2ecf20Sopenharmony_ci}, 1398c2ecf20Sopenharmony_ci{ 1408c2ecf20Sopenharmony_ci "unpriv: read pointer from stack in small chunks", 1418c2ecf20Sopenharmony_ci .insns = { 1428c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8), 1438c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -8), 1448c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 1458c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1468c2ecf20Sopenharmony_ci }, 1478c2ecf20Sopenharmony_ci .errstr = "invalid size", 1488c2ecf20Sopenharmony_ci .result = REJECT, 1498c2ecf20Sopenharmony_ci}, 1508c2ecf20Sopenharmony_ci{ 1518c2ecf20Sopenharmony_ci "unpriv: write pointer into ctx", 1528c2ecf20Sopenharmony_ci .insns = { 1538c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, 0), 1548c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 1558c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1568c2ecf20Sopenharmony_ci }, 1578c2ecf20Sopenharmony_ci .errstr_unpriv = "R1 leaks addr", 1588c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 1598c2ecf20Sopenharmony_ci .errstr = "invalid bpf_context access", 1608c2ecf20Sopenharmony_ci .result = REJECT, 1618c2ecf20Sopenharmony_ci}, 1628c2ecf20Sopenharmony_ci{ 1638c2ecf20Sopenharmony_ci "unpriv: spill/fill of ctx", 1648c2ecf20Sopenharmony_ci .insns = { 1658c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 1668c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 1678c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 1688c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 1698c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 1708c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1718c2ecf20Sopenharmony_ci }, 1728c2ecf20Sopenharmony_ci .result = ACCEPT, 1738c2ecf20Sopenharmony_ci}, 1748c2ecf20Sopenharmony_ci{ 1758c2ecf20Sopenharmony_ci "unpriv: spill/fill of ctx 2", 1768c2ecf20Sopenharmony_ci .insns = { 1778c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 1788c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 1798c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 1808c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 1818c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_hash_recalc), 1828c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 1838c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1848c2ecf20Sopenharmony_ci }, 1858c2ecf20Sopenharmony_ci .result = ACCEPT, 1868c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 1878c2ecf20Sopenharmony_ci}, 1888c2ecf20Sopenharmony_ci{ 1898c2ecf20Sopenharmony_ci "unpriv: spill/fill of ctx 3", 1908c2ecf20Sopenharmony_ci .insns = { 1918c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 1928c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 1938c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 1948c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_10, 0), 1958c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 1968c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_hash_recalc), 1978c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1988c2ecf20Sopenharmony_ci }, 1998c2ecf20Sopenharmony_ci .result = REJECT, 2008c2ecf20Sopenharmony_ci .errstr = "R1 type=fp expected=ctx", 2018c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2028c2ecf20Sopenharmony_ci}, 2038c2ecf20Sopenharmony_ci{ 2048c2ecf20Sopenharmony_ci "unpriv: spill/fill of ctx 4", 2058c2ecf20Sopenharmony_ci .insns = { 2068c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2078c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2088c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2098c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 2108c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_STX | BPF_XADD | BPF_DW, BPF_REG_10, BPF_REG_0, -8, 0), 2118c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2128c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_hash_recalc), 2138c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 2148c2ecf20Sopenharmony_ci }, 2158c2ecf20Sopenharmony_ci .result = REJECT, 2168c2ecf20Sopenharmony_ci .errstr = "R1 type=inv expected=ctx", 2178c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2188c2ecf20Sopenharmony_ci}, 2198c2ecf20Sopenharmony_ci{ 2208c2ecf20Sopenharmony_ci "unpriv: spill/fill of different pointers stx", 2218c2ecf20Sopenharmony_ci .insns = { 2228c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 42), 2238c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2248c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2258c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3), 2268c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 2278c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 2288c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0), 2298c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 2308c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2318c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2328c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_3, 2338c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, mark)), 2348c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 2358c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 2368c2ecf20Sopenharmony_ci }, 2378c2ecf20Sopenharmony_ci .result = REJECT, 2388c2ecf20Sopenharmony_ci .errstr = "same insn cannot be used with different pointers", 2398c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2408c2ecf20Sopenharmony_ci}, 2418c2ecf20Sopenharmony_ci{ 2428c2ecf20Sopenharmony_ci "unpriv: spill/fill of different pointers stx - ctx and sock", 2438c2ecf20Sopenharmony_ci .insns = { 2448c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 2458c2ecf20Sopenharmony_ci /* struct bpf_sock *sock = bpf_sock_lookup(...); */ 2468c2ecf20Sopenharmony_ci BPF_SK_LOOKUP(sk_lookup_tcp), 2478c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 2488c2ecf20Sopenharmony_ci /* u64 foo; */ 2498c2ecf20Sopenharmony_ci /* void *target = &foo; */ 2508c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2518c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2528c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 2538c2ecf20Sopenharmony_ci /* if (skb == NULL) *target = sock; */ 2548c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 2558c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0), 2568c2ecf20Sopenharmony_ci /* else *target = skb; */ 2578c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 2588c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2598c2ecf20Sopenharmony_ci /* struct __sk_buff *skb = *target; */ 2608c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2618c2ecf20Sopenharmony_ci /* skb->mark = 42; */ 2628c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 42), 2638c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_3, 2648c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, mark)), 2658c2ecf20Sopenharmony_ci /* if (sk) bpf_sk_release(sk) */ 2668c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 2678c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_sk_release), 2688c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 2698c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 2708c2ecf20Sopenharmony_ci }, 2718c2ecf20Sopenharmony_ci .result = REJECT, 2728c2ecf20Sopenharmony_ci .errstr = "type=ctx expected=sock", 2738c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2748c2ecf20Sopenharmony_ci}, 2758c2ecf20Sopenharmony_ci{ 2768c2ecf20Sopenharmony_ci "unpriv: spill/fill of different pointers stx - leak sock", 2778c2ecf20Sopenharmony_ci .insns = { 2788c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 2798c2ecf20Sopenharmony_ci /* struct bpf_sock *sock = bpf_sock_lookup(...); */ 2808c2ecf20Sopenharmony_ci BPF_SK_LOOKUP(sk_lookup_tcp), 2818c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 2828c2ecf20Sopenharmony_ci /* u64 foo; */ 2838c2ecf20Sopenharmony_ci /* void *target = &foo; */ 2848c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2858c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2868c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 2878c2ecf20Sopenharmony_ci /* if (skb == NULL) *target = sock; */ 2888c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 2898c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0), 2908c2ecf20Sopenharmony_ci /* else *target = skb; */ 2918c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 2928c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2938c2ecf20Sopenharmony_ci /* struct __sk_buff *skb = *target; */ 2948c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2958c2ecf20Sopenharmony_ci /* skb->mark = 42; */ 2968c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 42), 2978c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_3, 2988c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, mark)), 2998c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 3008c2ecf20Sopenharmony_ci }, 3018c2ecf20Sopenharmony_ci .result = REJECT, 3028c2ecf20Sopenharmony_ci //.errstr = "same insn cannot be used with different pointers", 3038c2ecf20Sopenharmony_ci .errstr = "Unreleased reference", 3048c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3058c2ecf20Sopenharmony_ci}, 3068c2ecf20Sopenharmony_ci{ 3078c2ecf20Sopenharmony_ci "unpriv: spill/fill of different pointers stx - sock and ctx (read)", 3088c2ecf20Sopenharmony_ci .insns = { 3098c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 3108c2ecf20Sopenharmony_ci /* struct bpf_sock *sock = bpf_sock_lookup(...); */ 3118c2ecf20Sopenharmony_ci BPF_SK_LOOKUP(sk_lookup_tcp), 3128c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 3138c2ecf20Sopenharmony_ci /* u64 foo; */ 3148c2ecf20Sopenharmony_ci /* void *target = &foo; */ 3158c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3168c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 3178c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 3188c2ecf20Sopenharmony_ci /* if (skb) *target = skb */ 3198c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 3208c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 3218c2ecf20Sopenharmony_ci /* else *target = sock */ 3228c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 3238c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0), 3248c2ecf20Sopenharmony_ci /* struct bpf_sock *sk = *target; */ 3258c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 3268c2ecf20Sopenharmony_ci /* if (sk) u32 foo = sk->mark; bpf_sk_release(sk); */ 3278c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 2), 3288c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3298c2ecf20Sopenharmony_ci offsetof(struct bpf_sock, mark)), 3308c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_sk_release), 3318c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 3328c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 3338c2ecf20Sopenharmony_ci }, 3348c2ecf20Sopenharmony_ci .result = REJECT, 3358c2ecf20Sopenharmony_ci .errstr = "same insn cannot be used with different pointers", 3368c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3378c2ecf20Sopenharmony_ci}, 3388c2ecf20Sopenharmony_ci{ 3398c2ecf20Sopenharmony_ci "unpriv: spill/fill of different pointers stx - sock and ctx (write)", 3408c2ecf20Sopenharmony_ci .insns = { 3418c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 3428c2ecf20Sopenharmony_ci /* struct bpf_sock *sock = bpf_sock_lookup(...); */ 3438c2ecf20Sopenharmony_ci BPF_SK_LOOKUP(sk_lookup_tcp), 3448c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 3458c2ecf20Sopenharmony_ci /* u64 foo; */ 3468c2ecf20Sopenharmony_ci /* void *target = &foo; */ 3478c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3488c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 3498c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 3508c2ecf20Sopenharmony_ci /* if (skb) *target = skb */ 3518c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 3528c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 3538c2ecf20Sopenharmony_ci /* else *target = sock */ 3548c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 3558c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0), 3568c2ecf20Sopenharmony_ci /* struct bpf_sock *sk = *target; */ 3578c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 3588c2ecf20Sopenharmony_ci /* if (sk) sk->mark = 42; bpf_sk_release(sk); */ 3598c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3), 3608c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 42), 3618c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_3, 3628c2ecf20Sopenharmony_ci offsetof(struct bpf_sock, mark)), 3638c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_sk_release), 3648c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 3658c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 3668c2ecf20Sopenharmony_ci }, 3678c2ecf20Sopenharmony_ci .result = REJECT, 3688c2ecf20Sopenharmony_ci //.errstr = "same insn cannot be used with different pointers", 3698c2ecf20Sopenharmony_ci .errstr = "cannot write into sock", 3708c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3718c2ecf20Sopenharmony_ci}, 3728c2ecf20Sopenharmony_ci{ 3738c2ecf20Sopenharmony_ci "unpriv: spill/fill of different pointers ldx", 3748c2ecf20Sopenharmony_ci .insns = { 3758c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3768c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 3778c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3), 3788c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 3798c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 3808c2ecf20Sopenharmony_ci -(__s32)offsetof(struct bpf_perf_event_data, 3818c2ecf20Sopenharmony_ci sample_period) - 8), 3828c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0), 3838c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 3848c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 3858c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 3868c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, 3878c2ecf20Sopenharmony_ci offsetof(struct bpf_perf_event_data, sample_period)), 3888c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 3898c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 3908c2ecf20Sopenharmony_ci }, 3918c2ecf20Sopenharmony_ci .result = REJECT, 3928c2ecf20Sopenharmony_ci .errstr = "same insn cannot be used with different pointers", 3938c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_PERF_EVENT, 3948c2ecf20Sopenharmony_ci}, 3958c2ecf20Sopenharmony_ci{ 3968c2ecf20Sopenharmony_ci "unpriv: write pointer into map elem value", 3978c2ecf20Sopenharmony_ci .insns = { 3988c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 3998c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4008c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4018c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_1, 0), 4028c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem), 4038c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 4048c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0), 4058c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 4068c2ecf20Sopenharmony_ci }, 4078c2ecf20Sopenharmony_ci .fixup_map_hash_8b = { 3 }, 4088c2ecf20Sopenharmony_ci .errstr_unpriv = "R0 leaks addr", 4098c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 4108c2ecf20Sopenharmony_ci .result = ACCEPT, 4118c2ecf20Sopenharmony_ci}, 4128c2ecf20Sopenharmony_ci{ 4138c2ecf20Sopenharmony_ci "alu32: mov u32 const", 4148c2ecf20Sopenharmony_ci .insns = { 4158c2ecf20Sopenharmony_ci BPF_MOV32_IMM(BPF_REG_7, 0), 4168c2ecf20Sopenharmony_ci BPF_ALU32_IMM(BPF_AND, BPF_REG_7, 1), 4178c2ecf20Sopenharmony_ci BPF_MOV32_REG(BPF_REG_0, BPF_REG_7), 4188c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 4198c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0), 4208c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 4218c2ecf20Sopenharmony_ci }, 4228c2ecf20Sopenharmony_ci .errstr_unpriv = "R7 invalid mem access 'inv'", 4238c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 4248c2ecf20Sopenharmony_ci .result = ACCEPT, 4258c2ecf20Sopenharmony_ci .retval = 0, 4268c2ecf20Sopenharmony_ci}, 4278c2ecf20Sopenharmony_ci{ 4288c2ecf20Sopenharmony_ci "unpriv: partial copy of pointer", 4298c2ecf20Sopenharmony_ci .insns = { 4308c2ecf20Sopenharmony_ci BPF_MOV32_REG(BPF_REG_1, BPF_REG_10), 4318c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 4328c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 4338c2ecf20Sopenharmony_ci }, 4348c2ecf20Sopenharmony_ci .errstr_unpriv = "R10 partial copy", 4358c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 4368c2ecf20Sopenharmony_ci .result = ACCEPT, 4378c2ecf20Sopenharmony_ci}, 4388c2ecf20Sopenharmony_ci{ 4398c2ecf20Sopenharmony_ci "unpriv: pass pointer to tail_call", 4408c2ecf20Sopenharmony_ci .insns = { 4418c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_3, BPF_REG_1), 4428c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_2, 0), 4438c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_tail_call), 4448c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 4458c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 4468c2ecf20Sopenharmony_ci }, 4478c2ecf20Sopenharmony_ci .fixup_prog1 = { 1 }, 4488c2ecf20Sopenharmony_ci .errstr_unpriv = "R3 leaks addr into helper", 4498c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 4508c2ecf20Sopenharmony_ci .result = ACCEPT, 4518c2ecf20Sopenharmony_ci}, 4528c2ecf20Sopenharmony_ci{ 4538c2ecf20Sopenharmony_ci "unpriv: cmp map pointer with zero", 4548c2ecf20Sopenharmony_ci .insns = { 4558c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_1, 0), 4568c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_1, 0), 4578c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 0), 4588c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 4598c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 4608c2ecf20Sopenharmony_ci }, 4618c2ecf20Sopenharmony_ci .fixup_map_hash_8b = { 1 }, 4628c2ecf20Sopenharmony_ci .errstr_unpriv = "R1 pointer comparison", 4638c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 4648c2ecf20Sopenharmony_ci .result = ACCEPT, 4658c2ecf20Sopenharmony_ci}, 4668c2ecf20Sopenharmony_ci{ 4678c2ecf20Sopenharmony_ci "unpriv: write into frame pointer", 4688c2ecf20Sopenharmony_ci .insns = { 4698c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_10, BPF_REG_1), 4708c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 4718c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 4728c2ecf20Sopenharmony_ci }, 4738c2ecf20Sopenharmony_ci .errstr = "frame pointer is read only", 4748c2ecf20Sopenharmony_ci .result = REJECT, 4758c2ecf20Sopenharmony_ci}, 4768c2ecf20Sopenharmony_ci{ 4778c2ecf20Sopenharmony_ci "unpriv: spill/fill frame pointer", 4788c2ecf20Sopenharmony_ci .insns = { 4798c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 4808c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 4818c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_10, 0), 4828c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_10, BPF_REG_6, 0), 4838c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 4848c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 4858c2ecf20Sopenharmony_ci }, 4868c2ecf20Sopenharmony_ci .errstr = "frame pointer is read only", 4878c2ecf20Sopenharmony_ci .result = REJECT, 4888c2ecf20Sopenharmony_ci}, 4898c2ecf20Sopenharmony_ci{ 4908c2ecf20Sopenharmony_ci "unpriv: cmp of frame pointer", 4918c2ecf20Sopenharmony_ci .insns = { 4928c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_10, 0, 0), 4938c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 4948c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 4958c2ecf20Sopenharmony_ci }, 4968c2ecf20Sopenharmony_ci .errstr_unpriv = "R10 pointer comparison", 4978c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 4988c2ecf20Sopenharmony_ci .result = ACCEPT, 4998c2ecf20Sopenharmony_ci}, 5008c2ecf20Sopenharmony_ci{ 5018c2ecf20Sopenharmony_ci "unpriv: adding of fp, reg", 5028c2ecf20Sopenharmony_ci .insns = { 5038c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 5048c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_1, 0), 5058c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_10), 5068c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, -8), 5078c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 5088c2ecf20Sopenharmony_ci }, 5098c2ecf20Sopenharmony_ci .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", 5108c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 5118c2ecf20Sopenharmony_ci .result = ACCEPT, 5128c2ecf20Sopenharmony_ci}, 5138c2ecf20Sopenharmony_ci{ 5148c2ecf20Sopenharmony_ci "unpriv: adding of fp, imm", 5158c2ecf20Sopenharmony_ci .insns = { 5168c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 5178c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 5188c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0), 5198c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, -8), 5208c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 5218c2ecf20Sopenharmony_ci }, 5228c2ecf20Sopenharmony_ci .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", 5238c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 5248c2ecf20Sopenharmony_ci .result = ACCEPT, 5258c2ecf20Sopenharmony_ci}, 5268c2ecf20Sopenharmony_ci{ 5278c2ecf20Sopenharmony_ci "unpriv: cmp of stack pointer", 5288c2ecf20Sopenharmony_ci .insns = { 5298c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5308c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5318c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_2, 0, 0), 5328c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 5338c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 5348c2ecf20Sopenharmony_ci }, 5358c2ecf20Sopenharmony_ci .errstr_unpriv = "R2 pointer comparison", 5368c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 5378c2ecf20Sopenharmony_ci .result = ACCEPT, 5388c2ecf20Sopenharmony_ci}, 539