• Daniel Borkmann's avatar
    bpf, selftests: Add test case for atomic fetch on spilled pointer · 180486b4
    Daniel Borkmann authored
    Test whether unprivileged would be able to leak the spilled pointer either
    by exporting the returned value from the atomic{32,64} operation or by reading
    and exporting the value from the stack after the atomic operation took place.
    
    Note that for unprivileged, the below atomic cmpxchg test case named "Dest
    pointer in r0 - succeed" is failing. The reason is that in the dst memory
    location (r10 -8) there is the spilled register r10:
    
      0: R1=ctx(id=0,off=0,imm=0) R10=fp0
      0: (bf) r0 = r10
      1: R0_w=fp0 R1=ctx(id=0,off=0,imm=0) R10=fp0
      1: (7b) *(u64 *)(r10 -8) = r0
      2: R0_w=fp0 R1=ctx(id=0,off=0,imm=0) R10=fp0 fp-8_w=fp
      2: (b7) r1 = 0
      3: R0_w=fp0 R1_w=invP0 R10=fp0 fp-8_w=fp
      3: (db) r0 = atomic64_cmpxchg((u64 *)(r10 -8), r0, r1)
      4: R0_w=fp0 R1_w=invP0 R10=fp0 fp-8_w=mmmmmmmm
      4: (79) r1 = *(u64 *)(r0 -8)
      5: R0_w=fp0 R1_w=invP(id=0) R10=fp0 fp-8_w=mmmmmmmm
      5: (b7) r0 = 0
      6: R0_w=invP0 R1_w=invP(id=0) R10=fp0 fp-8_w=mmmmmmmm
      6: (95) exit
    
    However, allowing this case for unprivileged is a bit useless given an
    update with a new pointer will fail anyway:
    
      0: R1=ctx(id=0,off=0,imm=0) R10=fp0
      0: (bf) r0 = r10
      1: R0_w=fp0 R1=ctx(id=0,off=0,imm=0) R10=fp0
      1: (7b) *(u64 *)(r10 -8) = r0
      2: R0_w=fp0 R1=ctx(id=0,off=0,imm=0) R10=fp0 fp-8_w=fp
      2: (db) r0 = atomic64_cmpxchg((u64 *)(r10 -8), r0, r10)
      R10 leaks addr into mem
    Acked-by: default avatarBrendan Jackman <jackmanb@google.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    180486b4
atomic_fetch.c 6.54 KB