Skip to content

Commit 4ee507c

Browse files
ADSWT518Kernel Patches Daemon
authored andcommitted
bpf: Correctly reject negative offsets for ALU ops
When verifying BPF programs, the check_alu_op() function validates instructions with ALU operations. The 'offset' field in these instructions is a signed 16-bit integer. The existing check 'insn->off > 1' was intended to ensure the offset is either 0, or 1 for BPF_MOD/BPF_DIV. However, because 'insn->off' is signed, this check incorrectly accepts all negative values (e.g., -1). This commit tightens the validation by changing the condition to '(insn->off != 0 && insn->off != 1)'. This ensures that any value other than the explicitly permitted 0 and 1 is rejected, hardening the verifier against malformed BPF programs. Co-developed-by: Shenghao Yuan <[email protected]> Signed-off-by: Shenghao Yuan <[email protected]> Co-developed-by: Tianci Cao <[email protected]> Signed-off-by: Tianci Cao <[email protected]> Signed-off-by: Yazhou Tang <[email protected]>
1 parent 9043deb commit 4ee507c

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

kernel/bpf/verifier.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15739,7 +15739,7 @@ static int check_alu_op(struct bpf_verifier_env *env, struct bpf_insn *insn)
1573915739
} else { /* all other ALU ops: and, sub, xor, add, ... */
1574015740

1574115741
if (BPF_SRC(insn->code) == BPF_X) {
15742-
if (insn->imm != 0 || insn->off > 1 ||
15742+
if (insn->imm != 0 || (insn->off != 0 && insn->off != 1) ||
1574315743
(insn->off == 1 && opcode != BPF_MOD && opcode != BPF_DIV)) {
1574415744
verbose(env, "BPF_ALU uses reserved fields\n");
1574515745
return -EINVAL;
@@ -15749,7 +15749,7 @@ static int check_alu_op(struct bpf_verifier_env *env, struct bpf_insn *insn)
1574915749
if (err)
1575015750
return err;
1575115751
} else {
15752-
if (insn->src_reg != BPF_REG_0 || insn->off > 1 ||
15752+
if (insn->src_reg != BPF_REG_0 || (insn->off != 0 && insn->off != 1) ||
1575315753
(insn->off == 1 && opcode != BPF_MOD && opcode != BPF_DIV)) {
1575415754
verbose(env, "BPF_ALU uses reserved fields\n");
1575515755
return -EINVAL;

0 commit comments

Comments
 (0)