Patch "bpf: arsh is not supported in 32 bit alu thus reject it" has been added to the 4.14-stable tree
Subsystems (5)
This is a note to let you know that I've just added the patch titled
bpf: arsh is not supported in 32 bit alu thus reject it
to the 4.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
bpf-arsh-is-not-supported-in-32-bit-alu-thus-reject-it.patch
and it can be found in the queue-4.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
7891a87efc7116590eaba57acc3c422487802c6fMon Sep 17 00:00:00 2001
From: Daniel Borkmann <[email protected]>
Date: Wed, 10 Jan 2018 20:04:37 +0100
Subject: bpf: arsh is not supported in 32 bit alu thus reject it
From: Daniel Borkmann <[email protected]>
commit 7891a87efc7116590eaba57acc3c422487802c6f upstream.
The following snippet was throwing an 'unknown opcode cc' warning in BPF interpreter:
0: (18) r0 = 0x0
2: (7b) *(u64 *)(r10 -16) = r0
3: (cc) (u32) r0 s>>= (u32) r0
4: (95) exit
Although a number of JITs do support BPF_ALU | BPF_ARSH | BPF_{K,X} generation, not all of them do and interpreter does neither. We can leave existing ones and implement it later in bpf-next for the remaining ones, but reject this properly in verifier for the time being.
--- kernel/bpf/verifier.c | 5 +++ tools/testing/selftests/bpf/test_verifier.c | 40 ++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+)
kernel/bpf/verifier.c +5 -0
@@ -2493,6 +2493,11 @@ static int check_alu_op(struct bpf_verifreturn -EINVAL ; } +if (opcode ==BPF_ARSH &&BPF_CLASS (insn->code) !=BPF_ALU64 ) { +verbose ("BPF_ARSH not supported for 32 bit ALU\n" ); +return -EINVAL ; + } +if ((opcode ==BPF_LSH || opcode ==BPF_RSH || opcode ==BPF_ARSH ) &&BPF_SRC (insn->code) ==BPF_K ) {int size =BPF_CLASS (insn->code) ==BPF_ALU64 ?64 :32 ;
tools/testing/selftests/bpf/test_verifier.c +40 -0
@@ -273,6 +273,46 @@ static struct bpf_test tests[] = { .result = REJECT, }, { + "arsh32 on imm", + .insns = { +BPF_MOV64_IMM (BPF_REG_0 ,1 ), +BPF_ALU32_IMM (BPF_ARSH ,BPF_REG_0 ,5 ), + BPF_EXIT_INSN(), + }, + .result =REJECT , + .errstr = "BPF_ARSH not supported for 32 bit ALU", + }, + { +"arsh32 on reg" , + .insns = { +BPF_MOV64_IMM (BPF_REG_0 ,1 ), +BPF_MOV64_IMM (BPF_REG_1 ,5 ), +BPF_ALU32_REG (BPF_ARSH ,BPF_REG_0 ,BPF_REG_1 ), + BPF_EXIT_INSN(), + }, + .result =REJECT , + .errstr = "BPF_ARSH not supported for 32 bit ALU", + }, + { +"arsh64 on imm" , + .insns = { +BPF_MOV64_IMM (BPF_REG_0 ,1 ), +BPF_ALU64_IMM (BPF_ARSH ,BPF_REG_0 ,5 ), + BPF_EXIT_INSN(), + }, + .result =ACCEPT , + }, + { +"arsh64 on reg" , + .insns = { +BPF_MOV64_IMM (BPF_REG_0 ,1 ), +BPF_MOV64_IMM (BPF_REG_1 ,5 ), +BPF_ALU64_REG (BPF_ARSH ,BPF_REG_0 ,BPF_REG_1 ), + BPF_EXIT_INSN(), + }, + .result =ACCEPT , + }, + {"no bpf_exit" , .insns = { BPF_ALU64_REG(BPF_MOV, BPF_REG_0, BPF_REG_2),
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/bpf-array-fix-overflow-in-max_entries-and-undefined-behavior-in-index_mask.patch queue-4.14/bpf-prevent-out-of-bounds-speculation.patch queue-4.14/bpf-arsh-is-not-supported-in-32-bit-alu-thus-reject-it.patch