0001 {
0002 "variable-offset ctx access",
0003 .insns = {
0004
0005 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0),
0006
0007 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4),
0008
0009
0010
0011 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2),
0012
0013 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0),
0014 BPF_EXIT_INSN(),
0015 },
0016 .errstr = "variable ctx access var_off=(0x0; 0x4)",
0017 .result = REJECT,
0018 .prog_type = BPF_PROG_TYPE_LWT_IN,
0019 },
0020 {
0021 "variable-offset stack read, priv vs unpriv",
0022 .insns = {
0023
0024 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
0025
0026 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0),
0027
0028 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4),
0029 BPF_ALU64_IMM(BPF_SUB, BPF_REG_2, 8),
0030
0031
0032
0033 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_10),
0034
0035 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_2, 0),
0036 BPF_MOV64_IMM(BPF_REG_0, 0),
0037 BPF_EXIT_INSN(),
0038 },
0039 .result = ACCEPT,
0040 .result_unpriv = REJECT,
0041 .errstr_unpriv = "R2 variable stack access prohibited for !root",
0042 .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
0043 },
0044 {
0045 "variable-offset stack read, uninitialized",
0046 .insns = {
0047
0048 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0),
0049
0050 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4),
0051 BPF_ALU64_IMM(BPF_SUB, BPF_REG_2, 8),
0052
0053
0054
0055 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_10),
0056
0057 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_2, 0),
0058 BPF_MOV64_IMM(BPF_REG_0, 0),
0059 BPF_EXIT_INSN(),
0060 },
0061 .result = REJECT,
0062 .errstr = "invalid variable-offset read from stack R2",
0063 .prog_type = BPF_PROG_TYPE_LWT_IN,
0064 },
0065 {
0066 "variable-offset stack write, priv vs unpriv",
0067 .insns = {
0068
0069 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0),
0070
0071 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 8),
0072 BPF_ALU64_IMM(BPF_SUB, BPF_REG_2, 16),
0073
0074
0075
0076 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_10),
0077
0078 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0079
0080
0081
0082
0083
0084
0085 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_2, 0),
0086 BPF_MOV64_IMM(BPF_REG_0, 0),
0087 BPF_EXIT_INSN(),
0088 },
0089
0090
0091 .errstr_unpriv = "R2 variable stack access prohibited for !root",
0092 .result_unpriv = REJECT,
0093 .result = ACCEPT,
0094 },
0095 {
0096 "variable-offset stack write clobbers spilled regs",
0097 .insns = {
0098
0099
0100
0101 BPF_MOV64_IMM(BPF_REG_6, 0),
0102
0103 BPF_LD_MAP_FD(BPF_REG_0, 0),
0104
0105 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0),
0106
0107 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 8),
0108 BPF_ALU64_IMM(BPF_SUB, BPF_REG_2, 16),
0109
0110
0111
0112 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_10),
0113
0114 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
0115
0116 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0117
0118 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -8),
0119
0120 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, 8),
0121 BPF_EXIT_INSN(),
0122 },
0123 .fixup_map_hash_8b = { 1 },
0124
0125
0126
0127 .errstr_unpriv = "R2 variable stack access prohibited for !root",
0128 .result_unpriv = REJECT,
0129
0130
0131
0132
0133
0134 .errstr = "R2 invalid mem access 'scalar'",
0135 .result = REJECT,
0136 },
0137 {
0138 "indirect variable-offset stack access, unbounded",
0139 .insns = {
0140 BPF_MOV64_IMM(BPF_REG_2, 6),
0141 BPF_MOV64_IMM(BPF_REG_3, 28),
0142
0143 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, 0),
0144 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
0145
0146 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_1, offsetof(struct bpf_sock_ops,
0147 bytes_received)),
0148
0149 BPF_JMP_IMM(BPF_JSLT, BPF_REG_4, 0, 4),
0150
0151
0152
0153 BPF_ALU64_IMM(BPF_SUB, BPF_REG_4, 16),
0154 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_10),
0155 BPF_MOV64_IMM(BPF_REG_5, 8),
0156
0157 BPF_EMIT_CALL(BPF_FUNC_getsockopt),
0158 BPF_MOV64_IMM(BPF_REG_0, 0),
0159 BPF_EXIT_INSN(),
0160 },
0161 .errstr = "invalid unbounded variable-offset indirect access to stack R4",
0162 .result = REJECT,
0163 .prog_type = BPF_PROG_TYPE_SOCK_OPS,
0164 },
0165 {
0166 "indirect variable-offset stack access, max out of bound",
0167 .insns = {
0168
0169 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
0170
0171 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0),
0172
0173 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4),
0174 BPF_ALU64_IMM(BPF_SUB, BPF_REG_2, 8),
0175
0176
0177
0178 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_10),
0179
0180 BPF_LD_MAP_FD(BPF_REG_1, 0),
0181 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
0182 BPF_MOV64_IMM(BPF_REG_0, 0),
0183 BPF_EXIT_INSN(),
0184 },
0185 .fixup_map_hash_8b = { 5 },
0186 .errstr = "invalid variable-offset indirect access to stack R2",
0187 .result = REJECT,
0188 .prog_type = BPF_PROG_TYPE_LWT_IN,
0189 },
0190 {
0191 "indirect variable-offset stack access, min out of bound",
0192 .insns = {
0193
0194 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
0195
0196 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0),
0197
0198 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4),
0199 BPF_ALU64_IMM(BPF_SUB, BPF_REG_2, 516),
0200
0201
0202
0203 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_10),
0204
0205 BPF_LD_MAP_FD(BPF_REG_1, 0),
0206 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
0207 BPF_MOV64_IMM(BPF_REG_0, 0),
0208 BPF_EXIT_INSN(),
0209 },
0210 .fixup_map_hash_8b = { 5 },
0211 .errstr = "invalid variable-offset indirect access to stack R2",
0212 .result = REJECT,
0213 .prog_type = BPF_PROG_TYPE_LWT_IN,
0214 },
0215 {
0216 "indirect variable-offset stack access, max_off+size > max_initialized",
0217 .insns = {
0218
0219 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, 0),
0220
0221 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0),
0222
0223 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4),
0224 BPF_ALU64_IMM(BPF_SUB, BPF_REG_2, 16),
0225
0226
0227
0228 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_10),
0229
0230 BPF_LD_MAP_FD(BPF_REG_1, 0),
0231 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0232 BPF_MOV64_IMM(BPF_REG_0, 0),
0233 BPF_EXIT_INSN(),
0234 },
0235 .fixup_map_hash_8b = { 5 },
0236 .errstr = "invalid indirect read from stack R2 var_off",
0237 .result = REJECT,
0238 .prog_type = BPF_PROG_TYPE_LWT_IN,
0239 },
0240 {
0241 "indirect variable-offset stack access, min_off < min_initialized",
0242 .insns = {
0243
0244 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
0245
0246 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0),
0247
0248 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4),
0249 BPF_ALU64_IMM(BPF_SUB, BPF_REG_2, 16),
0250
0251
0252
0253 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_10),
0254
0255 BPF_LD_MAP_FD(BPF_REG_1, 0),
0256 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0257 BPF_MOV64_IMM(BPF_REG_0, 0),
0258 BPF_EXIT_INSN(),
0259 },
0260 .fixup_map_hash_8b = { 5 },
0261 .errstr = "invalid indirect read from stack R2 var_off",
0262 .result = REJECT,
0263 .prog_type = BPF_PROG_TYPE_LWT_IN,
0264 },
0265 {
0266 "indirect variable-offset stack access, priv vs unpriv",
0267 .insns = {
0268
0269 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, 0),
0270 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
0271
0272 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0),
0273
0274 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4),
0275 BPF_ALU64_IMM(BPF_SUB, BPF_REG_2, 16),
0276
0277
0278
0279 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_10),
0280
0281 BPF_LD_MAP_FD(BPF_REG_1, 0),
0282 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0283 BPF_MOV64_IMM(BPF_REG_0, 0),
0284 BPF_EXIT_INSN(),
0285 },
0286 .fixup_map_hash_8b = { 6 },
0287 .errstr_unpriv = "R2 variable stack access prohibited for !root",
0288 .result_unpriv = REJECT,
0289 .result = ACCEPT,
0290 .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
0291 },
0292 {
0293 "indirect variable-offset stack access, uninitialized",
0294 .insns = {
0295 BPF_MOV64_IMM(BPF_REG_2, 6),
0296 BPF_MOV64_IMM(BPF_REG_3, 28),
0297
0298 BPF_ST_MEM(BPF_W, BPF_REG_10, -16, 0),
0299 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
0300
0301 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 0),
0302
0303 BPF_ALU64_IMM(BPF_AND, BPF_REG_4, 4),
0304 BPF_ALU64_IMM(BPF_SUB, BPF_REG_4, 16),
0305
0306
0307
0308 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_10),
0309 BPF_MOV64_IMM(BPF_REG_5, 8),
0310
0311 BPF_EMIT_CALL(BPF_FUNC_getsockopt),
0312 BPF_MOV64_IMM(BPF_REG_0, 0),
0313 BPF_EXIT_INSN(),
0314 },
0315 .errstr = "invalid indirect read from stack R4 var_off",
0316 .result = REJECT,
0317 .prog_type = BPF_PROG_TYPE_SOCK_OPS,
0318 },
0319 {
0320 "indirect variable-offset stack access, ok",
0321 .insns = {
0322
0323 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, 0),
0324 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
0325
0326 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0),
0327
0328 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4),
0329 BPF_ALU64_IMM(BPF_SUB, BPF_REG_2, 16),
0330
0331
0332
0333 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_10),
0334
0335 BPF_LD_MAP_FD(BPF_REG_1, 0),
0336 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0337 BPF_MOV64_IMM(BPF_REG_0, 0),
0338 BPF_EXIT_INSN(),
0339 },
0340 .fixup_map_hash_8b = { 6 },
0341 .result = ACCEPT,
0342 .prog_type = BPF_PROG_TYPE_LWT_IN,
0343 },