From patchwork Tue May 29 22:15:23 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Garnier X-Patchwork-Id: 10437331 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 9B476601C7 for ; Tue, 29 May 2018 22:22:35 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7A976287D2 for ; Tue, 29 May 2018 22:22:35 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6F02328927; Tue, 29 May 2018 22:22:35 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, USER_IN_DEF_DKIM_WL autolearn=ham version=3.3.1 Received: from mother.openwall.net (mother.openwall.net [195.42.179.200]) by mail.wl.linuxfoundation.org (Postfix) with SMTP id 47041287D2 for ; Tue, 29 May 2018 22:22:34 +0000 (UTC) Received: (qmail 21919 invoked by uid 550); 29 May 2018 22:18:18 -0000 Mailing-List: contact kernel-hardening-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Delivered-To: mailing list kernel-hardening@lists.openwall.com Received: (qmail 21756 invoked from network); 29 May 2018 22:18:16 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=YZmTmGlg3/PZk5RSFp6s5chU4tg97qADA9B9tEJSw5Y=; b=Z7zD0AVNDoKS21v2avLayFe/nzX0/rPHWPcxmS1NLM7QPgiYOlzP2HW3huc++rPeDu MFb3J6T25WpXdrDTNwWtS3O/XGyuyJlQNITjtynrJOmSG+NxhL6H5X561lo4yuYvgrA3 qLMltJBAL0CDOuI0GDhFx7+jqtSHGLxMQ1Ak9R9+VcrSLWH/xZG2Ao04ApPxJRJ+w+k1 ldG+nwkLWdHnLuNRD+feLU2aT1adv2le8R1Zods++mHxv89mPb8ave0T1wj9Ilu9fkWi sFIi3tlY/jVe7riIAD+vqRDm61IT6d9IFwq9LmDqjDKfq3M0eYLW22fRHPBx2n3XDHjt dVhQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=YZmTmGlg3/PZk5RSFp6s5chU4tg97qADA9B9tEJSw5Y=; b=MZxpTGTNSPONDLshlexs5NeRTwJcQZKb12UIoi17fn57TIxbMk/RbSVnS/r7R6d2lA Py1nrPEi29fKU3vT53+YkCeu1jG4r2/HIahf7wYNNm7DKaaM+grzUNSxpUR/n9ywVQbE w7AZvppW7BCewlV8NQmZAZ0gqu+mZ8UjhNo5u/807ynePX5rD8bvZzwuWfUh6kEVfA5p wKmYr5SG5kAqAhif6R/V7obz+3FZCSsmB+bQInSmJgIqklEZSeXyRSBP8vi1CRPuGz/t +Pz7KT0p1fgjNACa9D2VUY1oK9FO9euPLEICRN93TYRG0LqFHBfPySaWxlpfRG1dPYbC 7bQg== X-Gm-Message-State: ALKqPwerqoEHA8x9uf35523J6FZA42CUybhfTtJHrepgLwdw3whrNryr 8x+U8iUcoQEwGPREF6TF5OZVDIyYSBA= X-Google-Smtp-Source: ADUXVKIx5mr4EO21WkH61Q6JFUXsoYULRKA5Hb216ELaIQGthD4jzkKdy/lEzSTY2QVXrY00kAXH7Q== X-Received: by 2002:a62:8345:: with SMTP id h66-v6mr234120pfe.0.1527632284381; Tue, 29 May 2018 15:18:04 -0700 (PDT) From: Thomas Garnier To: kernel-hardening@lists.openwall.com Cc: Thomas Garnier , Skip Peter Zijlstra , Skip Philippe Ombredanne , Skip Greg Kroah-Hartman , Skip Jiri Kosina , Skip Alexander Potapenko , Skip Joerg Roedel , Skip Jan Beulich , Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , x86@kernel.org, Jonathan Corbet , Andy Lutomirski , Andrey Ryabinin , "Kirill A. Shutemov" , Tom Lendacky , Juergen Gross , linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org Subject: [PATCH v4 22/27] x86/modules: Add option to start module section after kernel Date: Tue, 29 May 2018 15:15:23 -0700 Message-Id: <20180529221625.33541-23-thgarnie@google.com> X-Mailer: git-send-email 2.17.0.921.gf22659ad46-goog In-Reply-To: <20180529221625.33541-1-thgarnie@google.com> References: <20180529221625.33541-1-thgarnie@google.com> X-Virus-Scanned: ClamAV using ClamSMTP Add an option so the module section is just after the mapped kernel. It will ensure position independent modules are always at the right distance from the kernel and do not require mcmodule=large. It also optimize the available size for modules by getting rid of the empty space on kernel randomization range. Signed-off-by: Thomas Garnier --- Documentation/x86/x86_64/mm.txt | 3 +++ arch/x86/Kconfig | 4 ++++ arch/x86/include/asm/pgtable_64_types.h | 6 ++++++ arch/x86/kernel/head64.c | 5 ++++- arch/x86/mm/dump_pagetables.c | 3 ++- 5 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Documentation/x86/x86_64/mm.txt b/Documentation/x86/x86_64/mm.txt index 5432a96d31ff..334ab458c82d 100644 --- a/Documentation/x86/x86_64/mm.txt +++ b/Documentation/x86/x86_64/mm.txt @@ -77,3 +77,6 @@ Their order is preserved but their base will be offset early at boot time. Be very careful vs. KASLR when changing anything here. The KASLR address range must not overlap with anything except the KASAN shadow area, which is correct as KASAN disables KASLR. + +If CONFIG_DYNAMIC_MODULE_BASE is enabled, the module section follows the end of +the mapped kernel. diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 177e712201d1..94a00d81ec18 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -2198,6 +2198,10 @@ config RANDOMIZE_MEMORY_PHYSICAL_PADDING If unsure, leave at the default value. +# Module section starts just after the end of the kernel module +config DYNAMIC_MODULE_BASE + bool + config X86_GLOBAL_STACKPROTECTOR bool "Stack cookie using a global variable" depends on CC_STACKPROTECTOR_AUTO diff --git a/arch/x86/include/asm/pgtable_64_types.h b/arch/x86/include/asm/pgtable_64_types.h index adb47552e6bb..3ab25b908879 100644 --- a/arch/x86/include/asm/pgtable_64_types.h +++ b/arch/x86/include/asm/pgtable_64_types.h @@ -7,6 +7,7 @@ #ifndef __ASSEMBLY__ #include #include +#include /* * These are used to make use of C type-checking.. @@ -126,7 +127,12 @@ extern unsigned int ptrs_per_p4d; #define VMALLOC_END (VMALLOC_START + (VMALLOC_SIZE_TB << 40) - 1) +#ifdef CONFIG_DYNAMIC_MODULE_BASE +#define MODULES_VADDR ALIGN(((unsigned long)_end + PAGE_SIZE), PMD_SIZE) +#else #define MODULES_VADDR (__START_KERNEL_map + KERNEL_IMAGE_SIZE) +#endif + /* The module sections ends with the start of the fixmap */ #define MODULES_END _AC(0xffffffffff000000, UL) #define MODULES_LEN (MODULES_END - MODULES_VADDR) diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c index fa661fb97127..3a1ce822e1c0 100644 --- a/arch/x86/kernel/head64.c +++ b/arch/x86/kernel/head64.c @@ -394,12 +394,15 @@ asmlinkage __visible void __init x86_64_start_kernel(char * real_mode_data) * Build-time sanity checks on the kernel image and module * area mappings. (these are purely build-time and produce no code) */ +#ifndef CONFIG_DYNAMIC_MODULE_BASE BUILD_BUG_ON(MODULES_VADDR < __START_KERNEL_map); BUILD_BUG_ON(MODULES_VADDR - __START_KERNEL_map < KERNEL_IMAGE_SIZE); - BUILD_BUG_ON(MODULES_LEN + KERNEL_IMAGE_SIZE > 2*PUD_SIZE); + BUILD_BUG_ON(!IS_ENABLED(CONFIG_RANDOMIZE_BASE_LARGE) && + MODULES_LEN + KERNEL_IMAGE_SIZE > 2*PUD_SIZE); BUILD_BUG_ON((__START_KERNEL_map & ~PMD_MASK) != 0); BUILD_BUG_ON((MODULES_VADDR & ~PMD_MASK) != 0); BUILD_BUG_ON(!(MODULES_VADDR > __START_KERNEL)); +#endif MAYBE_BUILD_BUG_ON(!(((MODULES_END - 1) & PGDIR_MASK) == (__START_KERNEL & PGDIR_MASK))); BUILD_BUG_ON(__fix_to_virt(__end_of_fixed_addresses) <= MODULES_END); diff --git a/arch/x86/mm/dump_pagetables.c b/arch/x86/mm/dump_pagetables.c index cc7ff5957194..dca4098ce4fd 100644 --- a/arch/x86/mm/dump_pagetables.c +++ b/arch/x86/mm/dump_pagetables.c @@ -105,7 +105,7 @@ static struct addr_marker address_markers[] = { [EFI_END_NR] = { EFI_VA_END, "EFI Runtime Services" }, #endif [HIGH_KERNEL_NR] = { __START_KERNEL_map, "High Kernel Mapping" }, - [MODULES_VADDR_NR] = { MODULES_VADDR, "Modules" }, + [MODULES_VADDR_NR] = { 0/*MODULES_VADDR*/, "Modules" }, [MODULES_END_NR] = { MODULES_END, "End Modules" }, [FIXADDR_START_NR] = { FIXADDR_START, "Fixmap Area" }, [END_OF_SPACE_NR] = { -1, NULL } @@ -600,6 +600,7 @@ static int __init pt_dump_init(void) address_markers[KASAN_SHADOW_START_NR].start_address = KASAN_SHADOW_START; address_markers[KASAN_SHADOW_END_NR].start_address = KASAN_SHADOW_END; #endif + address_markers[MODULES_VADDR_NR].start_address = MODULES_VADDR; #endif #ifdef CONFIG_X86_32 address_markers[VMALLOC_START_NR].start_address = VMALLOC_START;