1*4882a593Smuzhiyun { 2*4882a593Smuzhiyun "context stores via ST", 3*4882a593Smuzhiyun .insns = { 4*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0), 5*4882a593Smuzhiyun BPF_ST_MEM(BPF_DW, BPF_REG_1, offsetof(struct __sk_buff, mark), 0), 6*4882a593Smuzhiyun BPF_EXIT_INSN(), 7*4882a593Smuzhiyun }, 8*4882a593Smuzhiyun .errstr = "BPF_ST stores into R1 ctx is not allowed", 9*4882a593Smuzhiyun .result = REJECT, 10*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11*4882a593Smuzhiyun }, 12*4882a593Smuzhiyun { 13*4882a593Smuzhiyun "context stores via XADD", 14*4882a593Smuzhiyun .insns = { 15*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0), 16*4882a593Smuzhiyun BPF_RAW_INSN(BPF_STX | BPF_XADD | BPF_W, BPF_REG_1, 17*4882a593Smuzhiyun BPF_REG_0, offsetof(struct __sk_buff, mark), 0), 18*4882a593Smuzhiyun BPF_EXIT_INSN(), 19*4882a593Smuzhiyun }, 20*4882a593Smuzhiyun .errstr = "BPF_XADD stores into R1 ctx is not allowed", 21*4882a593Smuzhiyun .result = REJECT, 22*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SCHED_CLS, 23*4882a593Smuzhiyun }, 24*4882a593Smuzhiyun { 25*4882a593Smuzhiyun "arithmetic ops make PTR_TO_CTX unusable", 26*4882a593Smuzhiyun .insns = { 27*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 28*4882a593Smuzhiyun offsetof(struct __sk_buff, data) - 29*4882a593Smuzhiyun offsetof(struct __sk_buff, mark)), 30*4882a593Smuzhiyun BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 31*4882a593Smuzhiyun offsetof(struct __sk_buff, mark)), 32*4882a593Smuzhiyun BPF_EXIT_INSN(), 33*4882a593Smuzhiyun }, 34*4882a593Smuzhiyun .errstr = "dereference of modified ctx ptr", 35*4882a593Smuzhiyun .result = REJECT, 36*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SCHED_CLS, 37*4882a593Smuzhiyun }, 38*4882a593Smuzhiyun { 39*4882a593Smuzhiyun "pass unmodified ctx pointer to helper", 40*4882a593Smuzhiyun .insns = { 41*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_2, 0), 42*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 43*4882a593Smuzhiyun BPF_FUNC_csum_update), 44*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0), 45*4882a593Smuzhiyun BPF_EXIT_INSN(), 46*4882a593Smuzhiyun }, 47*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SCHED_CLS, 48*4882a593Smuzhiyun .result = ACCEPT, 49*4882a593Smuzhiyun }, 50*4882a593Smuzhiyun { 51*4882a593Smuzhiyun "pass modified ctx pointer to helper, 1", 52*4882a593Smuzhiyun .insns = { 53*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -612), 54*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_2, 0), 55*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 56*4882a593Smuzhiyun BPF_FUNC_csum_update), 57*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0), 58*4882a593Smuzhiyun BPF_EXIT_INSN(), 59*4882a593Smuzhiyun }, 60*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SCHED_CLS, 61*4882a593Smuzhiyun .result = REJECT, 62*4882a593Smuzhiyun .errstr = "dereference of modified ctx ptr", 63*4882a593Smuzhiyun }, 64*4882a593Smuzhiyun { 65*4882a593Smuzhiyun "pass modified ctx pointer to helper, 2", 66*4882a593Smuzhiyun .insns = { 67*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -612), 68*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 69*4882a593Smuzhiyun BPF_FUNC_get_socket_cookie), 70*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0), 71*4882a593Smuzhiyun BPF_EXIT_INSN(), 72*4882a593Smuzhiyun }, 73*4882a593Smuzhiyun .result_unpriv = REJECT, 74*4882a593Smuzhiyun .result = REJECT, 75*4882a593Smuzhiyun .errstr_unpriv = "dereference of modified ctx ptr", 76*4882a593Smuzhiyun .errstr = "dereference of modified ctx ptr", 77*4882a593Smuzhiyun }, 78*4882a593Smuzhiyun { 79*4882a593Smuzhiyun "pass modified ctx pointer to helper, 3", 80*4882a593Smuzhiyun .insns = { 81*4882a593Smuzhiyun BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 0), 82*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_AND, BPF_REG_3, 4), 83*4882a593Smuzhiyun BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 84*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_2, 0), 85*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 86*4882a593Smuzhiyun BPF_FUNC_csum_update), 87*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0), 88*4882a593Smuzhiyun BPF_EXIT_INSN(), 89*4882a593Smuzhiyun }, 90*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SCHED_CLS, 91*4882a593Smuzhiyun .result = REJECT, 92*4882a593Smuzhiyun .errstr = "variable ctx access var_off=(0x0; 0x4)", 93*4882a593Smuzhiyun }, 94*4882a593Smuzhiyun { 95*4882a593Smuzhiyun "pass ctx or null check, 1: ctx", 96*4882a593Smuzhiyun .insns = { 97*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 98*4882a593Smuzhiyun BPF_FUNC_get_netns_cookie), 99*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0), 100*4882a593Smuzhiyun BPF_EXIT_INSN(), 101*4882a593Smuzhiyun }, 102*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_CGROUP_SOCK_ADDR, 103*4882a593Smuzhiyun .expected_attach_type = BPF_CGROUP_UDP6_SENDMSG, 104*4882a593Smuzhiyun .result = ACCEPT, 105*4882a593Smuzhiyun }, 106*4882a593Smuzhiyun { 107*4882a593Smuzhiyun "pass ctx or null check, 2: null", 108*4882a593Smuzhiyun .insns = { 109*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_1, 0), 110*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 111*4882a593Smuzhiyun BPF_FUNC_get_netns_cookie), 112*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0), 113*4882a593Smuzhiyun BPF_EXIT_INSN(), 114*4882a593Smuzhiyun }, 115*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_CGROUP_SOCK_ADDR, 116*4882a593Smuzhiyun .expected_attach_type = BPF_CGROUP_UDP6_SENDMSG, 117*4882a593Smuzhiyun .result = ACCEPT, 118*4882a593Smuzhiyun }, 119*4882a593Smuzhiyun { 120*4882a593Smuzhiyun "pass ctx or null check, 3: 1", 121*4882a593Smuzhiyun .insns = { 122*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_1, 1), 123*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 124*4882a593Smuzhiyun BPF_FUNC_get_netns_cookie), 125*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0), 126*4882a593Smuzhiyun BPF_EXIT_INSN(), 127*4882a593Smuzhiyun }, 128*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_CGROUP_SOCK_ADDR, 129*4882a593Smuzhiyun .expected_attach_type = BPF_CGROUP_UDP6_SENDMSG, 130*4882a593Smuzhiyun .result = REJECT, 131*4882a593Smuzhiyun .errstr = "R1 type=inv expected=ctx", 132*4882a593Smuzhiyun }, 133*4882a593Smuzhiyun { 134*4882a593Smuzhiyun "pass ctx or null check, 4: ctx - const", 135*4882a593Smuzhiyun .insns = { 136*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -612), 137*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 138*4882a593Smuzhiyun BPF_FUNC_get_netns_cookie), 139*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0), 140*4882a593Smuzhiyun BPF_EXIT_INSN(), 141*4882a593Smuzhiyun }, 142*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_CGROUP_SOCK_ADDR, 143*4882a593Smuzhiyun .expected_attach_type = BPF_CGROUP_UDP6_SENDMSG, 144*4882a593Smuzhiyun .result = REJECT, 145*4882a593Smuzhiyun .errstr = "dereference of modified ctx ptr", 146*4882a593Smuzhiyun }, 147*4882a593Smuzhiyun { 148*4882a593Smuzhiyun "pass ctx or null check, 5: null (connect)", 149*4882a593Smuzhiyun .insns = { 150*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_1, 0), 151*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 152*4882a593Smuzhiyun BPF_FUNC_get_netns_cookie), 153*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0), 154*4882a593Smuzhiyun BPF_EXIT_INSN(), 155*4882a593Smuzhiyun }, 156*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_CGROUP_SOCK_ADDR, 157*4882a593Smuzhiyun .expected_attach_type = BPF_CGROUP_INET4_CONNECT, 158*4882a593Smuzhiyun .result = ACCEPT, 159*4882a593Smuzhiyun }, 160*4882a593Smuzhiyun { 161*4882a593Smuzhiyun "pass ctx or null check, 6: null (bind)", 162*4882a593Smuzhiyun .insns = { 163*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_1, 0), 164*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 165*4882a593Smuzhiyun BPF_FUNC_get_netns_cookie), 166*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0), 167*4882a593Smuzhiyun BPF_EXIT_INSN(), 168*4882a593Smuzhiyun }, 169*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 170*4882a593Smuzhiyun .expected_attach_type = BPF_CGROUP_INET4_POST_BIND, 171*4882a593Smuzhiyun .result = ACCEPT, 172*4882a593Smuzhiyun }, 173*4882a593Smuzhiyun { 174*4882a593Smuzhiyun "pass ctx or null check, 7: ctx (bind)", 175*4882a593Smuzhiyun .insns = { 176*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 177*4882a593Smuzhiyun BPF_FUNC_get_socket_cookie), 178*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0), 179*4882a593Smuzhiyun BPF_EXIT_INSN(), 180*4882a593Smuzhiyun }, 181*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 182*4882a593Smuzhiyun .expected_attach_type = BPF_CGROUP_INET4_POST_BIND, 183*4882a593Smuzhiyun .result = ACCEPT, 184*4882a593Smuzhiyun }, 185*4882a593Smuzhiyun { 186*4882a593Smuzhiyun "pass ctx or null check, 8: null (bind)", 187*4882a593Smuzhiyun .insns = { 188*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_1, 0), 189*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 190*4882a593Smuzhiyun BPF_FUNC_get_socket_cookie), 191*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0), 192*4882a593Smuzhiyun BPF_EXIT_INSN(), 193*4882a593Smuzhiyun }, 194*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 195*4882a593Smuzhiyun .expected_attach_type = BPF_CGROUP_INET4_POST_BIND, 196*4882a593Smuzhiyun .result = REJECT, 197*4882a593Smuzhiyun .errstr = "R1 type=inv expected=ctx", 198*4882a593Smuzhiyun }, 199