Re: [PATCH v3] init: Fix false positives in W+X checking

From: Jeffrey Hugo
Date: Mon Apr 30 2018 - 16:49:59 EST


On 4/30/2018 12:40 PM, Kees Cook wrote:
On Mon, Apr 30, 2018 at 10:19 AM, Laura Abbott <labbott@xxxxxxxxxx> wrote:
On 04/30/2018 08:59 AM, 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@xxxxxxxxxxxxxx>
Reported-by: Jan Glauber <jan.glauber@xxxxxxxxxxxxxxxxxx>
Fixes: e1a58320a38d ("x86/mm: Warn on W^X mappings")
Signed-off-by: Jeffrey Hugo <jhugo@xxxxxxxxxxxxxx>
Acked-by: Kees Cook <keescook@xxxxxxxxxxxx>
Acked-by: Ingo Molnar <mingo@xxxxxxxxxx>
Acked-by: Will Deacon <will.deacon@xxxxxxx>
---


Acked-by: Laura Abbott <labbott@xxxxxxxxxx>

If you don't have a tree for this to go through, I might suggest having
Kees take it.

akpm has taken the W^X stuff in the past, but I'm happy to do so. Just
let me know either way. :)

-Kees


That sounds fine to me. Is that agreeable to you, Andrew?

--
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.