All of lore.kernel.org
 help / color / mirror / Atom feed
From: tip-bot for Masami Hiramatsu <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: mhiramat@kernel.org, davem@davemloft.net,
	torvalds@linux-foundation.org, brgerst@gmail.com,
	mingo@kernel.org, hpa@zytor.com, anil.s.keshavamurthy@intel.com,
	ananth@linux.vnet.ibm.com, jpoimboe@redhat.com,
	linux-kernel@vger.kernel.org, peterz@infradead.org,
	aryabinin@virtuozzo.com, xiaolong.ye@intel.com,
	dvlasenk@redhat.com, tglx@linutronix.de, bp@alien8.de
Subject: [tip:perf/core] kprobes/x86: Use probe_kernel_read() instead of memcpy()
Date: Wed, 12 Apr 2017 00:35:06 -0700	[thread overview]
Message-ID: <tip-ea1e34fc366b84e4449b37d86f2222935e29412d@git.kernel.org> (raw)
In-Reply-To: <149076382624.22469.10091613887942958518.stgit@devbox>

Commit-ID:  ea1e34fc366b84e4449b37d86f2222935e29412d
Gitweb:     http://git.kernel.org/tip/ea1e34fc366b84e4449b37d86f2222935e29412d
Author:     Masami Hiramatsu <mhiramat@kernel.org>
AuthorDate: Wed, 29 Mar 2017 14:03:56 +0900
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Wed, 12 Apr 2017 09:23:47 +0200

kprobes/x86: Use probe_kernel_read() instead of memcpy()

Use probe_kernel_read() for avoiding unexpected faults while
copying kernel text in __recover_probed_insn(),
__recover_optprobed_insn() and __copy_instruction().

Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
Cc: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: David S . Miller <davem@davemloft.net>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ye Xiaolong <xiaolong.ye@intel.com>
Link: http://lkml.kernel.org/r/149076382624.22469.10091613887942958518.stgit@devbox
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 arch/x86/kernel/kprobes/core.c | 12 +++++++++---
 arch/x86/kernel/kprobes/opt.c  |  5 ++++-
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c
index 0dc24e6..722f544 100644
--- a/arch/x86/kernel/kprobes/core.c
+++ b/arch/x86/kernel/kprobes/core.c
@@ -259,7 +259,10 @@ __recover_probed_insn(kprobe_opcode_t *buf, unsigned long addr)
 	 * Fortunately, we know that the original code is the ideal 5-byte
 	 * long NOP.
 	 */
-	memcpy(buf, (void *)addr, MAX_INSN_SIZE * sizeof(kprobe_opcode_t));
+	if (probe_kernel_read(buf, (void *)addr,
+		MAX_INSN_SIZE * sizeof(kprobe_opcode_t)))
+		return 0UL;
+
 	if (faddr)
 		memcpy(buf, ideal_nops[NOP_ATOMIC5], 5);
 	else
@@ -271,7 +274,7 @@ __recover_probed_insn(kprobe_opcode_t *buf, unsigned long addr)
  * Recover the probed instruction at addr for further analysis.
  * Caller must lock kprobes by kprobe_mutex, or disable preemption
  * for preventing to release referencing kprobes.
- * Returns zero if the instruction can not get recovered.
+ * Returns zero if the instruction can not get recovered (or access failed).
  */
 unsigned long recover_probed_instruction(kprobe_opcode_t *buf, unsigned long addr)
 {
@@ -365,7 +368,10 @@ int __copy_instruction(u8 *dest, u8 *src)
 	/* Another subsystem puts a breakpoint, failed to recover */
 	if (insn.opcode.bytes[0] == BREAKPOINT_INSTRUCTION)
 		return 0;
-	memcpy(dest, insn.kaddr, length);
+
+	/* This can access kernel text if given address is not recovered */
+	if (kernel_probe_read(dest, insn.kaddr, length))
+		return 0;
 
 #ifdef CONFIG_X86_64
 	/* Only x86_64 has RIP relative instructions */
diff --git a/arch/x86/kernel/kprobes/opt.c b/arch/x86/kernel/kprobes/opt.c
index b121037..5b52334 100644
--- a/arch/x86/kernel/kprobes/opt.c
+++ b/arch/x86/kernel/kprobes/opt.c
@@ -65,7 +65,10 @@ found:
 	 * overwritten by jump destination address. In this case, original
 	 * bytes must be recovered from op->optinsn.copied_insn buffer.
 	 */
-	memcpy(buf, (void *)addr, MAX_INSN_SIZE * sizeof(kprobe_opcode_t));
+	if (probe_kernel_read(buf, (void *)addr,
+		MAX_INSN_SIZE * sizeof(kprobe_opcode_t)))
+		return 0UL;
+
 	if (addr == (unsigned long)kp->addr) {
 		buf[0] = kp->opcode;
 		memcpy(buf + 1, op->optinsn.copied_insn, RELATIVE_ADDR_SIZE);

  reply	other threads:[~2017-04-12  7:41 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-29  4:55 [RFC PATCH tip/master V3 0/8] kprobes/x86: Make kprobes instruction buffers read-only Masami Hiramatsu
2017-03-29  4:56 ` [RFC PATCH tip/master V3 1/8] kprobes/x86: Fix not to boost call far instruction Masami Hiramatsu
2017-04-12  7:32   ` [tip:perf/core] kprobes/x86: Fix kprobe-booster not to boost far call instructions tip-bot for Masami Hiramatsu
2017-03-29  4:58 ` [RFC PATCH tip/master V3 2/8] kprobes/x86: Fix the description of __copy_instruction() Masami Hiramatsu
2017-04-12  7:32   ` [tip:perf/core] " tip-bot for Masami Hiramatsu
2017-03-29  4:59 ` [RFC PATCH tip/master V3 3/8] kprobes/x86: Use instruction decoder for booster Masami Hiramatsu
2017-04-12  7:33   ` [tip:perf/core] " tip-bot for Masami Hiramatsu
2017-03-29  5:00 ` [RFC PATCH tip/master V3 4/8] kprobes/x86: Do not modify singlestep buffer while resuming Masami Hiramatsu
2017-04-12  7:33   ` [tip:perf/core] " tip-bot for Masami Hiramatsu
2017-03-29  5:01 ` [RFC PATCH tip/master V3 5/8] kprobes/x86: Make boostable flag boolean Masami Hiramatsu
2017-04-12  7:34   ` [tip:perf/core] " tip-bot for Masami Hiramatsu
2017-03-29  5:02 ` [RFC PATCH tip/master V3 6/8] kprobes/x86: Set kprobes pages readonly Masami Hiramatsu
2017-04-12  7:34   ` [tip:perf/core] kprobes/x86: Set kprobes pages read-only tip-bot for Masami Hiramatsu
2017-03-29  5:03 ` [RFC PATCH tip/master V3 7/8] kprobes/x86: Use probe_kernel_read instead of memcpy Masami Hiramatsu
2017-04-12  7:35   ` tip-bot for Masami Hiramatsu [this message]
2017-03-29  5:05 ` [RFC PATCH tip/master V3 8/8] kprobes/x86: Consolidate insn decoder users for copying code Masami Hiramatsu
2017-04-12  7:35   ` [tip:perf/core] " tip-bot for Masami Hiramatsu
2017-04-11  5:44 ` [RFC PATCH tip/master V3 0/8] kprobes/x86: Make kprobes instruction buffers read-only Masami Hiramatsu

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=tip-ea1e34fc366b84e4449b37d86f2222935e29412d@git.kernel.org \
    --to=tipbot@zytor.com \
    --cc=ananth@linux.vnet.ibm.com \
    --cc=anil.s.keshavamurthy@intel.com \
    --cc=aryabinin@virtuozzo.com \
    --cc=bp@alien8.de \
    --cc=brgerst@gmail.com \
    --cc=davem@davemloft.net \
    --cc=dvlasenk@redhat.com \
    --cc=hpa@zytor.com \
    --cc=jpoimboe@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --cc=mhiramat@kernel.org \
    --cc=mingo@kernel.org \
    --cc=peterz@infradead.org \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.org \
    --cc=xiaolong.ye@intel.com \
    /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.