bpf, selftests: Add verifier test for mem_or_null register with offset.
authorDaniel Borkmann <daniel@iogearbox.net>
Wed, 5 Jan 2022 19:33:34 +0000 (11:33 -0800)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 5 Jan 2022 20:00:19 +0000 (12:00 -0800)
Add a new test case with mem_or_null typed register with off > 0 to ensure
it gets rejected by the verifier:

  # ./test_verifier 1011
  #1009/u check with invalid reg offset 0 OK
  #1009/p check with invalid reg offset 0 OK
  Summary: 2 PASSED, 0 SKIPPED, 0 FAILED

Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/verifier/spill_fill.c

index 6c90714..1a8eb96 100644 (file)
        .result_unpriv = ACCEPT,
 },
 {
+       "check with invalid reg offset 0",
+       .insns = {
+       /* reserve 8 byte ringbuf memory */
+       BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
+       BPF_LD_MAP_FD(BPF_REG_1, 0),
+       BPF_MOV64_IMM(BPF_REG_2, 8),
+       BPF_MOV64_IMM(BPF_REG_3, 0),
+       BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_ringbuf_reserve),
+       /* store a pointer to the reserved memory in R6 */
+       BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
+       /* add invalid offset to memory or NULL */
+       BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1),
+       /* check whether the reservation was successful */
+       BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
+       /* should not be able to access *(R7) = 0 */
+       BPF_ST_MEM(BPF_W, BPF_REG_6, 0, 0),
+       /* submit the reserved ringbuf memory */
+       BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
+       BPF_MOV64_IMM(BPF_REG_2, 0),
+       BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_ringbuf_submit),
+       BPF_MOV64_IMM(BPF_REG_0, 0),
+       BPF_EXIT_INSN(),
+       },
+       .fixup_map_ringbuf = { 1 },
+       .result = REJECT,
+       .errstr = "R0 pointer arithmetic on mem_or_null prohibited",
+},
+{
        "check corrupted spill/fill",
        .insns = {
        /* spill R1(ctx) into stack */