linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: "Steven Rostedt (VMware)" <rostedt@goodmis.org>,
	Andy Lutomirski <luto@amacapital.net>,
	Joel Fernandes <joel@joelfernandes.org>,
	Borislav Petkov <bp@alien8.de>,
	Josh Poimboeuf <jpoimboe@redhat.com>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Masami Hiramatsu <mhiramat@kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Ingo Molnar <mingo@kernel.org>, Sasha Levin <sashal@kernel.org>
Subject: [PATCH AUTOSEL 4.4 23/77] kprobes, x86/ptrace.h: Make regs_get_kernel_stack_nth() not fault on bad stack
Date: Sat, 16 Nov 2019 10:52:45 -0500	[thread overview]
Message-ID: <20191116155339.11909-23-sashal@kernel.org> (raw)
In-Reply-To: <20191116155339.11909-1-sashal@kernel.org>

From: "Steven Rostedt (VMware)" <rostedt@goodmis.org>

[ Upstream commit c2712b858187f5bcd7b042fe4daa3ba3a12635c0 ]

Andy had some concerns about using regs_get_kernel_stack_nth() in a new
function regs_get_kernel_argument() as if there's any error in the stack
code, it could cause a bad memory access. To be on the safe side, call
probe_kernel_read() on the stack address to be extra careful in accessing
the memory. A helper function, regs_get_kernel_stack_nth_addr(), was added
to just return the stack address (or NULL if not on the stack), that will be
used to find the address (and could be used by other functions) and read the
address with kernel_probe_read().

Requested-by: Andy Lutomirski <luto@amacapital.net>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Reviewed-by: Joel Fernandes (Google) <joel@joelfernandes.org>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/20181017165951.09119177@gandalf.local.home
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 arch/x86/include/asm/ptrace.h | 42 +++++++++++++++++++++++++++++------
 1 file changed, 35 insertions(+), 7 deletions(-)

diff --git a/arch/x86/include/asm/ptrace.h b/arch/x86/include/asm/ptrace.h
index 0d8e0831b1a07..3daec418c822f 100644
--- a/arch/x86/include/asm/ptrace.h
+++ b/arch/x86/include/asm/ptrace.h
@@ -205,24 +205,52 @@ static inline int regs_within_kernel_stack(struct pt_regs *regs,
 		(kernel_stack_pointer(regs) & ~(THREAD_SIZE - 1)));
 }
 
+/**
+ * regs_get_kernel_stack_nth_addr() - get the address of the Nth entry on stack
+ * @regs:	pt_regs which contains kernel stack pointer.
+ * @n:		stack entry number.
+ *
+ * regs_get_kernel_stack_nth() returns the address of the @n th entry of the
+ * kernel stack which is specified by @regs. If the @n th entry is NOT in
+ * the kernel stack, this returns NULL.
+ */
+static inline unsigned long *regs_get_kernel_stack_nth_addr(struct pt_regs *regs, unsigned int n)
+{
+	unsigned long *addr = (unsigned long *)kernel_stack_pointer(regs);
+
+	addr += n;
+	if (regs_within_kernel_stack(regs, (unsigned long)addr))
+		return addr;
+	else
+		return NULL;
+}
+
+/* To avoid include hell, we can't include uaccess.h */
+extern long probe_kernel_read(void *dst, const void *src, size_t size);
+
 /**
  * regs_get_kernel_stack_nth() - get Nth entry of the stack
  * @regs:	pt_regs which contains kernel stack pointer.
  * @n:		stack entry number.
  *
  * regs_get_kernel_stack_nth() returns @n th entry of the kernel stack which
- * is specified by @regs. If the @n th entry is NOT in the kernel stack,
+ * is specified by @regs. If the @n th entry is NOT in the kernel stack
  * this returns 0.
  */
 static inline unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs,
 						      unsigned int n)
 {
-	unsigned long *addr = (unsigned long *)kernel_stack_pointer(regs);
-	addr += n;
-	if (regs_within_kernel_stack(regs, (unsigned long)addr))
-		return *addr;
-	else
-		return 0;
+	unsigned long *addr;
+	unsigned long val;
+	long ret;
+
+	addr = regs_get_kernel_stack_nth_addr(regs, n);
+	if (addr) {
+		ret = probe_kernel_read(&val, addr, sizeof(val));
+		if (!ret)
+			return val;
+	}
+	return 0;
 }
 
 #define arch_has_single_step()	(1)
-- 
2.20.1


  parent reply	other threads:[~2019-11-16 15:59 UTC|newest]

Thread overview: 77+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-16 15:52 [PATCH AUTOSEL 4.4 01/77] ALSA: isight: fix leak of reference to firewire unit in error path of .probe callback Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 02/77] printk: fix integer overflow in setup_log_buf() Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 03/77] gfs2: Fix marking bitmaps non-full Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 04/77] synclink_gt(): fix compat_ioctl() Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 05/77] powerpc: Fix signedness bug in update_flash_db() Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 06/77] powerpc/eeh: Fix use of EEH_PE_KEEP on wrong field Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 07/77] brcmsmac: AP mode: update beacon when TIM changes Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 08/77] spi: sh-msiof: fix deferred probing Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 09/77] mmc: mediatek: fix cannot receive new request when msdc_cmd_is_ready fail Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 10/77] btrfs: handle error of get_old_root Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 11/77] gsmi: Fix bug in append_to_eventlog sysfs handler Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 12/77] misc: mic: fix a DMA pool free failure Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 13/77] amiflop: clean up on errors during setup Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 14/77] scsi: ips: fix missing break in switch Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 15/77] KVM/x86: Fix invvpid and invept register operand size in 64-bit mode Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 16/77] scsi: isci: Use proper enumerated type in atapi_d2h_reg_frame_handler Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 17/77] scsi: isci: Change sci_controller_start_task's return type to sci_status Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 18/77] scsi: iscsi_tcp: Explicitly cast param in iscsi_sw_tcp_host_get_param Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 19/77] clk: mmp2: fix the clock id for sdh2_clk and sdh3_clk Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 20/77] scsi: dc395x: fix dma API usage in srb_done Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 21/77] scsi: dc395x: fix DMA API usage in sg_update_list Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 22/77] net: fix warning in af_unix Sasha Levin
2019-11-16 15:52 ` Sasha Levin [this message]
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 24/77] ALSA: i2c/cs8427: Fix int to char conversion Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 25/77] macintosh/windfarm_smu_sat: Fix debug output Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 26/77] USB: misc: appledisplay: fix backlight update_status return code Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 27/77] SUNRPC: Fix a compile warning for cmpxchg64() Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 28/77] atm: zatm: Fix empty body Clang warnings Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 29/77] s390/perf: Return error when debug_register fails Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 30/77] spi: omap2-mcspi: Set FIFO DMA trigger level to word length Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 31/77] sparc: Fix parport build warnings Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 32/77] ceph: fix dentry leak in ceph_readdir_prepopulate Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 33/77] rtc: s35390a: Change buf's type to u8 in s35390a_init Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 34/77] mISDN: Fix type of switch control variable in ctrl_teimanager Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 35/77] qlcnic: fix a return in qlcnic_dcb_get_capability() Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 36/77] mfd: mc13xxx-core: Fix PMIC shutdown when reading ADC values Sasha Levin
2019-11-16 15:52 ` [PATCH AUTOSEL 4.4 37/77] mfd: max8997: Enale irq-wakeup unconditionally Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 38/77] selftests/ftrace: Fix to test kprobe $comm arg only if available Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 39/77] thermal: rcar_thermal: Prevent hardware access during system suspend Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 40/77] sparc64: Rework xchg() definition to avoid warnings Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 41/77] fs/ocfs2/dlm/dlmdebug.c: fix a sleep-in-atomic-context bug in dlm_print_one_mle() Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 42/77] mm/page-writeback.c: fix range_cyclic writeback vs writepages deadlock Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 43/77] um: Make line/tty semantics use true write IRQ Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 44/77] linux/bitmap.h: handle constant zero-size bitmaps correctly Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 45/77] linux/bitmap.h: fix type of nbits in bitmap_shift_right() Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 46/77] hfsplus: fix BUG on bnode parent update Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 47/77] hfs: " Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 48/77] hfsplus: prevent btree data loss on ENOSPC Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 49/77] hfs: " Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 50/77] hfsplus: fix return value of hfsplus_get_block() Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 51/77] hfs: fix return value of hfs_get_block() Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 52/77] fs/hfs/extent.c: fix array out of bounds read of array extent Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 53/77] igb: shorten maximum PHC timecounter update interval Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 54/77] ntb_netdev: fix sleep time mismatch Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 55/77] ntb: intel: fix return value for ndev_vec_mask() Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 56/77] ocfs2: don't put and assigning null to bh allocated outside Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 57/77] ocfs2: fix clusters leak in ocfs2_defrag_extent() Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 58/77] net: do not abort bulk send on BQL status Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 59/77] sched/fair: Don't increase sd->balance_interval on newidle balance Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 60/77] audit: print empty EXECVE args Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 61/77] wlcore: Fix the return value in case of error in 'wlcore_vendor_cmd_smart_config_start()' Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 62/77] rtl8xxxu: Fix missing break in switch Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 63/77] brcmsmac: never log "tid x is not agg'able" by default Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 64/77] wireless: airo: potential buffer overflow in sprintf() Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 65/77] rtlwifi: rtl8192de: Fix misleading REG_MCUFWDL information Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 66/77] scsi: mpt3sas: Fix Sync cache command failure during driver unload Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 67/77] scsi: mpt3sas: Fix driver modifying persistent data in Manufacturing page11 Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 68/77] scsi: megaraid_sas: Fix msleep granularity Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 69/77] scsi: lpfc: fcoe: Fix link down issue after 1000+ link bounces Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 70/77] dlm: fix invalid free Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 71/77] dlm: don't leak kernel pointer to userspace Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 72/77] net: bcmgenet: return correct value 'ret' from bcmgenet_power_down Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 73/77] sock: Reset dst when changing sk_mark via setsockopt Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 74/77] pinctrl: qcom: spmi-gpio: fix gpio-hog related boot issues Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 75/77] pinctrl: zynq: Use define directive for PIN_CONFIG_IO_STANDARD Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 76/77] PCI: keystone: Use quirk to limit MRRS for K2G Sasha Levin
2019-11-16 15:53 ` [PATCH AUTOSEL 4.4 77/77] spi: omap2-mcspi: Fix DMA and FIFO event trigger size mismatch Sasha Levin

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=20191116155339.11909-23-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=bp@alien8.de \
    --cc=joel@joelfernandes.org \
    --cc=jpoimboe@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@amacapital.net \
    --cc=mhiramat@kernel.org \
    --cc=mingo@kernel.org \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=stable@vger.kernel.org \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.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
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).