Received: by 2002:ac0:a581:0:0:0:0:0 with SMTP id m1-v6csp4424393imm; Mon, 25 Jun 2018 15:44:47 -0700 (PDT) X-Google-Smtp-Source: ADUXVKKIydhARXddN96koz3HML2C6BOYOiPFCBNmBSA1wxG6SWmYj+Q4woi18V0t36gcXrF6xUw5 X-Received: by 2002:a65:444f:: with SMTP id e15-v6mr10679916pgq.348.1529966687468; Mon, 25 Jun 2018 15:44:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1529966687; cv=none; d=google.com; s=arc-20160816; b=bKwQXqqM7K6qaquzosVoG5h+1dbSJZVMBTgNEZdlz0NZGLhe55GL02Lk8x2q9A0CU3 f0VHLu1axqYuI4S1AgiTz+VDsux+mENJKMiEjdej7ljr81hPBnJq/wjFON03X2S/haxO 5HlZjd9JHDLEUb5KYlHQ+AZL5/Ab3tbi0CZ4ls3StPjeMkr6vbwuQaZvAbvXCks65qrr GY4NM/Mz2WSJVZ7DMsGTLaqphvI+1H0pALQjlNV/naykwwA7/qPkzXuGV2QDHR3duiyE dXPjXF5SBg6wmMubufoGlxNOwnzEgIDu0L9YLMw8HfxV2Z0RTAjKXopURMASVcNIdyvY 9UHw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:from:subject:references:message-id :in-reply-to:date:mime-version:dkim-signature :arc-authentication-results; bh=tANS2lc9/Sh68sJhsCX5qG1RCeLj+qbifMvYUS14SXw=; b=o33fUfh1UNaxYnXwbSa13igvg7ptZXZkhT8CiRsBgmnsupJxywG3vLIKl35yncpbQd GWHlv4GyDJyF0V+SsuAKTXWWJqygQKrRDldBJc/1NIfZ6vIsDChjVx3Mz4tBM87yrqw8 v/123zI26uB6MTFrpAhl4xMiJMdO+gWqGr1kz6+A4FNPFJ+PwN7eaHjL5IRzAb73qqut MWLAXFUW3LKthUyBd47Vmhkr+Uk1vohRULYRGvq+kLkfQptAhv28c98amnIlnEDUwkcj XIq5xHEMglN1gZNWUMYjff6k7lVckSGBNIXIFCI4I8R+hgJj5RRk9JxPb2FncYiONvnM 1dlQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=MIKPBeNy; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g187-v6si84821pgc.111.2018.06.25.15.44.33; Mon, 25 Jun 2018 15:44:47 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=MIKPBeNy; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S964908AbeFYWmj (ORCPT + 99 others); Mon, 25 Jun 2018 18:42:39 -0400 Received: from mail-qk0-f202.google.com ([209.85.220.202]:43828 "EHLO mail-qk0-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755726AbeFYWmd (ORCPT ); Mon, 25 Jun 2018 18:42:33 -0400 Received: by mail-qk0-f202.google.com with SMTP id f2-v6so15043737qkm.10 for ; Mon, 25 Jun 2018 15:42:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:date:in-reply-to:message-id:references:subject:from:to :cc; bh=tANS2lc9/Sh68sJhsCX5qG1RCeLj+qbifMvYUS14SXw=; b=MIKPBeNyAUivtuOBErWOT6xMIpCguOjiOwVYN4gEjsxPFnPuaeavwLyyK/Re7lrB6+ 5hK+yO6gpML8zEC4llnS/H/oJo57vjUg7dWTsN3gV7hsjx0HHkZpXyB1o/+l3iUPk5CR 8x4G7ep+t30PwUvZ4EwoMh1gKMAt09aMIx/s2ekUAe2KbUnpX+oxIrNsSZiNgK8K0EFv s/W9mEOHMAxSdj/juei66DO2pnR2wjAzIkiyIqzHcl2xx/PVPbduQ15lAEPIWuSa19s7 ZvbsTr2La/cUCVzn8GzwiE86yx7UWCF8idK3MsIL5NDwr4Tk9GdSWX6eFVaZcswxnPzD ktmg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:date:in-reply-to:message-id :references:subject:from:to:cc; bh=tANS2lc9/Sh68sJhsCX5qG1RCeLj+qbifMvYUS14SXw=; b=HeTI9QJA9cr1f5sTuFkAjlzG+OiKwnc6Bnu8NiuzTlqhSmeDS1/OVjDEidqu9U9GT3 zKpjY5iLk3W0jGnZlXyO2BGra5y+HR5ldW6a9TxrWbIHY5M4Cy1KLoMcf/j3U6S5OeWa QGO7XXtbvsBQT+JbG/N5E8jh3UA7AkM2/utIswkvYy1sL36P7JXNV+QP8lpl5pGyMJdF pICO0Vpj/v5lDXKY8ZJQ6iHsjlcbNe7aLbWstFyWLVDYB/N42T4GCQOJ7QJa3pmL1hyG m/pK52y6q52FyuNfHMJuXny7JyS3d+KKlzgeFZ84+6kKb+OTZ0QQTP6YrGts2wqH+E1s gyZg== X-Gm-Message-State: APt69E13JuMkVWitc6MVICAHelVtiNUggJNDEfVcA5bR74B+9BdsoQ/z v+4Hgr6j4K42ioZtv18zm1XEQbIR0ktr+w== MIME-Version: 1.0 X-Received: by 2002:ac8:28dd:: with SMTP id j29-v6mr8141842qtj.31.1529966552405; Mon, 25 Jun 2018 15:42:32 -0700 (PDT) Date: Mon, 25 Jun 2018 15:39:10 -0700 In-Reply-To: <20180625224014.134829-1-thgarnie@google.com> Message-Id: <20180625224014.134829-23-thgarnie@google.com> References: <20180625224014.134829-1-thgarnie@google.com> X-Mailer: git-send-email 2.18.0.rc2.346.g013aa6912e-goog Subject: [PATCH v5 22/27] x86/modules: Add option to start module section after kernel From: Thomas Garnier To: kernel-hardening@lists.openwall.com Cc: Thomas Garnier , Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , x86@kernel.org, Jonathan Corbet , Andy Lutomirski , Andrey Ryabinin , "Kirill A. Shutemov" , Tom Lendacky , linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 f49725df7109..f98a47662023 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -2212,6 +2212,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 054765ab2da2..faaab159ed54 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.. @@ -137,7 +138,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 49df0386098c..14bbbe592772 100644 --- a/arch/x86/kernel/head64.c +++ b/arch/x86/kernel/head64.c @@ -393,12 +393,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 2f3c9196b834..537884e5d092 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; -- 2.18.0.rc2.346.g013aa6912e-goog