| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
- From: Borislav Petkov <[email protected]>
- Date: Wed, 10 Jan 2018 12:28:16 +0100
- Subject: [PATCH] x86/alternatives: Fix optimize_nops() checking
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- CVE-2017-5754
- The alternatives code checks only the first byte whether it is a NOP, but
- with NOPs in front of the payload and having actual instructions after it
- breaks the "optimized' test.
- Make sure to scan all bytes before deciding to optimize the NOPs in there.
- Reported-by: David Woodhouse <[email protected]>
- Signed-off-by: Borislav Petkov <[email protected]>
- Signed-off-by: Thomas Gleixner <[email protected]>
- Cc: Tom Lendacky <[email protected]>
- Cc: Andi Kleen <[email protected]>
- Cc: Tim Chen <[email protected]>
- Cc: Peter Zijlstra <[email protected]>
- Cc: Jiri Kosina <[email protected]>
- Cc: Dave Hansen <[email protected]>
- Cc: Andi Kleen <[email protected]>
- Cc: Andrew Lutomirski <[email protected]>
- Cc: Linus Torvalds <[email protected]>
- Cc: Greg Kroah-Hartman <[email protected]>
- Cc: Paul Turner <[email protected]>
- Link: https://lkml.kernel.org/r/[email protected]
- (cherry picked from commit 612e8e9350fd19cae6900cf36ea0c6892d1a0dca)
- Signed-off-by: Andy Whitcroft <[email protected]>
- Signed-off-by: Kleber Sacilotto de Souza <[email protected]>
- (cherry picked from commit dc241f68557ee1929a92b9ec6f7a1294bbbd4f00)
- Signed-off-by: Fabian Grünbichler <[email protected]>
- ---
- arch/x86/kernel/alternative.c | 7 +++++--
- 1 file changed, 5 insertions(+), 2 deletions(-)
- diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c
- index 32e14d137416..5dc05755a044 100644
- --- a/arch/x86/kernel/alternative.c
- +++ b/arch/x86/kernel/alternative.c
- @@ -344,9 +344,12 @@ recompute_jump(struct alt_instr *a, u8 *orig_insn, u8 *repl_insn, u8 *insnbuf)
- static void __init_or_module noinline optimize_nops(struct alt_instr *a, u8 *instr)
- {
- unsigned long flags;
- + int i;
-
- - if (instr[0] != 0x90)
- - return;
- + for (i = 0; i < a->padlen; i++) {
- + if (instr[i] != 0x90)
- + return;
- + }
-
- local_irq_save(flags);
- add_nops(instr + (a->instrlen - a->padlen), a->padlen);
- --
- 2.14.2
|