|
@@ -859,15 +859,451 @@ static struct bpf_test tests[] = {
|
|
.result = REJECT,
|
|
.result = REJECT,
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- "check non-u32 access to cb",
|
|
|
|
|
|
+ "check cb access: byte",
|
|
.insns = {
|
|
.insns = {
|
|
- BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_1,
|
|
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[0])),
|
|
|
|
+ BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[0]) + 1),
|
|
|
|
+ BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[0]) + 2),
|
|
|
|
+ BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[0]) + 3),
|
|
|
|
+ BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[1])),
|
|
|
|
+ BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[1]) + 1),
|
|
|
|
+ BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[1]) + 2),
|
|
|
|
+ BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[1]) + 3),
|
|
|
|
+ BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[2])),
|
|
|
|
+ BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[2]) + 1),
|
|
|
|
+ BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[2]) + 2),
|
|
|
|
+ BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[2]) + 3),
|
|
|
|
+ BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[3])),
|
|
|
|
+ BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[3]) + 1),
|
|
|
|
+ BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[3]) + 2),
|
|
|
|
+ BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[3]) + 3),
|
|
|
|
+ BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[4])),
|
|
|
|
+ BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[4]) + 1),
|
|
|
|
+ BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[4]) + 2),
|
|
|
|
+ BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[4]) + 3),
|
|
|
|
+ BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[0])),
|
|
|
|
+ BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[0]) + 1),
|
|
|
|
+ BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[0]) + 2),
|
|
|
|
+ BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[0]) + 3),
|
|
|
|
+ BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[1])),
|
|
|
|
+ BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[1]) + 1),
|
|
|
|
+ BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[1]) + 2),
|
|
|
|
+ BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[1]) + 3),
|
|
|
|
+ BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[2])),
|
|
|
|
+ BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[2]) + 1),
|
|
|
|
+ BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[2]) + 2),
|
|
|
|
+ BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[2]) + 3),
|
|
|
|
+ BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[3])),
|
|
|
|
+ BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[3]) + 1),
|
|
|
|
+ BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[3]) + 2),
|
|
|
|
+ BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[3]) + 3),
|
|
|
|
+ BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[4])),
|
|
|
|
+ BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[4]) + 1),
|
|
|
|
+ BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[4]) + 2),
|
|
|
|
+ BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[4]) + 3),
|
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
|
+ },
|
|
|
|
+ .result = ACCEPT,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "check cb access: byte, oob 1",
|
|
|
|
+ .insns = {
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[4]) + 4),
|
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
|
+ },
|
|
|
|
+ .errstr = "invalid bpf_context access",
|
|
|
|
+ .result = REJECT,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "check cb access: byte, oob 2",
|
|
|
|
+ .insns = {
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[0]) - 1),
|
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
|
+ },
|
|
|
|
+ .errstr = "invalid bpf_context access",
|
|
|
|
+ .result = REJECT,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "check cb access: byte, oob 3",
|
|
|
|
+ .insns = {
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[4]) + 4),
|
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
|
+ },
|
|
|
|
+ .errstr = "invalid bpf_context access",
|
|
|
|
+ .result = REJECT,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "check cb access: byte, oob 4",
|
|
|
|
+ .insns = {
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[0]) - 1),
|
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
|
+ },
|
|
|
|
+ .errstr = "invalid bpf_context access",
|
|
|
|
+ .result = REJECT,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "check cb access: byte, wrong type",
|
|
|
|
+ .insns = {
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[0])),
|
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
|
+ },
|
|
|
|
+ .errstr = "invalid bpf_context access",
|
|
|
|
+ .result = REJECT,
|
|
|
|
+ .prog_type = BPF_PROG_TYPE_CGROUP_SOCK,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "check cb access: half",
|
|
|
|
+ .insns = {
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[0])),
|
|
|
|
+ BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[0]) + 2),
|
|
|
|
+ BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[1])),
|
|
|
|
+ BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[1]) + 2),
|
|
|
|
+ BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[2])),
|
|
|
|
+ BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[2]) + 2),
|
|
|
|
+ BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[3])),
|
|
|
|
+ BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[3]) + 2),
|
|
|
|
+ BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[4])),
|
|
|
|
+ BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[4]) + 2),
|
|
|
|
+ BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[0])),
|
|
|
|
+ BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[0]) + 2),
|
|
|
|
+ BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[1])),
|
|
|
|
+ BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[1]) + 2),
|
|
|
|
+ BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[2])),
|
|
|
|
+ BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[2]) + 2),
|
|
|
|
+ BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[3])),
|
|
|
|
+ BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[3]) + 2),
|
|
|
|
+ BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[4])),
|
|
|
|
+ BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[4]) + 2),
|
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
|
+ },
|
|
|
|
+ .result = ACCEPT,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "check cb access: half, unaligned",
|
|
|
|
+ .insns = {
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[0]) + 1),
|
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
|
+ },
|
|
|
|
+ .errstr = "misaligned access",
|
|
|
|
+ .result = REJECT,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "check cb access: half, oob 1",
|
|
|
|
+ .insns = {
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[4]) + 4),
|
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
|
+ },
|
|
|
|
+ .errstr = "invalid bpf_context access",
|
|
|
|
+ .result = REJECT,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "check cb access: half, oob 2",
|
|
|
|
+ .insns = {
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[0]) - 2),
|
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
|
+ },
|
|
|
|
+ .errstr = "invalid bpf_context access",
|
|
|
|
+ .result = REJECT,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "check cb access: half, oob 3",
|
|
|
|
+ .insns = {
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[4]) + 4),
|
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
|
+ },
|
|
|
|
+ .errstr = "invalid bpf_context access",
|
|
|
|
+ .result = REJECT,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "check cb access: half, oob 4",
|
|
|
|
+ .insns = {
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[0]) - 2),
|
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
|
+ },
|
|
|
|
+ .errstr = "invalid bpf_context access",
|
|
|
|
+ .result = REJECT,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "check cb access: half, wrong type",
|
|
|
|
+ .insns = {
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[0])),
|
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
|
+ },
|
|
|
|
+ .errstr = "invalid bpf_context access",
|
|
|
|
+ .result = REJECT,
|
|
|
|
+ .prog_type = BPF_PROG_TYPE_CGROUP_SOCK,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "check cb access: word",
|
|
|
|
+ .insns = {
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[0])),
|
|
|
|
+ BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[1])),
|
|
|
|
+ BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[2])),
|
|
|
|
+ BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[3])),
|
|
|
|
+ BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[4])),
|
|
|
|
+ BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[0])),
|
|
|
|
+ BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[1])),
|
|
|
|
+ BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[2])),
|
|
|
|
+ BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[3])),
|
|
|
|
+ BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[4])),
|
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
|
+ },
|
|
|
|
+ .result = ACCEPT,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "check cb access: word, unaligned 1",
|
|
|
|
+ .insns = {
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[0]) + 2),
|
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
|
+ },
|
|
|
|
+ .errstr = "misaligned access",
|
|
|
|
+ .result = REJECT,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "check cb access: word, unaligned 2",
|
|
|
|
+ .insns = {
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[4]) + 1),
|
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
|
+ },
|
|
|
|
+ .errstr = "misaligned access",
|
|
|
|
+ .result = REJECT,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "check cb access: word, unaligned 3",
|
|
|
|
+ .insns = {
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[4]) + 2),
|
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
|
+ },
|
|
|
|
+ .errstr = "misaligned access",
|
|
|
|
+ .result = REJECT,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "check cb access: word, unaligned 4",
|
|
|
|
+ .insns = {
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[4]) + 3),
|
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
|
+ },
|
|
|
|
+ .errstr = "misaligned access",
|
|
|
|
+ .result = REJECT,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "check cb access: double",
|
|
|
|
+ .insns = {
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[0])),
|
|
|
|
+ BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[2])),
|
|
|
|
+ BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[0])),
|
|
|
|
+ BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[2])),
|
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
|
+ },
|
|
|
|
+ .result = ACCEPT,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "check cb access: double, unaligned 1",
|
|
|
|
+ .insns = {
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[1])),
|
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
|
+ },
|
|
|
|
+ .errstr = "misaligned access",
|
|
|
|
+ .result = REJECT,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "check cb access: double, unaligned 2",
|
|
|
|
+ .insns = {
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[3])),
|
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
|
+ },
|
|
|
|
+ .errstr = "misaligned access",
|
|
|
|
+ .result = REJECT,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "check cb access: double, oob 1",
|
|
|
|
+ .insns = {
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[4])),
|
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
|
+ },
|
|
|
|
+ .errstr = "invalid bpf_context access",
|
|
|
|
+ .result = REJECT,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "check cb access: double, oob 2",
|
|
|
|
+ .insns = {
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[4]) + 8),
|
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
|
+ },
|
|
|
|
+ .errstr = "invalid bpf_context access",
|
|
|
|
+ .result = REJECT,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "check cb access: double, oob 3",
|
|
|
|
+ .insns = {
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0,
|
|
|
|
+ offsetof(struct __sk_buff, cb[0]) - 8),
|
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
|
+ },
|
|
|
|
+ .errstr = "invalid bpf_context access",
|
|
|
|
+ .result = REJECT,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "check cb access: double, oob 4",
|
|
|
|
+ .insns = {
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[4])),
|
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
|
+ },
|
|
|
|
+ .errstr = "invalid bpf_context access",
|
|
|
|
+ .result = REJECT,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "check cb access: double, oob 5",
|
|
|
|
+ .insns = {
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[4]) + 8),
|
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
|
+ },
|
|
|
|
+ .errstr = "invalid bpf_context access",
|
|
|
|
+ .result = REJECT,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "check cb access: double, oob 6",
|
|
|
|
+ .insns = {
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
|
|
|
|
+ offsetof(struct __sk_buff, cb[0]) - 8),
|
|
|
|
+ BPF_EXIT_INSN(),
|
|
|
|
+ },
|
|
|
|
+ .errstr = "invalid bpf_context access",
|
|
|
|
+ .result = REJECT,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "check cb access: double, wrong type",
|
|
|
|
+ .insns = {
|
|
|
|
+ BPF_MOV64_IMM(BPF_REG_0, 0),
|
|
|
|
+ BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0,
|
|
offsetof(struct __sk_buff, cb[0])),
|
|
offsetof(struct __sk_buff, cb[0])),
|
|
BPF_EXIT_INSN(),
|
|
BPF_EXIT_INSN(),
|
|
},
|
|
},
|
|
.errstr = "invalid bpf_context access",
|
|
.errstr = "invalid bpf_context access",
|
|
- .errstr_unpriv = "R1 leaks addr",
|
|
|
|
.result = REJECT,
|
|
.result = REJECT,
|
|
|
|
+ .prog_type = BPF_PROG_TYPE_CGROUP_SOCK,
|
|
},
|
|
},
|
|
{
|
|
{
|
|
"check out of range skb->cb access",
|
|
"check out of range skb->cb access",
|