From mboxrd@z Thu Jan 1 00:00:00 1970 From: Greg Kroah-Hartman Subject: [PATCH 4.9 139/164] metag/uaccess: Check access_ok in strncpy_from_user Date: Tue, 23 May 2017 22:09:16 +0200 Message-ID: <20170523200913.065277602@linuxfoundation.org> References: <20170523200907.297534241@linuxfoundation.org> Mime-Version: 1.0 Return-path: In-Reply-To: <20170523200907.297534241-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org> Sender: linux-metag-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org List-ID: Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org Cc: Greg Kroah-Hartman , stable-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Al Viro , James Hogan , linux-metag-u79uwXL29TY76Z2rM5mHXA@public.gmane.org 4.9-stable review patch. If anyone has any objections, please let me know. ------------------ From: James Hogan commit 3a158a62da0673db918b53ac1440845a5b64fd90 upstream. The metag implementation of strncpy_from_user() doesn't validate the src pointer, which could allow reading of arbitrary kernel memory. Add a short access_ok() check to prevent that. Its still possible for it to read across the user/kernel boundary, but it will invariably reach a NUL character after only 9 bytes, leaking only a static kernel address being loaded into D0Re0 at the beginning of __start, which is acceptable for the immediate fix. Reported-by: Al Viro Signed-off-by: James Hogan Cc: linux-metag-u79uwXL29TY76Z2rM5mHXA@public.gmane.org Signed-off-by: Greg Kroah-Hartman --- arch/metag/include/asm/uaccess.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) --- a/arch/metag/include/asm/uaccess.h +++ b/arch/metag/include/asm/uaccess.h @@ -194,8 +194,13 @@ do { extern long __must_check __strncpy_from_user(char *dst, const char __user *src, long count); -#define strncpy_from_user(dst, src, count) __strncpy_from_user(dst, src, count) - +static inline long +strncpy_from_user(char *dst, const char __user *src, long count) +{ + if (!access_ok(VERIFY_READ, src, 1)) + return -EFAULT; + return __strncpy_from_user(dst, src, count); +} /* * Return the size of a string (including the ending 0) *