All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/7] x86/alternatives: text_poke() fixes
@ 2018-11-02 23:29 Nadav Amit
  2018-11-02 23:29 ` [PATCH v3 1/7] Fix "x86/alternatives: Lockdep-enforce text_mutex in text_poke*()" Nadav Amit
                   ` (6 more replies)
  0 siblings, 7 replies; 30+ messages in thread
From: Nadav Amit @ 2018-11-02 23:29 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: linux-kernel, x86, H. Peter Anvin, Thomas Gleixner,
	Borislav Petkov, Dave Hansen, Nadav Amit, Jiri Kosina,
	Andy Lutomirski, Masami Hiramatsu, Kees Cook, Peter Zijlstra

This patch-set addresses some issues that were raised in a recent
correspondence and might affect the security and the correctness of code
patching. (Note that patching performance is not addressed by this
patch-set).

The main issue that the patches deal with is the fact that the fixmap
PTEs that are used for patching are available for access from other
cores and might be exploited. They are not even flushed from the TLB in
remote cores, so the risk is even higher. Address this issue by
introducing a temporary mm that is only used during patching.
Unfortunately, due to init ordering, fixmap is still used during
boot-time patching. Future patches can eliminate the need for it.

To do so, we need to avoid using text_poke() before the poking-mm is
initialized and instead use text_poke_early().

The second issue is the lockdep assertion that ensures the text_mutex is
taken. It is actually not taken by kgdb. I did not find an easy
solution, as mutex_trylock() should not be called from an IRQ context.
Instead, remove the assertion.

Finally, try to be more conservative and to map a single page, instead
of two, when possible. This helps both security and performance.

In addition, there is some cleanup of the patching code to make it more
readable.

v2->v3:
- Remove the fallback path in text_poke() [peterZ]
- poking_init() was broken due to the local variable poking_addr
- Preallocate tables for the temporary-mm to avoid sleep-in-atomic
- Prevent KASAN from yelling at text_poke()

v1->v2:
- Partial revert of 9222f606506c added to 1/6 [masami]
- Added Masami's reviewed-by tag

RFC->v1:
- Added handling of error in get_locked_pte()
- Remove lockdep assertion, clarify text_mutex use instead [masami]
- Comment fix [peterz]
- Removed remainders of text_poke return value [masami]
- Use __weak for poking_init instead of macros [masami]
- Simplify error handling in poking_init [masami]

Cc: Jiri Kosina <jkosina@suse.cz>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Kees Cook <keescook@chromium.org>
Cc: Peter Zijlstra <peterz@infradead.org>

Andy Lutomirski (1):
  x86/mm: temporary mm struct

Nadav Amit (6):
  Fix "x86/alternatives: Lockdep-enforce text_mutex in text_poke*()"
  x86/jump_label: Use text_poke_early() during early_init
  fork: provide a function for copying init_mm
  x86/alternatives: initializing temporary mm for patching
  x86/alternatives: use temporary mm for text poking
  x86/alternatives: remove text_poke() return value

 arch/x86/include/asm/fixmap.h        |   2 -
 arch/x86/include/asm/mmu_context.h   |  20 +++++
 arch/x86/include/asm/pgtable.h       |   3 +
 arch/x86/include/asm/text-patching.h |   4 +-
 arch/x86/kernel/alternative.c        | 125 +++++++++++++++++++++------
 arch/x86/kernel/jump_label.c         |   8 +-
 arch/x86/mm/init_64.c                |  39 +++++++++
 include/linux/kernel.h               |   1 +
 include/linux/sched/task.h           |   1 +
 init/main.c                          |   7 ++
 kernel/fork.c                        |  24 +++--
 11 files changed, 199 insertions(+), 35 deletions(-)

-- 
2.17.1


^ permalink raw reply	[flat|nested] 30+ messages in thread

end of thread, other threads:[~2018-11-08 11:06 UTC | newest]

Thread overview: 30+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-11-02 23:29 [PATCH v3 0/7] x86/alternatives: text_poke() fixes Nadav Amit
2018-11-02 23:29 ` [PATCH v3 1/7] Fix "x86/alternatives: Lockdep-enforce text_mutex in text_poke*()" Nadav Amit
2018-11-03 10:11   ` Jiri Kosina
2018-11-04 20:58   ` Thomas Gleixner
2018-11-05 18:14     ` Nadav Amit
2018-11-02 23:29 ` [PATCH v3 2/7] x86/jump_label: Use text_poke_early() during early_init Nadav Amit
2018-11-05 12:39   ` Peter Zijlstra
2018-11-05 13:33     ` Peter Zijlstra
2018-11-05 14:09   ` Peter Zijlstra
2018-11-05 17:22     ` Andy Lutomirski
2018-11-05 17:49       ` Nadav Amit
2018-11-05 19:03         ` Andy Lutomirski
2018-11-05 19:25           ` Nadav Amit
2018-11-05 20:05             ` Andy Lutomirski
2018-11-05 20:28               ` Thomas Gleixner
2018-11-05 21:31                 ` Nadav Amit
2018-11-07 19:13     ` Nadav Amit
2018-11-08 10:41       ` Peter Zijlstra
2018-11-02 23:29 ` [PATCH v3 3/7] x86/mm: temporary mm struct Nadav Amit
2018-11-02 23:29 ` [PATCH v3 4/7] fork: provide a function for copying init_mm Nadav Amit
2018-11-02 23:29 ` [PATCH v3 5/7] x86/alternatives: initializing temporary mm for patching Nadav Amit
2018-11-02 23:29 ` [PATCH v3 6/7] x86/alternatives: use temporary mm for text poking Nadav Amit
2018-11-05 13:19   ` Peter Zijlstra
2018-11-05 13:30   ` Peter Zijlstra
2018-11-05 18:04     ` Nadav Amit
2018-11-06  8:20       ` Peter Zijlstra
2018-11-06 13:11         ` Peter Zijlstra
2018-11-06 18:11           ` Nadav Amit
2018-11-06 19:08             ` Peter Zijlstra
2018-11-02 23:29 ` [PATCH v3 7/7] x86/alternatives: remove text_poke() return value Nadav Amit

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.