All of lore.kernel.org
 help / color / mirror / Atom feed
From: <gregkh@linuxfoundation.org>
To: daniel@iogearbox.net, ast@kernel.org, gregkh@linuxfoundation.org,
	jannh@google.com
Cc: <stable@vger.kernel.org>, <stable-commits@vger.kernel.org>
Subject: Patch "[PATCH stable/4.14 09/14] bpf: fix 32-bit ALU op verification" has been added to the 4.14-stable tree
Date: Fri, 22 Dec 2017 16:47:37 +0100	[thread overview]
Message-ID: <151395765783172@kroah.com> (raw)
In-Reply-To: <20171222152312.2945-10-daniel@iogearbox.net>


This is a note to let you know that I've just added the patch titled

    [PATCH stable/4.14 09/14] bpf: fix 32-bit ALU op verification

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-fix-32-bit-alu-op-verification.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 <stable@vger.kernel.org> know about it.


>From foo@baz Fri Dec 22 16:47:02 CET 2017
From: Daniel Borkmann <daniel@iogearbox.net>
Date: Fri, 22 Dec 2017 16:23:07 +0100
Subject: [PATCH stable/4.14 09/14] bpf: fix 32-bit ALU op verification
To: gregkh@linuxfoundation.org
Cc: ast@kernel.org, daniel@iogearbox.net, jannh@google.com, stable@vger.kernel.org
Message-ID: <20171222152312.2945-10-daniel@iogearbox.net>

From: Daniel Borkmann <daniel@iogearbox.net>


From: Jann Horn <jannh@google.com>

[ Upstream commit 468f6eafa6c44cb2c5d8aad35e12f06c240a812a ]

32-bit ALU ops operate on 32-bit values and have 32-bit outputs.
Adjust the verifier accordingly.

Fixes: f1174f77b50c ("bpf/verifier: rework value tracking")
Signed-off-by: Jann Horn <jannh@google.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 kernel/bpf/verifier.c |   28 +++++++++++++++++-----------
 1 file changed, 17 insertions(+), 11 deletions(-)

--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -1984,6 +1984,10 @@ static int adjust_ptr_min_max_vals(struc
 	return 0;
 }
 
+/* WARNING: This function does calculations on 64-bit values, but the actual
+ * execution may occur on 32-bit values. Therefore, things like bitshifts
+ * need extra checks in the 32-bit case.
+ */
 static int adjust_scalar_min_max_vals(struct bpf_verifier_env *env,
 				      struct bpf_insn *insn,
 				      struct bpf_reg_state *dst_reg,
@@ -1994,12 +1998,8 @@ static int adjust_scalar_min_max_vals(st
 	bool src_known, dst_known;
 	s64 smin_val, smax_val;
 	u64 umin_val, umax_val;
+	u64 insn_bitness = (BPF_CLASS(insn->code) == BPF_ALU64) ? 64 : 32;
 
-	if (BPF_CLASS(insn->code) != BPF_ALU64) {
-		/* 32-bit ALU ops are (32,32)->64 */
-		coerce_reg_to_size(dst_reg, 4);
-		coerce_reg_to_size(&src_reg, 4);
-	}
 	smin_val = src_reg.smin_value;
 	smax_val = src_reg.smax_value;
 	umin_val = src_reg.umin_value;
@@ -2135,9 +2135,9 @@ static int adjust_scalar_min_max_vals(st
 		__update_reg_bounds(dst_reg);
 		break;
 	case BPF_LSH:
-		if (umax_val > 63) {
-			/* Shifts greater than 63 are undefined.  This includes
-			 * shifts by a negative number.
+		if (umax_val >= insn_bitness) {
+			/* Shifts greater than 31 or 63 are undefined.
+			 * This includes shifts by a negative number.
 			 */
 			mark_reg_unknown(regs, insn->dst_reg);
 			break;
@@ -2163,9 +2163,9 @@ static int adjust_scalar_min_max_vals(st
 		__update_reg_bounds(dst_reg);
 		break;
 	case BPF_RSH:
-		if (umax_val > 63) {
-			/* Shifts greater than 63 are undefined.  This includes
-			 * shifts by a negative number.
+		if (umax_val >= insn_bitness) {
+			/* Shifts greater than 31 or 63 are undefined.
+			 * This includes shifts by a negative number.
 			 */
 			mark_reg_unknown(regs, insn->dst_reg);
 			break;
@@ -2201,6 +2201,12 @@ static int adjust_scalar_min_max_vals(st
 		break;
 	}
 
+	if (BPF_CLASS(insn->code) != BPF_ALU64) {
+		/* 32-bit ALU ops are (32,32)->32 */
+		coerce_reg_to_size(dst_reg, 4);
+		coerce_reg_to_size(&src_reg, 4);
+	}
+
 	__reg_deduce_bounds(dst_reg);
 	__reg_bound_offset(dst_reg);
 	return 0;


Patches currently in stable-queue which might be from daniel@iogearbox.net are

queue-4.14/bpf-fix-integer-overflows.patch
queue-4.14/bpf-fix-branch-pruning-logic.patch
queue-4.14/bpf-s390x-do-not-reload-skb-pointers-in-non-skb-context.patch
queue-4.14/bpf-sparc-fix-usage-of-wrong-reg-for-load_skb_regs-after-call.patch
queue-4.14/bpf-fix-incorrect-tracking-of-register-size-truncation.patch
queue-4.14/bpf-don-t-prune-branches-when-a-scalar-is-replaced-with-a-pointer.patch
queue-4.14/bpf-verifier-fix-bounds-calculation-on-bpf_rsh.patch
queue-4.14/selftests-bpf-add-tests-for-recent-bugfixes.patch
queue-4.14/bpf-fix-corruption-on-concurrent-perf_event_output-calls.patch
queue-4.14/bpf-fix-incorrect-sign-extension-in-check_alu_op.patch
queue-4.14/bpf-ppc64-do-not-reload-skb-pointers-in-non-skb-context.patch
queue-4.14/bpf-fix-missing-error-return-in-check_stack_boundary.patch
queue-4.14/bpf-force-strict-alignment-checks-for-stack-pointers.patch
queue-4.14/bpf-fix-32-bit-alu-op-verification.patch
queue-4.14/bpf-fix-build-issues-on-um-due-to-mising-bpf_perf_event.h.patch

  reply	other threads:[~2017-12-22 15:47 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-22 15:22 [PATCH stable/4.14 00/14] BPF stable patches for 4.14 Daniel Borkmann
2017-12-22 15:22 ` [PATCH stable/4.14 01/14] bpf: fix branch pruning logic Daniel Borkmann
2017-12-22 15:47   ` Patch "[PATCH stable/4.14 01/14] bpf: fix branch pruning logic" has been added to the 4.14-stable tree gregkh
2017-12-22 15:23 ` [PATCH stable/4.14 02/14] bpf: fix corruption on concurrent perf_event_output calls Daniel Borkmann
2017-12-22 15:47   ` Patch "[PATCH stable/4.14 02/14] bpf: fix corruption on concurrent perf_event_output calls" has been added to the 4.14-stable tree gregkh
2017-12-22 15:23 ` [PATCH stable/4.14 03/14] bpf, s390x: do not reload skb pointers in non-skb context Daniel Borkmann
2017-12-22 15:47   ` Patch "[PATCH stable/4.14 03/14] bpf, s390x: do not reload skb pointers in non-skb context" has been added to the 4.14-stable tree gregkh
2017-12-22 15:23 ` [PATCH stable/4.14 04/14] bpf, ppc64: do not reload skb pointers in non-skb context Daniel Borkmann
2017-12-22 15:47   ` Patch "[PATCH stable/4.14 04/14] bpf, ppc64: do not reload skb pointers in non-skb context" has been added to the 4.14-stable tree gregkh
2017-12-22 15:23 ` [PATCH stable/4.14 05/14] bpf, sparc: fix usage of wrong reg for load_skb_regs after call Daniel Borkmann
2017-12-22 15:47   ` Patch "[PATCH stable/4.14 05/14] bpf, sparc: fix usage of wrong reg for load_skb_regs after call" has been added to the 4.14-stable tree gregkh
2017-12-22 15:23 ` [PATCH stable/4.14 06/14] bpf/verifier: fix bounds calculation on BPF_RSH Daniel Borkmann
2017-12-22 15:47   ` Patch "[PATCH stable/4.14 06/14] bpf/verifier: fix bounds calculation on BPF_RSH" has been added to the 4.14-stable tree gregkh
2017-12-22 15:23 ` [PATCH stable/4.14 07/14] bpf: fix incorrect sign extension in check_alu_op() Daniel Borkmann
2017-12-22 15:47   ` Patch "[PATCH stable/4.14 07/14] bpf: fix incorrect sign extension in check_alu_op()" has been added to the 4.14-stable tree gregkh
2017-12-22 15:23 ` [PATCH stable/4.14 08/14] bpf: fix incorrect tracking of register size truncation Daniel Borkmann
2017-12-22 15:47   ` Patch "[PATCH stable/4.14 08/14] bpf: fix incorrect tracking of register size truncation" has been added to the 4.14-stable tree gregkh
2017-12-22 15:23 ` [PATCH stable/4.14 09/14] bpf: fix 32-bit ALU op verification Daniel Borkmann
2017-12-22 15:47   ` gregkh [this message]
2017-12-22 15:23 ` [PATCH stable/4.14 10/14] bpf: fix missing error return in check_stack_boundary() Daniel Borkmann
2017-12-22 15:47   ` Patch "[PATCH stable/4.14 10/14] bpf: fix missing error return in check_stack_boundary()" has been added to the 4.14-stable tree gregkh
2017-12-22 15:23 ` [PATCH stable/4.14 11/14] bpf: force strict alignment checks for stack pointers Daniel Borkmann
2017-12-22 15:47   ` Patch "[PATCH stable/4.14 11/14] bpf: force strict alignment checks for stack pointers" has been added to the 4.14-stable tree gregkh
2017-12-22 15:23 ` [PATCH stable/4.14 12/14] bpf: don't prune branches when a scalar is replaced with a pointer Daniel Borkmann
2017-12-22 15:47   ` Patch "[PATCH stable/4.14 12/14] bpf: don't prune branches when a scalar is replaced with a pointer" has been added to the 4.14-stable tree gregkh
2017-12-22 15:23 ` [PATCH stable/4.14 13/14] bpf: fix integer overflows Daniel Borkmann
2017-12-22 15:47   ` Patch "[PATCH stable/4.14 13/14] bpf: fix integer overflows" has been added to the 4.14-stable tree gregkh
2017-12-22 15:23 ` [PATCH stable/4.14 14/14] selftests/bpf: add tests for recent bugfixes Daniel Borkmann
2017-12-22 15:47   ` Patch "[PATCH stable/4.14 14/14] selftests/bpf: add tests for recent bugfixes" has been added to the 4.14-stable tree gregkh
2017-12-22 15:45 ` [PATCH stable/4.14 00/14] BPF stable patches for 4.14 Greg KH
2017-12-22 15:48   ` Greg KH
2017-12-22 15:51 ` Greg KH

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=151395765783172@kroah.com \
    --to=gregkh@linuxfoundation.org \
    --cc=ast@kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=jannh@google.com \
    --cc=stable-commits@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.