From: Rick Edgecombe <rick.p.edgecombe@intel.com> To: Andy Lutomirski <luto@kernel.org>, Ingo Molnar <mingo@redhat.com> Cc: linux-kernel@vger.kernel.org, x86@kernel.org, hpa@zytor.com, Thomas Gleixner <tglx@linutronix.de>, Borislav Petkov <bp@alien8.de>, Nadav Amit <nadav.amit@gmail.com>, Dave Hansen <dave.hansen@linux.intel.com>, Peter Zijlstra <peterz@infradead.org>, linux_dti@icloud.com, linux-integrity@vger.kernel.org, linux-security-module@vger.kernel.org, akpm@linux-foundation.org, kernel-hardening@lists.openwall.com, linux-mm@kvack.org, will.deacon@arm.com, ard.biesheuvel@linaro.org, kristen@linux.intel.com, deneen.t.dock@intel.com, Nadav Amit <namit@vmware.com>, Kees Cook <keescook@chromium.org>, Dave Hansen <dave.hansen@intel.com>, Masami Hiramatsu <mhiramat@kernel.org>, Rick Edgecombe <rick.p.edgecombe@intel.com> Subject: [PATCH v2 01/20] Fix "x86/alternatives: Lockdep-enforce text_mutex in text_poke*()" Date: Mon, 28 Jan 2019 16:34:03 -0800 Message-ID: <20190129003422.9328-2-rick.p.edgecombe@intel.com> (raw) In-Reply-To: <20190129003422.9328-1-rick.p.edgecombe@intel.com> From: Nadav Amit <namit@vmware.com> text_mutex is currently expected to be held before text_poke() is called, but we kgdb does not take the mutex, and instead *supposedly* ensures the lock is not taken and will not be acquired by any other core while text_poke() is running. The reason for the "supposedly" comment is that it is not entirely clear that this would be the case if kgdb_do_roundup is zero. Create two wrapper functions, text_poke() and text_poke_kgdb() which do or do not run the lockdep assertion respectively. While we are at it, change the return code of text_poke() to something meaningful. One day, callers might actually respect it and the existing BUG_ON() when patching fails could be removed. For kgdb, the return value can actually be used. Cc: Andy Lutomirski <luto@kernel.org> Cc: Kees Cook <keescook@chromium.org> Cc: Dave Hansen <dave.hansen@intel.com> Cc: Masami Hiramatsu <mhiramat@kernel.org> Fixes: 9222f606506c ("x86/alternatives: Lockdep-enforce text_mutex in text_poke*()") Suggested-by: Peter Zijlstra <peterz@infradead.org> Acked-by: Jiri Kosina <jkosina@suse.cz> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Masami Hiramatsu <mhiramat@kernel.org> Signed-off-by: Nadav Amit <namit@vmware.com> Signed-off-by: Rick Edgecombe <rick.p.edgecombe@intel.com> --- arch/x86/include/asm/text-patching.h | 1 + arch/x86/kernel/alternative.c | 52 ++++++++++++++++++++-------- arch/x86/kernel/kgdb.c | 11 +++--- 3 files changed, 45 insertions(+), 19 deletions(-) diff --git a/arch/x86/include/asm/text-patching.h b/arch/x86/include/asm/text-patching.h index e85ff65c43c3..f8fc8e86cf01 100644 --- a/arch/x86/include/asm/text-patching.h +++ b/arch/x86/include/asm/text-patching.h @@ -35,6 +35,7 @@ extern void *text_poke_early(void *addr, const void *opcode, size_t len); * inconsistent instruction while you patch. */ extern void *text_poke(void *addr, const void *opcode, size_t len); +extern void *text_poke_kgdb(void *addr, const void *opcode, size_t len); extern int poke_int3_handler(struct pt_regs *regs); extern void *text_poke_bp(void *addr, const void *opcode, size_t len, void *handler); extern int after_bootmem; diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c index d458c7973c56..12fddbc8c55b 100644 --- a/arch/x86/kernel/alternative.c +++ b/arch/x86/kernel/alternative.c @@ -678,18 +678,7 @@ void *__init_or_module text_poke_early(void *addr, const void *opcode, return addr; } -/** - * text_poke - Update instructions on a live kernel - * @addr: address to modify - * @opcode: source of the copy - * @len: length to copy - * - * Only atomic text poke/set should be allowed when not doing early patching. - * It means the size must be writable atomically and the address must be aligned - * in a way that permits an atomic write. It also makes sure we fit on a single - * page. - */ -void *text_poke(void *addr, const void *opcode, size_t len) +static void *__text_poke(void *addr, const void *opcode, size_t len) { unsigned long flags; char *vaddr; @@ -702,8 +691,6 @@ void *text_poke(void *addr, const void *opcode, size_t len) */ BUG_ON(!after_bootmem); - lockdep_assert_held(&text_mutex); - if (!core_kernel_text((unsigned long)addr)) { pages[0] = vmalloc_to_page(addr); pages[1] = vmalloc_to_page(addr + PAGE_SIZE); @@ -732,6 +719,43 @@ void *text_poke(void *addr, const void *opcode, size_t len) return addr; } +/** + * text_poke - Update instructions on a live kernel + * @addr: address to modify + * @opcode: source of the copy + * @len: length to copy + * + * Only atomic text poke/set should be allowed when not doing early patching. + * It means the size must be writable atomically and the address must be aligned + * in a way that permits an atomic write. It also makes sure we fit on a single + * page. + */ +void *text_poke(void *addr, const void *opcode, size_t len) +{ + lockdep_assert_held(&text_mutex); + + return __text_poke(addr, opcode, len); +} + +/** + * text_poke_kgdb - Update instructions on a live kernel by kgdb + * @addr: address to modify + * @opcode: source of the copy + * @len: length to copy + * + * Only atomic text poke/set should be allowed when not doing early patching. + * It means the size must be writable atomically and the address must be aligned + * in a way that permits an atomic write. It also makes sure we fit on a single + * page. + * + * Context: should only be used by kgdb, which ensures no other core is running, + * despite the fact it does not hold the text_mutex. + */ +void *text_poke_kgdb(void *addr, const void *opcode, size_t len) +{ + return __text_poke(addr, opcode, len); +} + static void do_sync_core(void *info) { sync_core(); diff --git a/arch/x86/kernel/kgdb.c b/arch/x86/kernel/kgdb.c index 5db08425063e..1461544cba8b 100644 --- a/arch/x86/kernel/kgdb.c +++ b/arch/x86/kernel/kgdb.c @@ -758,13 +758,13 @@ int kgdb_arch_set_breakpoint(struct kgdb_bkpt *bpt) if (!err) return err; /* - * It is safe to call text_poke() because normal kernel execution + * It is safe to call text_poke_kgdb() because normal kernel execution * is stopped on all cores, so long as the text_mutex is not locked. */ if (mutex_is_locked(&text_mutex)) return -EBUSY; - text_poke((void *)bpt->bpt_addr, arch_kgdb_ops.gdb_bpt_instr, - BREAK_INSTR_SIZE); + text_poke_kgdb((void *)bpt->bpt_addr, arch_kgdb_ops.gdb_bpt_instr, + BREAK_INSTR_SIZE); err = probe_kernel_read(opc, (char *)bpt->bpt_addr, BREAK_INSTR_SIZE); if (err) return err; @@ -783,12 +783,13 @@ int kgdb_arch_remove_breakpoint(struct kgdb_bkpt *bpt) if (bpt->type != BP_POKE_BREAKPOINT) goto knl_write; /* - * It is safe to call text_poke() because normal kernel execution + * It is safe to call text_poke_kgdb() because normal kernel execution * is stopped on all cores, so long as the text_mutex is not locked. */ if (mutex_is_locked(&text_mutex)) goto knl_write; - text_poke((void *)bpt->bpt_addr, bpt->saved_instr, BREAK_INSTR_SIZE); + text_poke_kgdb((void *)bpt->bpt_addr, bpt->saved_instr, + BREAK_INSTR_SIZE); err = probe_kernel_read(opc, (char *)bpt->bpt_addr, BREAK_INSTR_SIZE); if (err || memcmp(opc, bpt->saved_instr, BREAK_INSTR_SIZE)) goto knl_write; -- 2.17.1
next prev parent reply index Thread overview: 71+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-01-29 0:34 [PATCH v2 00/20] Merge text_poke fixes and executable lockdowns Rick Edgecombe 2019-01-29 0:34 ` Rick Edgecombe [this message] 2019-01-29 0:34 ` [PATCH v2 02/20] x86/jump_label: Use text_poke_early() during early init Rick Edgecombe 2019-01-29 0:34 ` [PATCH v2 03/20] x86/mm: temporary mm struct Rick Edgecombe 2019-01-31 11:29 ` Borislav Petkov 2019-01-31 22:19 ` Nadav Amit 2019-02-01 0:08 ` Borislav Petkov 2019-02-01 0:25 ` Nadav Amit 2019-02-04 14:28 ` Borislav Petkov 2019-01-29 0:34 ` [PATCH v2 04/20] fork: provide a function for copying init_mm Rick Edgecombe 2019-02-05 8:53 ` Borislav Petkov 2019-02-05 9:03 ` Nadav Amit 2019-01-29 0:34 ` [PATCH v2 05/20] x86/alternative: initializing temporary mm for patching Rick Edgecombe 2019-02-05 9:18 ` Borislav Petkov 2019-02-11 0:39 ` Nadav Amit 2019-02-11 5:18 ` Andy Lutomirski 2019-02-11 18:04 ` Nadav Amit 2019-02-11 19:07 ` Andy Lutomirski 2019-02-11 19:18 ` Nadav Amit 2019-02-11 22:47 ` Andy Lutomirski 2019-02-12 18:23 ` Nadav Amit 2019-01-29 0:34 ` [PATCH v2 06/20] x86/alternative: use temporary mm for text poking Rick Edgecombe 2019-02-05 9:58 ` Borislav Petkov 2019-02-05 11:31 ` Peter Zijlstra 2019-02-05 12:35 ` Borislav Petkov 2019-02-05 13:25 ` Peter Zijlstra 2019-02-05 17:54 ` Nadav Amit 2019-02-05 13:29 ` Peter Zijlstra 2019-01-29 0:34 ` [PATCH v2 07/20] x86/kgdb: avoid redundant comparison of patched code Rick Edgecombe 2019-01-29 0:34 ` [PATCH v2 08/20] x86/ftrace: set trampoline pages as executable Rick Edgecombe 2019-01-29 0:34 ` [PATCH v2 09/20] x86/kprobes: instruction pages initialization enhancements Rick Edgecombe 2019-02-11 18:22 ` Borislav Petkov 2019-02-11 19:36 ` Nadav Amit 2019-01-29 0:34 ` [PATCH v2 10/20] x86: avoid W^X being broken during modules loading Rick Edgecombe 2019-02-11 18:29 ` Borislav Petkov 2019-02-11 18:45 ` Nadav Amit 2019-02-11 19:01 ` Borislav Petkov 2019-02-11 19:09 ` Nadav Amit 2019-02-11 19:10 ` Borislav Petkov 2019-02-11 19:27 ` Nadav Amit 2019-02-11 19:42 ` Borislav Petkov 2019-02-11 20:32 ` Nadav Amit 2019-03-07 15:10 ` [PATCH] x86/cpufeature: Remove __pure attribute to _static_cpu_has() Borislav Petkov 2019-03-07 16:43 ` hpa 2019-03-07 17:02 ` Borislav Petkov 2019-03-07 7:29 ` [PATCH v2 10/20] x86: avoid W^X being broken during modules loading Borislav Petkov 2019-03-07 16:53 ` hpa 2019-03-07 17:06 ` Borislav Petkov 2019-03-07 20:02 ` Andy Lutomirski 2019-03-07 20:25 ` Borislav Petkov 2019-01-29 0:34 ` [PATCH v2 11/20] x86/jump-label: remove support for custom poker Rick Edgecombe 2019-02-11 18:37 ` Borislav Petkov 2019-01-29 0:34 ` [PATCH v2 12/20] x86/alternative: Remove the return value of text_poke_*() Rick Edgecombe 2019-01-29 0:34 ` [PATCH v2 13/20] Add set_alias_ function and x86 implementation Rick Edgecombe 2019-02-11 19:09 ` Borislav Petkov 2019-02-11 19:27 ` Edgecombe, Rick P 2019-02-11 22:59 ` Andy Lutomirski 2019-02-12 0:01 ` Edgecombe, Rick P 2019-01-29 0:34 ` [PATCH v2 14/20] mm: Make hibernate handle unmapped pages Rick Edgecombe 2019-02-19 11:04 ` Borislav Petkov 2019-02-19 21:28 ` Edgecombe, Rick P 2019-02-20 16:07 ` Borislav Petkov 2019-01-29 0:34 ` [PATCH v2 15/20] vmalloc: New flags for safe vfree on special perms Rick Edgecombe 2019-02-19 12:48 ` Borislav Petkov 2019-02-19 19:42 ` Edgecombe, Rick P 2019-02-20 16:14 ` Borislav Petkov 2019-01-29 0:34 ` [PATCH v2 16/20] modules: Use vmalloc special flag Rick Edgecombe 2019-01-29 0:34 ` [PATCH v2 17/20] bpf: " Rick Edgecombe 2019-01-29 0:34 ` [PATCH v2 18/20] x86/ftrace: " Rick Edgecombe 2019-01-29 0:34 ` [PATCH v2 19/20] x86/kprobes: " Rick Edgecombe 2019-01-29 0:34 ` [PATCH v2 20/20] x86/alternative: comment about module removal races Rick Edgecombe
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=20190129003422.9328-2-rick.p.edgecombe@intel.com \ --to=rick.p.edgecombe@intel.com \ --cc=akpm@linux-foundation.org \ --cc=ard.biesheuvel@linaro.org \ --cc=bp@alien8.de \ --cc=dave.hansen@intel.com \ --cc=dave.hansen@linux.intel.com \ --cc=deneen.t.dock@intel.com \ --cc=hpa@zytor.com \ --cc=keescook@chromium.org \ --cc=kernel-hardening@lists.openwall.com \ --cc=kristen@linux.intel.com \ --cc=linux-integrity@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=linux-security-module@vger.kernel.org \ --cc=linux_dti@icloud.com \ --cc=luto@kernel.org \ --cc=mhiramat@kernel.org \ --cc=mingo@redhat.com \ --cc=nadav.amit@gmail.com \ --cc=namit@vmware.com \ --cc=peterz@infradead.org \ --cc=tglx@linutronix.de \ --cc=will.deacon@arm.com \ --cc=x86@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
Linux-Integrity Archive on lore.kernel.org Archives are clonable: git clone --mirror https://lore.kernel.org/linux-integrity/0 linux-integrity/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 linux-integrity linux-integrity/ https://lore.kernel.org/linux-integrity \ linux-integrity@vger.kernel.org public-inbox-index linux-integrity Example config snippet for mirrors Newsgroup available over NNTP: nntp://nntp.lore.kernel.org/org.kernel.vger.linux-integrity AGPL code for this site: git clone https://public-inbox.org/public-inbox.git