* [PATCH stable 4.14,4.18] bpf: 32-bit RSH verification must truncate input before the ALU op
@ 2018-10-08 8:59 Daniel Borkmann
2018-10-08 13:27 ` Greg KH
0 siblings, 1 reply; 2+ messages in thread
From: Daniel Borkmann @ 2018-10-08 8:59 UTC (permalink / raw)
To: gregkh; +Cc: ast, jannh, stable, Daniel Borkmann
From: Jann Horn <jannh@google.com>
[ upstream commit b799207e1e1816b09e7a5920fbb2d5fcf6edd681 ]
When I wrote commit 468f6eafa6c4 ("bpf: fix 32-bit ALU op verification"), I
assumed that, in order to emulate 64-bit arithmetic with 32-bit logic, it
is sufficient to just truncate the output to 32 bits; and so I just moved
the register size coercion that used to be at the start of the function to
the end of the function.
That assumption is true for almost every op, but not for 32-bit right
shifts, because those can propagate information towards the least
significant bit. Fix it by always truncating inputs for 32-bit ops to 32
bits.
Also get rid of the coerce_reg_to_size() after the ALU op, since that has
no effect.
Fixes: 468f6eafa6c4 ("bpf: fix 32-bit ALU op verification")
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: Jann Horn <jannh@google.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
---
kernel/bpf/verifier.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index adbe21c..82e8ede 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -2865,6 +2865,15 @@ static int adjust_scalar_min_max_vals(struct bpf_verifier_env *env,
u64 umin_val, umax_val;
u64 insn_bitness = (BPF_CLASS(insn->code) == BPF_ALU64) ? 64 : 32;
+ if (insn_bitness == 32) {
+ /* Relevant for 32-bit RSH: Information can propagate towards
+ * LSB, so it isn't sufficient to only truncate the output to
+ * 32 bits.
+ */
+ 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;
@@ -3100,7 +3109,6 @@ static int adjust_scalar_min_max_vals(struct bpf_verifier_env *env,
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);
--
2.9.5
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH stable 4.14,4.18] bpf: 32-bit RSH verification must truncate input before the ALU op
2018-10-08 8:59 [PATCH stable 4.14,4.18] bpf: 32-bit RSH verification must truncate input before the ALU op Daniel Borkmann
@ 2018-10-08 13:27 ` Greg KH
0 siblings, 0 replies; 2+ messages in thread
From: Greg KH @ 2018-10-08 13:27 UTC (permalink / raw)
To: Daniel Borkmann; +Cc: ast, jannh, stable
On Mon, Oct 08, 2018 at 10:59:33AM +0200, Daniel Borkmann wrote:
> From: Jann Horn <jannh@google.com>
>
> [ upstream commit b799207e1e1816b09e7a5920fbb2d5fcf6edd681 ]
>
> When I wrote commit 468f6eafa6c4 ("bpf: fix 32-bit ALU op verification"), I
> assumed that, in order to emulate 64-bit arithmetic with 32-bit logic, it
> is sufficient to just truncate the output to 32 bits; and so I just moved
> the register size coercion that used to be at the start of the function to
> the end of the function.
>
> That assumption is true for almost every op, but not for 32-bit right
> shifts, because those can propagate information towards the least
> significant bit. Fix it by always truncating inputs for 32-bit ops to 32
> bits.
>
> Also get rid of the coerce_reg_to_size() after the ALU op, since that has
> no effect.
Applied, thanks.
greg k-h
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2018-10-08 21:13 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-10-08 8:59 [PATCH stable 4.14,4.18] bpf: 32-bit RSH verification must truncate input before the ALU op Daniel Borkmann
2018-10-08 13:27 ` Greg KH
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.