[v4,2/2] selftests/bpf: Add test for alu on PTR_TO_FLOW_KEYS

Message ID 20240115082028.9992-2-sunhao.th@gmail.com
State New
Headers
Series None |

Commit Message

Hao Sun Jan. 15, 2024, 8:20 a.m. UTC
  Add a test case for PTR_TO_FLOW_KEYS alu. Testing if alu with
variable offset on flow_keys is rejected.

Signed-off-by: Hao Sun <sunhao.th@gmail.com>
---
 .../bpf/progs/verifier_value_illegal_alu.c    | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)
  

Comments

Yonghong Song Jan. 15, 2024, 5:35 p.m. UTC | #1
On 1/15/24 12:20 AM, Hao Sun wrote:
> Add a test case for PTR_TO_FLOW_KEYS alu. Testing if alu with
> variable offset on flow_keys is rejected.
>
> Signed-off-by: Hao Sun <sunhao.th@gmail.com>

Acked-by: Yonghong Song <yonghong.song@linux.dev>
  
Daniel Borkmann Jan. 16, 2024, 4:20 p.m. UTC | #2
On 1/15/24 9:20 AM, Hao Sun wrote:
> Add a test case for PTR_TO_FLOW_KEYS alu. Testing if alu with
> variable offset on flow_keys is rejected.
> 
> Signed-off-by: Hao Sun <sunhao.th@gmail.com>

Thanks applied, I've also added a note that we already have coverage
on the success case. Do you plan to follow up with checking the
remaining pointer types as Eduard suggested earlier?

Thanks,
Daniel
  
Hao Sun Jan. 16, 2024, 4:48 p.m. UTC | #3
On Tue, Jan 16, 2024 at 5:20 PM Daniel Borkmann <daniel@iogearbox.net> wrote:
>
> On 1/15/24 9:20 AM, Hao Sun wrote:
> > Add a test case for PTR_TO_FLOW_KEYS alu. Testing if alu with
> > variable offset on flow_keys is rejected.
> >
> > Signed-off-by: Hao Sun <sunhao.th@gmail.com>
>
> Thanks applied, I've also added a note that we already have coverage
> on the success case. Do you plan to follow up with checking the
> remaining pointer types as Eduard suggested earlier?
>

Yes, will do it in the following days.
  

Patch

diff --git a/tools/testing/selftests/bpf/progs/verifier_value_illegal_alu.c b/tools/testing/selftests/bpf/progs/verifier_value_illegal_alu.c
index 71814a753216..a9ab37d3b9e2 100644
--- a/tools/testing/selftests/bpf/progs/verifier_value_illegal_alu.c
+++ b/tools/testing/selftests/bpf/progs/verifier_value_illegal_alu.c
@@ -146,4 +146,23 @@  l0_%=:	exit;						\
 	: __clobber_all);
 }
 
+SEC("flow_dissector")
+__description("flow_keys illegal alu op with variable offset")
+__failure __msg("R7 pointer arithmetic on flow_keys prohibited")
+__naked void flow_keys_illegal_variable_offset_alu(void)
+{
+	asm volatile("					\
+	r6 = r1;					\
+	r7 = *(u64*)(r6 + %[flow_keys_off]);		\
+	r8 = 8;						\
+	r8 /= 1;					\
+	r8 &= 8;					\
+	r7 += r8;					\
+	r0 = *(u64*)(r7 + 0);				\
+	exit;						\
+"	:
+	: __imm_const(flow_keys_off, offsetof(struct __sk_buff, flow_keys))
+	: __clobber_all);
+}
+
 char _license[] SEC("license") = "GPL";