Skip to content

Commit 5f3077d

Browse files
Kohei EnjuAlexei Starovoitov
authored andcommitted
selftests/bpf: Add selftests for load-acquire/store-release when register number is invalid
syzbot reported out-of-bounds read in check_atomic_load/store() when the register number is invalid in this context: https://syzkaller.appspot.com/bug?extid=a5964227adc0f904549c To avoid the issue from now on, let's add tests where the register number is invalid for load-acquire/store-release. After discussion with Eduard, I decided to use R15 as invalid register because the actual slab-out-of-bounds read issue occurs when the register number is R12 or larger. Signed-off-by: Kohei Enju <enjuk@amazon.com> Acked-by: Eduard Zingerman <eddyz87@gmail.com> Link: https://lore.kernel.org/r/20250322045340.18010-6-enjuk@amazon.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
1 parent c03bb2f commit 5f3077d

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

tools/testing/selftests/bpf/progs/verifier_load_acquire.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,20 @@ __naked void load_acquire_from_sock_pointer(void)
189189
: __clobber_all);
190190
}
191191

192+
SEC("socket")
193+
__description("load-acquire with invalid register R15")
194+
__failure __failure_unpriv __msg("R15 is invalid")
195+
__naked void load_acquire_with_invalid_reg(void)
196+
{
197+
asm volatile (
198+
".8byte %[load_acquire_insn];" // r0 = load_acquire((u64 *)(r15 + 0));
199+
"exit;"
200+
:
201+
: __imm_insn(load_acquire_insn,
202+
BPF_ATOMIC_OP(BPF_DW, BPF_LOAD_ACQ, BPF_REG_0, 15 /* invalid reg */, 0))
203+
: __clobber_all);
204+
}
205+
192206
#else /* CAN_USE_LOAD_ACQ_STORE_REL */
193207

194208
SEC("socket")

tools/testing/selftests/bpf/progs/verifier_store_release.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,20 @@ __naked void store_release_leak_pointer_to_map(void)
257257
: __clobber_all);
258258
}
259259

260+
SEC("socket")
261+
__description("store-release with invalid register R15")
262+
__failure __failure_unpriv __msg("R15 is invalid")
263+
__naked void store_release_with_invalid_reg(void)
264+
{
265+
asm volatile (
266+
".8byte %[store_release_insn];" // store_release((u64 *)(r15 + 0), r1);
267+
"exit;"
268+
:
269+
: __imm_insn(store_release_insn,
270+
BPF_ATOMIC_OP(BPF_DW, BPF_STORE_REL, 15 /* invalid reg */, BPF_REG_1, 0))
271+
: __clobber_all);
272+
}
273+
260274
#else
261275

262276
SEC("socket")

0 commit comments

Comments
 (0)