All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] init: Fix false positives in W+X checking
@ 2018-04-27 21:55 ` Jeffrey Hugo
  0 siblings, 0 replies; 10+ messages in thread
From: Jeffrey Hugo @ 2018-04-27 21:55 UTC (permalink / raw)
  To: linux-arm-kernel, linux-kernel
  Cc: Mark Rutland, Jan Glauber, Kees Cook, Ard Biesheuvel,
	Catalin Marinas, Will Deacon, Laura Abbott, Timur Tabi,
	Stephen Smalley, Andrew Morton, Ingo Molnar, Thomas Gleixner,
	Peter Zijlstra, Jeffrey Hugo

load_module() creates W+X mappings via __vmalloc_node_range() (from
layout_and_allocate()->move_module()->module_alloc()) by using
PAGE_KERNEL_EXEC.  These mappings are later cleaned up via
"call_rcu_sched(&freeinit->rcu, do_free_init)" from do_init_module().

This is a problem because call_rcu_sched() queues work, which can be run
after debug_checkwx() is run, resulting in a race condition.  If hit, the
race results in a nasty splat about insecure W+X mappings, which results
in a poor user experience as these are not the mappings that
debug_checkwx() is intended to catch.

This issue is observed on multiple arm64 platforms, and has been
artificially triggered on an x86 platform.

Address the race by flushing the queued work before running the
arch-defined mark_rodata_ro() which then calls debug_checkwx().

Reported-by: Timur Tabi <timur@codeaurora.org>
Reported-by: Jan Glauber <jan.glauber@caviumnetworks.com>
Fixes: e1a58320a38d ("x86/mm: Warn on W^X mappings")
Signed-off-by: Jeffrey Hugo <jhugo@codeaurora.org>
---

v1:
-was "arm64: mm: Fix false positives in W+X checking" (see [1])
-moved to common code based on review and confirmation of issue on x86

[1] http://lists.infradead.org/pipermail/linux-arm-kernel/2018-April/573776.html

 init/main.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/init/main.c b/init/main.c
index b795aa3..499d957 100644
--- a/init/main.c
+++ b/init/main.c
@@ -1034,6 +1034,13 @@ static int __init set_debug_rodata(char *str)
 static void mark_readonly(void)
 {
 	if (rodata_enabled) {
+		/*
+		 * load_module() results in W+X mappings, which are cleaned up
+		 * with call_rcu_sched().  Let's make sure that queued work is
+		 * flushed so that we don't hit false positives looking for
+		 * insecure pages which are W+X.
+		 */
+		rcu_barrier_sched();
 		mark_rodata_ro();
 		rodata_test();
 	} else
-- 
Qualcomm Datacenter Technologies as an affiliate of Qualcomm Technologies, Inc.
Qualcomm Technologies, Inc. is a member of the
Code Aurora Forum, a Linux Foundation Collaborative Project.

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v2] init: Fix false positives in W+X checking
@ 2018-04-27 21:55 ` Jeffrey Hugo
  0 siblings, 0 replies; 10+ messages in thread
From: Jeffrey Hugo @ 2018-04-27 21:55 UTC (permalink / raw)
  To: linux-arm-kernel

load_module() creates W+X mappings via __vmalloc_node_range() (from
layout_and_allocate()->move_module()->module_alloc()) by using
PAGE_KERNEL_EXEC.  These mappings are later cleaned up via
"call_rcu_sched(&freeinit->rcu, do_free_init)" from do_init_module().

This is a problem because call_rcu_sched() queues work, which can be run
after debug_checkwx() is run, resulting in a race condition.  If hit, the
race results in a nasty splat about insecure W+X mappings, which results
in a poor user experience as these are not the mappings that
debug_checkwx() is intended to catch.

This issue is observed on multiple arm64 platforms, and has been
artificially triggered on an x86 platform.

Address the race by flushing the queued work before running the
arch-defined mark_rodata_ro() which then calls debug_checkwx().

Reported-by: Timur Tabi <timur@codeaurora.org>
Reported-by: Jan Glauber <jan.glauber@caviumnetworks.com>
Fixes: e1a58320a38d ("x86/mm: Warn on W^X mappings")
Signed-off-by: Jeffrey Hugo <jhugo@codeaurora.org>
---

v1:
-was "arm64: mm: Fix false positives in W+X checking" (see [1])
-moved to common code based on review and confirmation of issue on x86

[1] http://lists.infradead.org/pipermail/linux-arm-kernel/2018-April/573776.html

 init/main.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/init/main.c b/init/main.c
index b795aa3..499d957 100644
--- a/init/main.c
+++ b/init/main.c
@@ -1034,6 +1034,13 @@ static int __init set_debug_rodata(char *str)
 static void mark_readonly(void)
 {
 	if (rodata_enabled) {
+		/*
+		 * load_module() results in W+X mappings, which are cleaned up
+		 * with call_rcu_sched().  Let's make sure that queued work is
+		 * flushed so that we don't hit false positives looking for
+		 * insecure pages which are W+X.
+		 */
+		rcu_barrier_sched();
 		mark_rodata_ro();
 		rodata_test();
 	} else
-- 
Qualcomm Datacenter Technologies as an affiliate of Qualcomm Technologies, Inc.
Qualcomm Technologies, Inc. is a member of the
Code Aurora Forum, a Linux Foundation Collaborative Project.

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH v2] init: Fix false positives in W+X checking
  2018-04-27 21:55 ` Jeffrey Hugo
@ 2018-04-28  3:05   ` Kees Cook
  -1 siblings, 0 replies; 10+ messages in thread
From: Kees Cook @ 2018-04-28  3:05 UTC (permalink / raw)
  To: Andrew Morton, Paul E. McKenney
  Cc: Jeffrey Hugo, linux-arm-kernel, LKML, Mark Rutland, Jan Glauber,
	Ard Biesheuvel, Catalin Marinas, Will Deacon, Laura Abbott,
	Timur Tabi, Stephen Smalley, Ingo Molnar, Thomas Gleixner,
	Peter Zijlstra

On Fri, Apr 27, 2018 at 2:55 PM, Jeffrey Hugo <jhugo@codeaurora.org> wrote:
> load_module() creates W+X mappings via __vmalloc_node_range() (from
> layout_and_allocate()->move_module()->module_alloc()) by using
> PAGE_KERNEL_EXEC.  These mappings are later cleaned up via
> "call_rcu_sched(&freeinit->rcu, do_free_init)" from do_init_module().
>
> This is a problem because call_rcu_sched() queues work, which can be run
> after debug_checkwx() is run, resulting in a race condition.  If hit, the
> race results in a nasty splat about insecure W+X mappings, which results
> in a poor user experience as these are not the mappings that
> debug_checkwx() is intended to catch.
>
> This issue is observed on multiple arm64 platforms, and has been
> artificially triggered on an x86 platform.
>
> Address the race by flushing the queued work before running the
> arch-defined mark_rodata_ro() which then calls debug_checkwx().
>
> Reported-by: Timur Tabi <timur@codeaurora.org>
> Reported-by: Jan Glauber <jan.glauber@caviumnetworks.com>
> Fixes: e1a58320a38d ("x86/mm: Warn on W^X mappings")
> Signed-off-by: Jeffrey Hugo <jhugo@codeaurora.org>

Acked-by: Kees Cook <keescook@chromium.org>

-Kees

> ---
>
> v1:
> -was "arm64: mm: Fix false positives in W+X checking" (see [1])
> -moved to common code based on review and confirmation of issue on x86
>
> [1] http://lists.infradead.org/pipermail/linux-arm-kernel/2018-April/573776.html
>
>  init/main.c | 7 +++++++
>  1 file changed, 7 insertions(+)
>
> diff --git a/init/main.c b/init/main.c
> index b795aa3..499d957 100644
> --- a/init/main.c
> +++ b/init/main.c
> @@ -1034,6 +1034,13 @@ static int __init set_debug_rodata(char *str)
>  static void mark_readonly(void)
>  {
>         if (rodata_enabled) {
> +               /*
> +                * load_module() results in W+X mappings, which are cleaned up
> +                * with call_rcu_sched().  Let's make sure that queued work is
> +                * flushed so that we don't hit false positives looking for
> +                * insecure pages which are W+X.
> +                */
> +               rcu_barrier_sched();
>                 mark_rodata_ro();
>                 rodata_test();
>         } else
> --
> Qualcomm Datacenter Technologies as an affiliate of Qualcomm Technologies, Inc.
> Qualcomm Technologies, Inc. is a member of the
> Code Aurora Forum, a Linux Foundation Collaborative Project.
>



-- 
Kees Cook
Pixel Security

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v2] init: Fix false positives in W+X checking
@ 2018-04-28  3:05   ` Kees Cook
  0 siblings, 0 replies; 10+ messages in thread
From: Kees Cook @ 2018-04-28  3:05 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Apr 27, 2018 at 2:55 PM, Jeffrey Hugo <jhugo@codeaurora.org> wrote:
> load_module() creates W+X mappings via __vmalloc_node_range() (from
> layout_and_allocate()->move_module()->module_alloc()) by using
> PAGE_KERNEL_EXEC.  These mappings are later cleaned up via
> "call_rcu_sched(&freeinit->rcu, do_free_init)" from do_init_module().
>
> This is a problem because call_rcu_sched() queues work, which can be run
> after debug_checkwx() is run, resulting in a race condition.  If hit, the
> race results in a nasty splat about insecure W+X mappings, which results
> in a poor user experience as these are not the mappings that
> debug_checkwx() is intended to catch.
>
> This issue is observed on multiple arm64 platforms, and has been
> artificially triggered on an x86 platform.
>
> Address the race by flushing the queued work before running the
> arch-defined mark_rodata_ro() which then calls debug_checkwx().
>
> Reported-by: Timur Tabi <timur@codeaurora.org>
> Reported-by: Jan Glauber <jan.glauber@caviumnetworks.com>
> Fixes: e1a58320a38d ("x86/mm: Warn on W^X mappings")
> Signed-off-by: Jeffrey Hugo <jhugo@codeaurora.org>

Acked-by: Kees Cook <keescook@chromium.org>

-Kees

> ---
>
> v1:
> -was "arm64: mm: Fix false positives in W+X checking" (see [1])
> -moved to common code based on review and confirmation of issue on x86
>
> [1] http://lists.infradead.org/pipermail/linux-arm-kernel/2018-April/573776.html
>
>  init/main.c | 7 +++++++
>  1 file changed, 7 insertions(+)
>
> diff --git a/init/main.c b/init/main.c
> index b795aa3..499d957 100644
> --- a/init/main.c
> +++ b/init/main.c
> @@ -1034,6 +1034,13 @@ static int __init set_debug_rodata(char *str)
>  static void mark_readonly(void)
>  {
>         if (rodata_enabled) {
> +               /*
> +                * load_module() results in W+X mappings, which are cleaned up
> +                * with call_rcu_sched().  Let's make sure that queued work is
> +                * flushed so that we don't hit false positives looking for
> +                * insecure pages which are W+X.
> +                */
> +               rcu_barrier_sched();
>                 mark_rodata_ro();
>                 rodata_test();
>         } else
> --
> Qualcomm Datacenter Technologies as an affiliate of Qualcomm Technologies, Inc.
> Qualcomm Technologies, Inc. is a member of the
> Code Aurora Forum, a Linux Foundation Collaborative Project.
>



-- 
Kees Cook
Pixel Security

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2] init: Fix false positives in W+X checking
  2018-04-27 21:55 ` Jeffrey Hugo
@ 2018-04-28  6:14   ` Ingo Molnar
  -1 siblings, 0 replies; 10+ messages in thread
From: Ingo Molnar @ 2018-04-28  6:14 UTC (permalink / raw)
  To: Jeffrey Hugo
  Cc: linux-arm-kernel, linux-kernel, Mark Rutland, Jan Glauber,
	Kees Cook, Ard Biesheuvel, Catalin Marinas, Will Deacon,
	Laura Abbott, Timur Tabi, Stephen Smalley, Andrew Morton,
	Thomas Gleixner, Peter Zijlstra


* Jeffrey Hugo <jhugo@codeaurora.org> wrote:

> load_module() creates W+X mappings via __vmalloc_node_range() (from
> layout_and_allocate()->move_module()->module_alloc()) by using
> PAGE_KERNEL_EXEC.  These mappings are later cleaned up via
> "call_rcu_sched(&freeinit->rcu, do_free_init)" from do_init_module().
> 
> This is a problem because call_rcu_sched() queues work, which can be run
> after debug_checkwx() is run, resulting in a race condition.  If hit, the
> race results in a nasty splat about insecure W+X mappings, which results
> in a poor user experience as these are not the mappings that
> debug_checkwx() is intended to catch.
> 
> This issue is observed on multiple arm64 platforms, and has been
> artificially triggered on an x86 platform.
> 
> Address the race by flushing the queued work before running the
> arch-defined mark_rodata_ro() which then calls debug_checkwx().
> 
> Reported-by: Timur Tabi <timur@codeaurora.org>
> Reported-by: Jan Glauber <jan.glauber@caviumnetworks.com>
> Fixes: e1a58320a38d ("x86/mm: Warn on W^X mappings")
> Signed-off-by: Jeffrey Hugo <jhugo@codeaurora.org>
> ---
> 
> v1:
> -was "arm64: mm: Fix false positives in W+X checking" (see [1])
> -moved to common code based on review and confirmation of issue on x86
> 
> [1] http://lists.infradead.org/pipermail/linux-arm-kernel/2018-April/573776.html
> 
>  init/main.c | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/init/main.c b/init/main.c
> index b795aa3..499d957 100644
> --- a/init/main.c
> +++ b/init/main.c
> @@ -1034,6 +1034,13 @@ static int __init set_debug_rodata(char *str)
>  static void mark_readonly(void)
>  {
>  	if (rodata_enabled) {
> +		/*
> +		 * load_module() results in W+X mappings, which are cleaned up
> +		 * with call_rcu_sched().  Let's make sure that queued work is
> +		 * flushed so that we don't hit false positives looking for
> +		 * insecure pages which are W+X.
> +		 */
> +		rcu_barrier_sched();

I'd suggest adding a matching comment to the module loading portion as well,
to make sure this connection does not get lost. With that:

Acked-by: Ingo Molnar <mingo@kernel.org>

Thanks,

	Ingo

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v2] init: Fix false positives in W+X checking
@ 2018-04-28  6:14   ` Ingo Molnar
  0 siblings, 0 replies; 10+ messages in thread
From: Ingo Molnar @ 2018-04-28  6:14 UTC (permalink / raw)
  To: linux-arm-kernel


* Jeffrey Hugo <jhugo@codeaurora.org> wrote:

> load_module() creates W+X mappings via __vmalloc_node_range() (from
> layout_and_allocate()->move_module()->module_alloc()) by using
> PAGE_KERNEL_EXEC.  These mappings are later cleaned up via
> "call_rcu_sched(&freeinit->rcu, do_free_init)" from do_init_module().
> 
> This is a problem because call_rcu_sched() queues work, which can be run
> after debug_checkwx() is run, resulting in a race condition.  If hit, the
> race results in a nasty splat about insecure W+X mappings, which results
> in a poor user experience as these are not the mappings that
> debug_checkwx() is intended to catch.
> 
> This issue is observed on multiple arm64 platforms, and has been
> artificially triggered on an x86 platform.
> 
> Address the race by flushing the queued work before running the
> arch-defined mark_rodata_ro() which then calls debug_checkwx().
> 
> Reported-by: Timur Tabi <timur@codeaurora.org>
> Reported-by: Jan Glauber <jan.glauber@caviumnetworks.com>
> Fixes: e1a58320a38d ("x86/mm: Warn on W^X mappings")
> Signed-off-by: Jeffrey Hugo <jhugo@codeaurora.org>
> ---
> 
> v1:
> -was "arm64: mm: Fix false positives in W+X checking" (see [1])
> -moved to common code based on review and confirmation of issue on x86
> 
> [1] http://lists.infradead.org/pipermail/linux-arm-kernel/2018-April/573776.html
> 
>  init/main.c | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/init/main.c b/init/main.c
> index b795aa3..499d957 100644
> --- a/init/main.c
> +++ b/init/main.c
> @@ -1034,6 +1034,13 @@ static int __init set_debug_rodata(char *str)
>  static void mark_readonly(void)
>  {
>  	if (rodata_enabled) {
> +		/*
> +		 * load_module() results in W+X mappings, which are cleaned up
> +		 * with call_rcu_sched().  Let's make sure that queued work is
> +		 * flushed so that we don't hit false positives looking for
> +		 * insecure pages which are W+X.
> +		 */
> +		rcu_barrier_sched();

I'd suggest adding a matching comment to the module loading portion as well,
to make sure this connection does not get lost. With that:

Acked-by: Ingo Molnar <mingo@kernel.org>

Thanks,

	Ingo

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2] init: Fix false positives in W+X checking
  2018-04-27 21:55 ` Jeffrey Hugo
@ 2018-04-30  8:31   ` Will Deacon
  -1 siblings, 0 replies; 10+ messages in thread
From: Will Deacon @ 2018-04-30  8:31 UTC (permalink / raw)
  To: Jeffrey Hugo
  Cc: linux-arm-kernel, linux-kernel, Mark Rutland, Jan Glauber,
	Kees Cook, Ard Biesheuvel, Catalin Marinas, Laura Abbott,
	Timur Tabi, Stephen Smalley, Andrew Morton, Ingo Molnar,
	Thomas Gleixner, Peter Zijlstra

On Fri, Apr 27, 2018 at 03:55:45PM -0600, Jeffrey Hugo wrote:
> load_module() creates W+X mappings via __vmalloc_node_range() (from
> layout_and_allocate()->move_module()->module_alloc()) by using
> PAGE_KERNEL_EXEC.  These mappings are later cleaned up via
> "call_rcu_sched(&freeinit->rcu, do_free_init)" from do_init_module().
> 
> This is a problem because call_rcu_sched() queues work, which can be run
> after debug_checkwx() is run, resulting in a race condition.  If hit, the
> race results in a nasty splat about insecure W+X mappings, which results
> in a poor user experience as these are not the mappings that
> debug_checkwx() is intended to catch.
> 
> This issue is observed on multiple arm64 platforms, and has been
> artificially triggered on an x86 platform.
> 
> Address the race by flushing the queued work before running the
> arch-defined mark_rodata_ro() which then calls debug_checkwx().
> 
> Reported-by: Timur Tabi <timur@codeaurora.org>
> Reported-by: Jan Glauber <jan.glauber@caviumnetworks.com>
> Fixes: e1a58320a38d ("x86/mm: Warn on W^X mappings")
> Signed-off-by: Jeffrey Hugo <jhugo@codeaurora.org>
> ---
> 
> v1:
> -was "arm64: mm: Fix false positives in W+X checking" (see [1])
> -moved to common code based on review and confirmation of issue on x86
> 
> [1] http://lists.infradead.org/pipermail/linux-arm-kernel/2018-April/573776.html
> 
>  init/main.c | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/init/main.c b/init/main.c
> index b795aa3..499d957 100644
> --- a/init/main.c
> +++ b/init/main.c
> @@ -1034,6 +1034,13 @@ static int __init set_debug_rodata(char *str)
>  static void mark_readonly(void)
>  {
>  	if (rodata_enabled) {
> +		/*
> +		 * load_module() results in W+X mappings, which are cleaned up
> +		 * with call_rcu_sched().  Let's make sure that queued work is
> +		 * flushed so that we don't hit false positives looking for
> +		 * insecure pages which are W+X.
> +		 */
> +		rcu_barrier_sched();
>  		mark_rodata_ro();
>  		rodata_test();
>  	} else

Acked-by: Will Deacon <will.deacon@arm.com>

Thanks for solving this for all architectures, Jeffrey.

Will

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v2] init: Fix false positives in W+X checking
@ 2018-04-30  8:31   ` Will Deacon
  0 siblings, 0 replies; 10+ messages in thread
From: Will Deacon @ 2018-04-30  8:31 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Apr 27, 2018 at 03:55:45PM -0600, Jeffrey Hugo wrote:
> load_module() creates W+X mappings via __vmalloc_node_range() (from
> layout_and_allocate()->move_module()->module_alloc()) by using
> PAGE_KERNEL_EXEC.  These mappings are later cleaned up via
> "call_rcu_sched(&freeinit->rcu, do_free_init)" from do_init_module().
> 
> This is a problem because call_rcu_sched() queues work, which can be run
> after debug_checkwx() is run, resulting in a race condition.  If hit, the
> race results in a nasty splat about insecure W+X mappings, which results
> in a poor user experience as these are not the mappings that
> debug_checkwx() is intended to catch.
> 
> This issue is observed on multiple arm64 platforms, and has been
> artificially triggered on an x86 platform.
> 
> Address the race by flushing the queued work before running the
> arch-defined mark_rodata_ro() which then calls debug_checkwx().
> 
> Reported-by: Timur Tabi <timur@codeaurora.org>
> Reported-by: Jan Glauber <jan.glauber@caviumnetworks.com>
> Fixes: e1a58320a38d ("x86/mm: Warn on W^X mappings")
> Signed-off-by: Jeffrey Hugo <jhugo@codeaurora.org>
> ---
> 
> v1:
> -was "arm64: mm: Fix false positives in W+X checking" (see [1])
> -moved to common code based on review and confirmation of issue on x86
> 
> [1] http://lists.infradead.org/pipermail/linux-arm-kernel/2018-April/573776.html
> 
>  init/main.c | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/init/main.c b/init/main.c
> index b795aa3..499d957 100644
> --- a/init/main.c
> +++ b/init/main.c
> @@ -1034,6 +1034,13 @@ static int __init set_debug_rodata(char *str)
>  static void mark_readonly(void)
>  {
>  	if (rodata_enabled) {
> +		/*
> +		 * load_module() results in W+X mappings, which are cleaned up
> +		 * with call_rcu_sched().  Let's make sure that queued work is
> +		 * flushed so that we don't hit false positives looking for
> +		 * insecure pages which are W+X.
> +		 */
> +		rcu_barrier_sched();
>  		mark_rodata_ro();
>  		rodata_test();
>  	} else

Acked-by: Will Deacon <will.deacon@arm.com>

Thanks for solving this for all architectures, Jeffrey.

Will

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2] init: Fix false positives in W+X checking
  2018-04-28  6:14   ` Ingo Molnar
@ 2018-04-30 14:10     ` Jeffrey Hugo
  -1 siblings, 0 replies; 10+ messages in thread
From: Jeffrey Hugo @ 2018-04-30 14:10 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: linux-arm-kernel, linux-kernel, Mark Rutland, Jan Glauber,
	Kees Cook, Ard Biesheuvel, Catalin Marinas, Will Deacon,
	Laura Abbott, Timur Tabi, Stephen Smalley, Andrew Morton,
	Thomas Gleixner, Peter Zijlstra

On 4/28/2018 12:14 AM, Ingo Molnar wrote:
> 
> * Jeffrey Hugo <jhugo@codeaurora.org> wrote:
> 
>> load_module() creates W+X mappings via __vmalloc_node_range() (from
>> layout_and_allocate()->move_module()->module_alloc()) by using
>> PAGE_KERNEL_EXEC.  These mappings are later cleaned up via
>> "call_rcu_sched(&freeinit->rcu, do_free_init)" from do_init_module().
>>
>> This is a problem because call_rcu_sched() queues work, which can be run
>> after debug_checkwx() is run, resulting in a race condition.  If hit, the
>> race results in a nasty splat about insecure W+X mappings, which results
>> in a poor user experience as these are not the mappings that
>> debug_checkwx() is intended to catch.
>>
>> This issue is observed on multiple arm64 platforms, and has been
>> artificially triggered on an x86 platform.
>>
>> Address the race by flushing the queued work before running the
>> arch-defined mark_rodata_ro() which then calls debug_checkwx().
>>
>> Reported-by: Timur Tabi <timur@codeaurora.org>
>> Reported-by: Jan Glauber <jan.glauber@caviumnetworks.com>
>> Fixes: e1a58320a38d ("x86/mm: Warn on W^X mappings")
>> Signed-off-by: Jeffrey Hugo <jhugo@codeaurora.org>
>> ---
>>
>> v1:
>> -was "arm64: mm: Fix false positives in W+X checking" (see [1])
>> -moved to common code based on review and confirmation of issue on x86
>>
>> [1] http://lists.infradead.org/pipermail/linux-arm-kernel/2018-April/573776.html
>>
>>   init/main.c | 7 +++++++
>>   1 file changed, 7 insertions(+)
>>
>> diff --git a/init/main.c b/init/main.c
>> index b795aa3..499d957 100644
>> --- a/init/main.c
>> +++ b/init/main.c
>> @@ -1034,6 +1034,13 @@ static int __init set_debug_rodata(char *str)
>>   static void mark_readonly(void)
>>   {
>>   	if (rodata_enabled) {
>> +		/*
>> +		 * load_module() results in W+X mappings, which are cleaned up
>> +		 * with call_rcu_sched().  Let's make sure that queued work is
>> +		 * flushed so that we don't hit false positives looking for
>> +		 * insecure pages which are W+X.
>> +		 */
>> +		rcu_barrier_sched();
> 
> I'd suggest adding a matching comment to the module loading portion as well,
> to make sure this connection does not get lost. With that:
> 
> Acked-by: Ingo Molnar <mingo@kernel.org>

Sure.  Will add that in a v3.

-- 
Jeffrey Hugo
Qualcomm Datacenter Technologies as an affiliate of Qualcomm 
Technologies, Inc.
Qualcomm Technologies, Inc. is a member of the
Code Aurora Forum, a Linux Foundation Collaborative Project.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v2] init: Fix false positives in W+X checking
@ 2018-04-30 14:10     ` Jeffrey Hugo
  0 siblings, 0 replies; 10+ messages in thread
From: Jeffrey Hugo @ 2018-04-30 14:10 UTC (permalink / raw)
  To: linux-arm-kernel

On 4/28/2018 12:14 AM, Ingo Molnar wrote:
> 
> * Jeffrey Hugo <jhugo@codeaurora.org> wrote:
> 
>> load_module() creates W+X mappings via __vmalloc_node_range() (from
>> layout_and_allocate()->move_module()->module_alloc()) by using
>> PAGE_KERNEL_EXEC.  These mappings are later cleaned up via
>> "call_rcu_sched(&freeinit->rcu, do_free_init)" from do_init_module().
>>
>> This is a problem because call_rcu_sched() queues work, which can be run
>> after debug_checkwx() is run, resulting in a race condition.  If hit, the
>> race results in a nasty splat about insecure W+X mappings, which results
>> in a poor user experience as these are not the mappings that
>> debug_checkwx() is intended to catch.
>>
>> This issue is observed on multiple arm64 platforms, and has been
>> artificially triggered on an x86 platform.
>>
>> Address the race by flushing the queued work before running the
>> arch-defined mark_rodata_ro() which then calls debug_checkwx().
>>
>> Reported-by: Timur Tabi <timur@codeaurora.org>
>> Reported-by: Jan Glauber <jan.glauber@caviumnetworks.com>
>> Fixes: e1a58320a38d ("x86/mm: Warn on W^X mappings")
>> Signed-off-by: Jeffrey Hugo <jhugo@codeaurora.org>
>> ---
>>
>> v1:
>> -was "arm64: mm: Fix false positives in W+X checking" (see [1])
>> -moved to common code based on review and confirmation of issue on x86
>>
>> [1] http://lists.infradead.org/pipermail/linux-arm-kernel/2018-April/573776.html
>>
>>   init/main.c | 7 +++++++
>>   1 file changed, 7 insertions(+)
>>
>> diff --git a/init/main.c b/init/main.c
>> index b795aa3..499d957 100644
>> --- a/init/main.c
>> +++ b/init/main.c
>> @@ -1034,6 +1034,13 @@ static int __init set_debug_rodata(char *str)
>>   static void mark_readonly(void)
>>   {
>>   	if (rodata_enabled) {
>> +		/*
>> +		 * load_module() results in W+X mappings, which are cleaned up
>> +		 * with call_rcu_sched().  Let's make sure that queued work is
>> +		 * flushed so that we don't hit false positives looking for
>> +		 * insecure pages which are W+X.
>> +		 */
>> +		rcu_barrier_sched();
> 
> I'd suggest adding a matching comment to the module loading portion as well,
> to make sure this connection does not get lost. With that:
> 
> Acked-by: Ingo Molnar <mingo@kernel.org>

Sure.  Will add that in a v3.

-- 
Jeffrey Hugo
Qualcomm Datacenter Technologies as an affiliate of Qualcomm 
Technologies, Inc.
Qualcomm Technologies, Inc. is a member of the
Code Aurora Forum, a Linux Foundation Collaborative Project.

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2018-04-30 14:10 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-04-27 21:55 [PATCH v2] init: Fix false positives in W+X checking Jeffrey Hugo
2018-04-27 21:55 ` Jeffrey Hugo
2018-04-28  3:05 ` Kees Cook
2018-04-28  3:05   ` Kees Cook
2018-04-28  6:14 ` Ingo Molnar
2018-04-28  6:14   ` Ingo Molnar
2018-04-30 14:10   ` Jeffrey Hugo
2018-04-30 14:10     ` Jeffrey Hugo
2018-04-30  8:31 ` Will Deacon
2018-04-30  8:31   ` Will Deacon

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.