All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laura Abbott <labbott@redhat.com>
To: Mark Rutland <mark.rutland@arm.com>,
	linux-arm-kernel@lists.infradead.org
Cc: linux-kernel@vger.kernel.org,
	kernel-hardening@lists.openwall.com,
	Catalin Marinas <catalin.marinas@arm.com>,
	Kees Cook <keescook@chromium.org>,
	Will Deacon <will.deacon@arm.com>
Subject: Re: [RFC PATCH 0/2] arm64: optional paranoid __{get,put}_user checks
Date: Tue, 31 Oct 2017 16:56:39 -0700	[thread overview]
Message-ID: <77c80381-cf68-aa1a-9112-e057c068eeb6@redhat.com> (raw)
In-Reply-To: <20171026090942.7041-1-mark.rutland@arm.com>

On 10/26/2017 02:09 AM, Mark Rutland wrote:
> Hi,
> 
> In Prague, Kees mentioned that it would be nice to have a mechanism to
> catch bad __{get,put}_user uses, such as the recent CVE-2017-5123 [1,2]
> issue with unsafe_put_user() in waitid().
> 
> These patches allow an optional access_ok() check to be dropped in
> arm64's __{get,put}_user() primitives. These will then BUG() if a bad
> user pointer is passed (which should only happen in the absence of an
> earlier access_ok() check).
> 
> The first patch rewrites the arm64 access_ok() check in C. This gives
> the compiler the visibility it needs to elide redundant access_ok()
> checks, so in the common case:
> 
>   get_user()
>     access_ok()
>     __get_user()
>       BUG_ON(!access_ok())
>       <uaccess asm>
> 
> ... the compiler can determine that the second access_ok() must return
> true, and can elide it along with the BUG_ON(), leaving:
> 
>   get_user()
>     access_ok()
>       __get_user()
>         <uaccess asm>
> 
> ... and thus this sanity check can have no cost in the common case.
> 
> The compiler doesn't always have the visibility to do this (e.g. if the
> two access_ok() checks are in different compilation units), but it seems
> to manage to do this most of the time -- In testing with v4.14-rc5
> defconfig this only increases the total Image size by 4KiB.
> 
> I had a go at turning this into a BUILD_BUG_ON(), to see if we could
> catch this issue at compile time. However, my GCC wasn't able to remove
> the BUILD_BUG() from some {get,put}_user cases. Maybe we can fix that,
> or maybe we can have some static analysis catch this at build time.
> 
> It's entirely possible that I've made some catastrophic mistake in these
> patches; I've only build-tested them so far, and I don't currently have
> access to hardware to test on.
> 
> I also haven't yet modified __copy_{to,from}_user and friends along
> similar lines, so this is incomplete. If there aren't any major
> objections to this approach, I can fold those in for the next spin.
> 
> Thanks,
> Mark.
> 
> [1] https://lwn.net/Articles/736348/
> [2] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=96ca579a1ecc943b75beba58bebb0356f6cc4b51
> 
> 
> Mark Rutland (2):
>   arm64: write __range_ok() in C
>   arm64: allow paranoid __{get,put}user
> 
>  arch/arm64/Kconfig               |  9 +++++++++
>  arch/arm64/include/asm/uaccess.h | 27 +++++++++++++++++++--------
>  2 files changed, 28 insertions(+), 8 deletions(-)
> 

Turning on the option fails as soon as we hit userspace. On my buildroot
based environment I get the help text for ld.so (????) and then a message
about attempting to kill init. I get a crash in init on the Hikey Android
environment as well. It almost seems like the __range_ok re-write
is triggering an error but it only seems to happen when the option is
enabled even when I take out the BUG. I'll see if I can get more useful
information.

Thanks,
Laura

WARNING: multiple messages have this Message-ID (diff)
From: labbott@redhat.com (Laura Abbott)
To: linux-arm-kernel@lists.infradead.org
Subject: [RFC PATCH 0/2] arm64: optional paranoid __{get,put}_user checks
Date: Tue, 31 Oct 2017 16:56:39 -0700	[thread overview]
Message-ID: <77c80381-cf68-aa1a-9112-e057c068eeb6@redhat.com> (raw)
In-Reply-To: <20171026090942.7041-1-mark.rutland@arm.com>

On 10/26/2017 02:09 AM, Mark Rutland wrote:
> Hi,
> 
> In Prague, Kees mentioned that it would be nice to have a mechanism to
> catch bad __{get,put}_user uses, such as the recent CVE-2017-5123 [1,2]
> issue with unsafe_put_user() in waitid().
> 
> These patches allow an optional access_ok() check to be dropped in
> arm64's __{get,put}_user() primitives. These will then BUG() if a bad
> user pointer is passed (which should only happen in the absence of an
> earlier access_ok() check).
> 
> The first patch rewrites the arm64 access_ok() check in C. This gives
> the compiler the visibility it needs to elide redundant access_ok()
> checks, so in the common case:
> 
>   get_user()
>     access_ok()
>     __get_user()
>       BUG_ON(!access_ok())
>       <uaccess asm>
> 
> ... the compiler can determine that the second access_ok() must return
> true, and can elide it along with the BUG_ON(), leaving:
> 
>   get_user()
>     access_ok()
>       __get_user()
>         <uaccess asm>
> 
> ... and thus this sanity check can have no cost in the common case.
> 
> The compiler doesn't always have the visibility to do this (e.g. if the
> two access_ok() checks are in different compilation units), but it seems
> to manage to do this most of the time -- In testing with v4.14-rc5
> defconfig this only increases the total Image size by 4KiB.
> 
> I had a go at turning this into a BUILD_BUG_ON(), to see if we could
> catch this issue at compile time. However, my GCC wasn't able to remove
> the BUILD_BUG() from some {get,put}_user cases. Maybe we can fix that,
> or maybe we can have some static analysis catch this at build time.
> 
> It's entirely possible that I've made some catastrophic mistake in these
> patches; I've only build-tested them so far, and I don't currently have
> access to hardware to test on.
> 
> I also haven't yet modified __copy_{to,from}_user and friends along
> similar lines, so this is incomplete. If there aren't any major
> objections to this approach, I can fold those in for the next spin.
> 
> Thanks,
> Mark.
> 
> [1] https://lwn.net/Articles/736348/
> [2] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=96ca579a1ecc943b75beba58bebb0356f6cc4b51
> 
> 
> Mark Rutland (2):
>   arm64: write __range_ok() in C
>   arm64: allow paranoid __{get,put}user
> 
>  arch/arm64/Kconfig               |  9 +++++++++
>  arch/arm64/include/asm/uaccess.h | 27 +++++++++++++++++++--------
>  2 files changed, 28 insertions(+), 8 deletions(-)
> 

Turning on the option fails as soon as we hit userspace. On my buildroot
based environment I get the help text for ld.so (????) and then a message
about attempting to kill init. I get a crash in init on the Hikey Android
environment as well. It almost seems like the __range_ok re-write
is triggering an error but it only seems to happen when the option is
enabled even when I take out the BUG. I'll see if I can get more useful
information.

Thanks,
Laura

WARNING: multiple messages have this Message-ID (diff)
From: Laura Abbott <labbott@redhat.com>
To: Mark Rutland <mark.rutland@arm.com>,
	linux-arm-kernel@lists.infradead.org
Cc: linux-kernel@vger.kernel.org,
	kernel-hardening@lists.openwall.com,
	Catalin Marinas <catalin.marinas@arm.com>,
	Kees Cook <keescook@chromium.org>,
	Will Deacon <will.deacon@arm.com>
Subject: [kernel-hardening] Re: [RFC PATCH 0/2] arm64: optional paranoid __{get,put}_user checks
Date: Tue, 31 Oct 2017 16:56:39 -0700	[thread overview]
Message-ID: <77c80381-cf68-aa1a-9112-e057c068eeb6@redhat.com> (raw)
In-Reply-To: <20171026090942.7041-1-mark.rutland@arm.com>

On 10/26/2017 02:09 AM, Mark Rutland wrote:
> Hi,
> 
> In Prague, Kees mentioned that it would be nice to have a mechanism to
> catch bad __{get,put}_user uses, such as the recent CVE-2017-5123 [1,2]
> issue with unsafe_put_user() in waitid().
> 
> These patches allow an optional access_ok() check to be dropped in
> arm64's __{get,put}_user() primitives. These will then BUG() if a bad
> user pointer is passed (which should only happen in the absence of an
> earlier access_ok() check).
> 
> The first patch rewrites the arm64 access_ok() check in C. This gives
> the compiler the visibility it needs to elide redundant access_ok()
> checks, so in the common case:
> 
>   get_user()
>     access_ok()
>     __get_user()
>       BUG_ON(!access_ok())
>       <uaccess asm>
> 
> ... the compiler can determine that the second access_ok() must return
> true, and can elide it along with the BUG_ON(), leaving:
> 
>   get_user()
>     access_ok()
>       __get_user()
>         <uaccess asm>
> 
> ... and thus this sanity check can have no cost in the common case.
> 
> The compiler doesn't always have the visibility to do this (e.g. if the
> two access_ok() checks are in different compilation units), but it seems
> to manage to do this most of the time -- In testing with v4.14-rc5
> defconfig this only increases the total Image size by 4KiB.
> 
> I had a go at turning this into a BUILD_BUG_ON(), to see if we could
> catch this issue at compile time. However, my GCC wasn't able to remove
> the BUILD_BUG() from some {get,put}_user cases. Maybe we can fix that,
> or maybe we can have some static analysis catch this at build time.
> 
> It's entirely possible that I've made some catastrophic mistake in these
> patches; I've only build-tested them so far, and I don't currently have
> access to hardware to test on.
> 
> I also haven't yet modified __copy_{to,from}_user and friends along
> similar lines, so this is incomplete. If there aren't any major
> objections to this approach, I can fold those in for the next spin.
> 
> Thanks,
> Mark.
> 
> [1] https://lwn.net/Articles/736348/
> [2] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=96ca579a1ecc943b75beba58bebb0356f6cc4b51
> 
> 
> Mark Rutland (2):
>   arm64: write __range_ok() in C
>   arm64: allow paranoid __{get,put}user
> 
>  arch/arm64/Kconfig               |  9 +++++++++
>  arch/arm64/include/asm/uaccess.h | 27 +++++++++++++++++++--------
>  2 files changed, 28 insertions(+), 8 deletions(-)
> 

Turning on the option fails as soon as we hit userspace. On my buildroot
based environment I get the help text for ld.so (????) and then a message
about attempting to kill init. I get a crash in init on the Hikey Android
environment as well. It almost seems like the __range_ok re-write
is triggering an error but it only seems to happen when the option is
enabled even when I take out the BUG. I'll see if I can get more useful
information.

Thanks,
Laura

  parent reply	other threads:[~2017-10-31 23:56 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-10-26  9:09 [RFC PATCH 0/2] arm64: optional paranoid __{get,put}_user checks Mark Rutland
2017-10-26  9:09 ` [kernel-hardening] " Mark Rutland
2017-10-26  9:09 ` Mark Rutland
2017-10-26  9:09 ` [RFC PATCH 1/2] arm64: write __range_ok() in C Mark Rutland
2017-10-26  9:09   ` [kernel-hardening] " Mark Rutland
2017-10-26  9:09   ` Mark Rutland
2017-11-16 15:28   ` Will Deacon
2017-11-16 15:28     ` [kernel-hardening] " Will Deacon
2017-11-16 15:28     ` Will Deacon
2017-11-20 12:22     ` Mark Rutland
2017-11-20 12:22       ` [kernel-hardening] " Mark Rutland
2017-11-20 12:22       ` Mark Rutland
2017-10-26  9:09 ` [RFC PATCH 2/2] arm64: allow paranoid __{get,put}user Mark Rutland
2017-10-26  9:09   ` [kernel-hardening] " Mark Rutland
2017-10-26  9:09   ` Mark Rutland
2017-10-27 15:41 ` [RFC PATCH 0/2] arm64: optional paranoid __{get,put}_user checks Will Deacon
2017-10-27 15:41   ` [kernel-hardening] " Will Deacon
2017-10-27 15:41   ` Will Deacon
2017-10-27 20:44   ` Mark Rutland
2017-10-27 20:44     ` [kernel-hardening] " Mark Rutland
2017-10-27 20:44     ` Mark Rutland
2017-10-28  8:47   ` Russell King - ARM Linux
2017-10-28  8:47     ` [kernel-hardening] " Russell King - ARM Linux
2017-10-28  8:47     ` Russell King - ARM Linux
2017-10-31 23:56 ` Laura Abbott [this message]
2017-10-31 23:56   ` [kernel-hardening] " Laura Abbott
2017-10-31 23:56   ` Laura Abbott
2017-11-01 12:05   ` Mark Rutland
2017-11-01 12:05     ` [kernel-hardening] " Mark Rutland
2017-11-01 12:05     ` Mark Rutland
2017-11-01 21:13     ` Laura Abbott
2017-11-01 21:13       ` [kernel-hardening] " Laura Abbott
2017-11-01 21:13       ` Laura Abbott
2017-11-01 22:28       ` Kees Cook
2017-11-01 22:28         ` [kernel-hardening] " Kees Cook
2017-11-01 22:28         ` Kees Cook
2017-11-01 23:05         ` Laura Abbott
2017-11-01 23:05           ` [kernel-hardening] " Laura Abbott
2017-11-01 23:05           ` Laura Abbott
2017-11-01 23:29           ` Kees Cook
2017-11-01 23:29             ` [kernel-hardening] " Kees Cook
2017-11-01 23:29             ` Kees Cook
2017-11-02  1:25             ` Laura Abbott
2017-11-02  1:25               ` [kernel-hardening] " Laura Abbott
2017-11-02  1:25               ` Laura Abbott
2017-11-03 23:04 ` [RFC PATCH 1/2] x86: Avoid multiple evaluations in __{get,put}_user_size Laura Abbott
2017-11-03 23:04   ` [kernel-hardening] " Laura Abbott
2017-11-03 23:04   ` [RFC PATCH 2/2] x86: Allow paranoid __{get,put}_user Laura Abbott
2017-11-03 23:04     ` [kernel-hardening] " Laura Abbott
2017-11-04  0:14     ` Kees Cook
2017-11-04  0:14       ` [kernel-hardening] " Kees Cook
2017-11-04  0:24       ` Al Viro
2017-11-04  0:24         ` [kernel-hardening] " Al Viro
2017-11-04  0:44         ` Al Viro
2017-11-04  0:44           ` [kernel-hardening] " Al Viro
2017-11-04  1:39         ` Kees Cook
2017-11-04  1:39           ` [kernel-hardening] " Kees Cook
2017-11-04  1:41           ` Kees Cook
2017-11-04  1:41             ` [kernel-hardening] " Kees Cook
2017-11-04  1:58         ` Mark Rutland
2017-11-04  1:58           ` [kernel-hardening] " Mark Rutland
2017-11-06 20:38       ` Laura Abbott
2017-11-06 20:38         ` [kernel-hardening] " Laura Abbott

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=77c80381-cf68-aa1a-9112-e057c068eeb6@redhat.com \
    --to=labbott@redhat.com \
    --cc=catalin.marinas@arm.com \
    --cc=keescook@chromium.org \
    --cc=kernel-hardening@lists.openwall.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=will.deacon@arm.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.