diff options
author | 2023-07-31 13:45:34 -0700 | |
---|---|---|
committer | 2023-07-31 17:35:02 -0700 | |
commit | e99688eba2e90a600956e936bc335ece902a5d7f (patch) | |
tree | 4ed882047898b50f32c5e23612d71ae884496feb | |
parent | net: remove duplicate INDIRECT_CALLABLE_DECLARE of udp[6]_ehashfn (diff) | |
download | wireguard-linux-e99688eba2e90a600956e936bc335ece902a5d7f.tar.xz wireguard-linux-e99688eba2e90a600956e936bc335ece902a5d7f.zip |
bpf: Fix an array-index-out-of-bounds issue in disasm.c
syzbot reported an array-index-out-of-bounds when printing out bpf
insns. Further investigation shows the insn is illegal but
is printed out due to log level 1 or 2 before actual insn verification
in do_check().
This particular illegal insn is a MOVSX insn with offset value 2.
The legal offset value for MOVSX should be 8, 16 and 32.
The disasm sign-extension-size array index is calculated as
(insn->off / 8) - 1
and offset value 2 gives an out-of-bound index -1.
Tighten the checking for MOVSX insn in disasm.c to avoid
array-index-out-of-bounds issue.
Reported-by: syzbot+3758842a6c01012aa73b@syzkaller.appspotmail.com
Fixes: f835bb622299 ("bpf: Add kernel/bpftool asm support for new instructions")
Signed-off-by: Yonghong Song <yonghong.song@linux.dev>
Acked-by: Eduard Zingerman <eddyz87@gmail.com>
Link: https://lore.kernel.org/r/20230731204534.1975311-1-yonghong.song@linux.dev
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
-rw-r--r-- | kernel/bpf/disasm.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/kernel/bpf/disasm.c b/kernel/bpf/disasm.c index d7bff608f299..ef7c107c7b8f 100644 --- a/kernel/bpf/disasm.c +++ b/kernel/bpf/disasm.c @@ -162,7 +162,8 @@ static bool is_sdiv_smod(const struct bpf_insn *insn) static bool is_movsx(const struct bpf_insn *insn) { - return BPF_OP(insn->code) == BPF_MOV && insn->off != 0; + return BPF_OP(insn->code) == BPF_MOV && + (insn->off == 8 || insn->off == 16 || insn->off == 32); } void print_bpf_insn(const struct bpf_insn_cbs *cbs, |