[PATCH 2/9] powerpc/bpf: Validate branch ranges
Naveen N. Rao
naveen.n.rao at linux.vnet.ibm.com
Tue Oct 5 05:11:13 AEDT 2021
Christophe Leroy wrote:
>
>
> Le 01/10/2021 à 23:14, Naveen N. Rao a écrit :
>> Add checks to ensure that we never emit branch instructions with
>> truncated branch offsets.
>>
>> Suggested-by: Michael Ellerman <mpe at ellerman.id.au>
>> Signed-off-by: Naveen N. Rao <naveen.n.rao at linux.vnet.ibm.com>
>> ---
>> arch/powerpc/net/bpf_jit.h | 26 ++++++++++++++++++++------
>> arch/powerpc/net/bpf_jit_comp.c | 6 +++++-
>> arch/powerpc/net/bpf_jit_comp32.c | 8 ++++++--
>> arch/powerpc/net/bpf_jit_comp64.c | 8 ++++++--
>> 4 files changed, 37 insertions(+), 11 deletions(-)
>>
>> diff --git a/arch/powerpc/net/bpf_jit.h b/arch/powerpc/net/bpf_jit.h
>> index 935ea95b66359e..7e9b978b768ed9 100644
>> --- a/arch/powerpc/net/bpf_jit.h
>> +++ b/arch/powerpc/net/bpf_jit.h
>> @@ -24,16 +24,30 @@
>> #define EMIT(instr) PLANT_INSTR(image, ctx->idx, instr)
>>
>> /* Long jump; (unconditional 'branch') */
>> -#define PPC_JMP(dest) EMIT(PPC_INST_BRANCH | \
>> - (((dest) - (ctx->idx * 4)) & 0x03fffffc))
>> +#define PPC_JMP(dest) \
>> + do { \
>> + long offset = (long)(dest) - (ctx->idx * 4); \
>> + if (!is_offset_in_branch_range(offset)) { \
>> + pr_err_ratelimited("Branch offset 0x%lx (@%u) out of range\n", offset, ctx->idx); \
>
> Does it really deserves a KERN_ERR ?
The intent is to ensure that we handle this when JIT'ing the BPF
instruction. One of the subsequent patches fixes the only scenario where
we can hit this today. In practice, we should never hit this and if we
do see this, then it is a bug with the JIT.
> Isn't that something that can trigger with a userland request ?
This can't be triggered by unprivileged BPF programs since those are
limited to 4096 BPF instructions. You need root privileges to load large
enough BPF programs that can trigger out of range branches.
- Naveen
More information about the Linuxppc-dev
mailing list