Received: by 2002:a05:6a10:5bc5:0:0:0:0 with SMTP id os5csp1109061pxb; Thu, 21 Oct 2021 16:06:47 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwxLcEmnDbO7B/GdTRLXcLXlPJp7WxYkz4XN2SaWecAzFoQgvOkTuCR4704UMPaX+tDi9uv X-Received: by 2002:a63:e64a:: with SMTP id p10mr6618542pgj.263.1634857607620; Thu, 21 Oct 2021 16:06:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1634857607; cv=none; d=google.com; s=arc-20160816; b=yzPkXvR12vQmlg+bu1dxYXhxx21JtHRWBJAlR9tSj6LRdOv5b1XzeKE22kiCWdRS1n L0RrHBRMOWeTK60lKIKSvIzAIujQEFouh+LY9y/5fzl/+R1f+G9quznxZ3ofzu6QMs5c VRpTeccJWFvtlDMDMWWu3KN2J1qZgCQmUNP+Kyz+v00i0tk4voJyi6lE+OTRFAXAoqhn F0arh3LSV8iLJvnsqZS71V0hrpVcrNPXp0XkxX9d5QVou+/S1mRIvDY3dgjPcR82Uu7p tZv8uZbLfoyv608uqGC+8AWyaCm+wioZp9nUcz51GrWXb3kT1Hs0n5mSrcQWf4tjZRaA tcJg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from; bh=jbJqZdRg45y3rCKZ+RihaTr3yTH5oxwErYFoSGUljk4=; b=s/Wt2hQJhOp2+jMg7kkCwbiWTPqBGgPOfJDJ9K5uDV3pKwTjX6C/BIgTAlcOX9IlpN /2P+Ie4uI5iJJFEdrCT4DClPi1SvxDI/pepg7VXm5XXE7CHbld+ubYcpUv4yJOHpXg65 MXf9ao29ujBVDbPJoJpgsnp24REvMXPvSEWGM8Ep2yWWrXy3dJXTVweqhdOAIiNW0B3J GUcPSw1Zt3Viw2daPWE0PL3ghjbN2ywJneSSFoO6KexKbVV+YYrpVrUUa776ciTU5DAO BzJfCOYhntzuZberUyXkRCzls7lzfLLF7gwynM5t9JjdUSIzMzBwNw7zBPfbKev59ST+ P5ow== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id z4si10978339pfe.229.2021.10.21.16.06.32; Thu, 21 Oct 2021 16:06:47 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232226AbhJUXHR (ORCPT + 99 others); Thu, 21 Oct 2021 19:07:17 -0400 Received: from mga05.intel.com ([192.55.52.43]:58064 "EHLO mga05.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231271AbhJUXHN (ORCPT ); Thu, 21 Oct 2021 19:07:13 -0400 X-IronPort-AV: E=McAfee;i="6200,9189,10144"; a="315380004" X-IronPort-AV: E=Sophos;i="5.87,170,1631602800"; d="scan'208";a="315380004" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Oct 2021 16:02:20 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.87,170,1631602800"; d="scan'208";a="445033229" Received: from chang-linux-3.sc.intel.com ([172.25.66.175]) by orsmga006.jf.intel.com with ESMTP; 21 Oct 2021 16:02:20 -0700 From: "Chang S. Bae" To: linux-kernel@vger.kernel.org Cc: x86@kernel.org, tglx@linutronix.de, dave.hansen@linux.intel.com, arjan@linux.intel.com, ravi.v.shankar@intel.com, chang.seok.bae@intel.com Subject: [PATCH 02/23] x86/signal: Implement sigaltstack size validation Date: Thu, 21 Oct 2021 15:55:06 -0700 Message-Id: <20211021225527.10184-3-chang.seok.bae@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20211021225527.10184-1-chang.seok.bae@intel.com> References: <20211021225527.10184-1-chang.seok.bae@intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Thomas Gleixner For historical reasons MINSIGSTKSZ is a constant which became already too small with AVX512 support. Add a mechanism to enforce strict checking of the sigaltstack size against the real size of the FPU frame. The strict check can be enabled via a config option and can also be controlled via the kernel command line option 'strict_sas_size' independent of the config switch. Enabling it might break existing applications which allocate a too small sigaltstack but 'work' because they never get a signal delivered. Though it can be handy to filter out binaries which are not yet aware of AT_MINSIGSTKSZ. Also the upcoming support for dynamically enabled FPU features requires a strict sanity check to ensure that: - Enabling of a dynamic feature, which changes the sigframe size fits into an enabled sigaltstack - Installing a too small sigaltstack after a dynamic feature has been added is not possible. Implement the base check which is controlled by config and command line options. Signed-off-by: Thomas Gleixner Signed-off-by: Chang S. Bae --- .../admin-guide/kernel-parameters.txt | 9 +++++ arch/x86/Kconfig | 17 +++++++++ arch/x86/kernel/signal.c | 35 +++++++++++++++++++ 3 files changed, 61 insertions(+) diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index 91ba391f9b32..efb9512d0b14 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -5497,6 +5497,15 @@ stifb= [HW] Format: bpp:[:[:...]] + strict_sas_size= + [X86] + Format: + Enable or disable strict sigaltstack size checks + against the required signal frame size which + depends on the supported FPU features. This can + be used to filter out binaries which have + not yet been made aware of AT_MINSIGSTKSZ. + sunrpc.min_resvport= sunrpc.max_resvport= [NFS,SUNRPC] diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 8055da49f1c0..9b77b4af016b 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -125,6 +125,7 @@ config X86 select CLOCKSOURCE_VALIDATE_LAST_CYCLE select CLOCKSOURCE_WATCHDOG select DCACHE_WORD_ACCESS + select DYNAMIC_SIGFRAME select EDAC_ATOMIC_SCRUB select EDAC_SUPPORT select GENERIC_CLOCKEVENTS_BROADCAST if X86_64 || (X86_32 && X86_LOCAL_APIC) @@ -2389,6 +2390,22 @@ config MODIFY_LDT_SYSCALL Saying 'N' here may make sense for embedded or server kernels. +config STRICT_SIGALTSTACK_SIZE + bool "Enforce strict size checking for sigaltstack" + depends on DYNAMIC_SIGFRAME + help + For historical reasons MINSIGSTKSZ is a constant which became + already too small with AVX512 support. Add a mechanism to + enforce strict checking of the sigaltstack size against the + real size of the FPU frame. This option enables the check + by default. It can also be controlled via the kernel command + line option 'strict_sas_size' independent of this config + switch. Enabling it might break existing applications which + allocate a too small sigaltstack but 'work' because they + never get a signal delivered. + + Say 'N' unless you want to really enforce this check. + source "kernel/livepatch/Kconfig" endmenu diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c index 58bd07071d14..0111a6ae6e60 100644 --- a/arch/x86/kernel/signal.c +++ b/arch/x86/kernel/signal.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -40,6 +41,7 @@ #include #include #include +#include #endif /* CONFIG_X86_64 */ #include @@ -907,6 +909,39 @@ void signal_fault(struct pt_regs *regs, void __user *frame, char *where) force_sig(SIGSEGV); } +#ifdef CONFIG_DYNAMIC_SIGFRAME +#ifdef CONFIG_STRICT_SIGALTSTACK_SIZE +static bool strict_sigaltstack_size __ro_after_init = true; +#else +static bool strict_sigaltstack_size __ro_after_init = false; +#endif + +static int __init strict_sas_size(char *arg) +{ + return kstrtobool(arg, &strict_sigaltstack_size); +} +__setup("strict_sas_size", strict_sas_size); + +/* + * MINSIGSTKSZ is 2048 and can't be changed despite the fact that AVX512 + * exceeds that size already. As such programs might never use the + * sigaltstack they just continued to work. While always checking against + * the real size would be correct, this might be considered a regression. + * + * Therefore avoid the sanity check, unless enforced by kernel config or + * command line option. + */ +bool sigaltstack_size_valid(size_t ss_size) +{ + lockdep_assert_held(¤t->sighand->siglock); + + if (strict_sigaltstack_size) + return ss_size > get_sigframe_size(); + + return true; +} +#endif /* CONFIG_DYNAMIC_SIGFRAME */ + #ifdef CONFIG_X86_X32_ABI COMPAT_SYSCALL_DEFINE0(x32_rt_sigreturn) { -- 2.17.1