raw_stack.c (9954B)
1{ 2 "raw_stack: no skb_load_bytes", 3 .insns = { 4 BPF_MOV64_IMM(BPF_REG_2, 4), 5 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 6 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 7 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 8 BPF_MOV64_IMM(BPF_REG_4, 8), 9 /* Call to skb_load_bytes() omitted. */ 10 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 11 BPF_EXIT_INSN(), 12 }, 13 .result = REJECT, 14 .errstr = "invalid read from stack R6 off=-8 size=8", 15 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 16}, 17{ 18 "raw_stack: skb_load_bytes, negative len", 19 .insns = { 20 BPF_MOV64_IMM(BPF_REG_2, 4), 21 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 22 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 23 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 24 BPF_MOV64_IMM(BPF_REG_4, -8), 25 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_skb_load_bytes), 26 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 27 BPF_EXIT_INSN(), 28 }, 29 .result = REJECT, 30 .errstr = "R4 min value is negative", 31 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 32}, 33{ 34 "raw_stack: skb_load_bytes, negative len 2", 35 .insns = { 36 BPF_MOV64_IMM(BPF_REG_2, 4), 37 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 38 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 39 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 40 BPF_MOV64_IMM(BPF_REG_4, ~0), 41 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_skb_load_bytes), 42 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 43 BPF_EXIT_INSN(), 44 }, 45 .result = REJECT, 46 .errstr = "R4 min value is negative", 47 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 48}, 49{ 50 "raw_stack: skb_load_bytes, zero len", 51 .insns = { 52 BPF_MOV64_IMM(BPF_REG_2, 4), 53 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 54 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 55 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 56 BPF_MOV64_IMM(BPF_REG_4, 0), 57 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_skb_load_bytes), 58 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 59 BPF_EXIT_INSN(), 60 }, 61 .result = REJECT, 62 .errstr = "invalid zero-sized read", 63 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 64}, 65{ 66 "raw_stack: skb_load_bytes, no init", 67 .insns = { 68 BPF_MOV64_IMM(BPF_REG_2, 4), 69 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 70 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 71 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 72 BPF_MOV64_IMM(BPF_REG_4, 8), 73 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_skb_load_bytes), 74 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 75 BPF_EXIT_INSN(), 76 }, 77 .result = ACCEPT, 78 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 79}, 80{ 81 "raw_stack: skb_load_bytes, init", 82 .insns = { 83 BPF_MOV64_IMM(BPF_REG_2, 4), 84 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 85 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 86 BPF_ST_MEM(BPF_DW, BPF_REG_6, 0, 0xcafe), 87 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 88 BPF_MOV64_IMM(BPF_REG_4, 8), 89 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_skb_load_bytes), 90 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 91 BPF_EXIT_INSN(), 92 }, 93 .result = ACCEPT, 94 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 95}, 96{ 97 "raw_stack: skb_load_bytes, spilled regs around bounds", 98 .insns = { 99 BPF_MOV64_IMM(BPF_REG_2, 4), 100 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 101 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -16), 102 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, -8), 103 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 8), 104 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 105 BPF_MOV64_IMM(BPF_REG_4, 8), 106 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_skb_load_bytes), 107 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, -8), 108 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6, 8), 109 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 110 offsetof(struct __sk_buff, mark)), 111 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_2, 112 offsetof(struct __sk_buff, priority)), 113 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 114 BPF_EXIT_INSN(), 115 }, 116 .result = ACCEPT, 117 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 118}, 119{ 120 "raw_stack: skb_load_bytes, spilled regs corruption", 121 .insns = { 122 BPF_MOV64_IMM(BPF_REG_2, 4), 123 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 124 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 125 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 126 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 127 BPF_MOV64_IMM(BPF_REG_4, 8), 128 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_skb_load_bytes), 129 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 130 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 131 offsetof(struct __sk_buff, mark)), 132 BPF_EXIT_INSN(), 133 }, 134 .result = REJECT, 135 .errstr = "R0 invalid mem access 'scalar'", 136 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 137 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 138}, 139{ 140 "raw_stack: skb_load_bytes, spilled regs corruption 2", 141 .insns = { 142 BPF_MOV64_IMM(BPF_REG_2, 4), 143 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 144 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -16), 145 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, -8), 146 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 147 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 8), 148 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 149 BPF_MOV64_IMM(BPF_REG_4, 8), 150 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_skb_load_bytes), 151 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, -8), 152 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6, 8), 153 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_6, 0), 154 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 155 offsetof(struct __sk_buff, mark)), 156 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_2, 157 offsetof(struct __sk_buff, priority)), 158 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 159 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_3, 160 offsetof(struct __sk_buff, pkt_type)), 161 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_3), 162 BPF_EXIT_INSN(), 163 }, 164 .result = REJECT, 165 .errstr = "R3 invalid mem access 'scalar'", 166 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 167 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 168}, 169{ 170 "raw_stack: skb_load_bytes, spilled regs + data", 171 .insns = { 172 BPF_MOV64_IMM(BPF_REG_2, 4), 173 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 174 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -16), 175 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, -8), 176 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 177 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 8), 178 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 179 BPF_MOV64_IMM(BPF_REG_4, 8), 180 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_skb_load_bytes), 181 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, -8), 182 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6, 8), 183 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_6, 0), 184 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 185 offsetof(struct __sk_buff, mark)), 186 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_2, 187 offsetof(struct __sk_buff, priority)), 188 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 189 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_3), 190 BPF_EXIT_INSN(), 191 }, 192 .result = ACCEPT, 193 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 194}, 195{ 196 "raw_stack: skb_load_bytes, invalid access 1", 197 .insns = { 198 BPF_MOV64_IMM(BPF_REG_2, 4), 199 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 200 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -513), 201 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 202 BPF_MOV64_IMM(BPF_REG_4, 8), 203 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_skb_load_bytes), 204 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 205 BPF_EXIT_INSN(), 206 }, 207 .result = REJECT, 208 .errstr = "invalid indirect access to stack R3 off=-513 size=8", 209 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 210}, 211{ 212 "raw_stack: skb_load_bytes, invalid access 2", 213 .insns = { 214 BPF_MOV64_IMM(BPF_REG_2, 4), 215 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 216 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -1), 217 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 218 BPF_MOV64_IMM(BPF_REG_4, 8), 219 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_skb_load_bytes), 220 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 221 BPF_EXIT_INSN(), 222 }, 223 .result = REJECT, 224 .errstr = "invalid indirect access to stack R3 off=-1 size=8", 225 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 226}, 227{ 228 "raw_stack: skb_load_bytes, invalid access 3", 229 .insns = { 230 BPF_MOV64_IMM(BPF_REG_2, 4), 231 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 232 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 0xffffffff), 233 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 234 BPF_MOV64_IMM(BPF_REG_4, 0xffffffff), 235 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_skb_load_bytes), 236 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 237 BPF_EXIT_INSN(), 238 }, 239 .result = REJECT, 240 .errstr = "R4 min value is negative", 241 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 242}, 243{ 244 "raw_stack: skb_load_bytes, invalid access 4", 245 .insns = { 246 BPF_MOV64_IMM(BPF_REG_2, 4), 247 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 248 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -1), 249 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 250 BPF_MOV64_IMM(BPF_REG_4, 0x7fffffff), 251 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_skb_load_bytes), 252 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 253 BPF_EXIT_INSN(), 254 }, 255 .result = REJECT, 256 .errstr = "R4 unbounded memory access, use 'var &= const' or 'if (var < const)'", 257 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 258}, 259{ 260 "raw_stack: skb_load_bytes, invalid access 5", 261 .insns = { 262 BPF_MOV64_IMM(BPF_REG_2, 4), 263 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 264 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -512), 265 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 266 BPF_MOV64_IMM(BPF_REG_4, 0x7fffffff), 267 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_skb_load_bytes), 268 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 269 BPF_EXIT_INSN(), 270 }, 271 .result = REJECT, 272 .errstr = "R4 unbounded memory access, use 'var &= const' or 'if (var < const)'", 273 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 274}, 275{ 276 "raw_stack: skb_load_bytes, invalid access 6", 277 .insns = { 278 BPF_MOV64_IMM(BPF_REG_2, 4), 279 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 280 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -512), 281 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 282 BPF_MOV64_IMM(BPF_REG_4, 0), 283 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_skb_load_bytes), 284 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 285 BPF_EXIT_INSN(), 286 }, 287 .result = REJECT, 288 .errstr = "invalid zero-sized read", 289 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 290}, 291{ 292 "raw_stack: skb_load_bytes, large access", 293 .insns = { 294 BPF_MOV64_IMM(BPF_REG_2, 4), 295 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 296 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -512), 297 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 298 BPF_MOV64_IMM(BPF_REG_4, 512), 299 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_skb_load_bytes), 300 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 301 BPF_EXIT_INSN(), 302 }, 303 .result = ACCEPT, 304 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 305},