From patchwork Mon Oct 2 19:20:07 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kees Cook X-Patchwork-Id: 9981185 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 43921603FF for ; Mon, 2 Oct 2017 19:21:09 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3605928867 for ; Mon, 2 Oct 2017 19:21:09 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2AC21288D8; Mon, 2 Oct 2017 19:21:09 +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=-6.3 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM, T_DKIM_INVALID autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C110F28867 for ; Mon, 2 Oct 2017 19:21:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751313AbdJBTVI (ORCPT ); Mon, 2 Oct 2017 15:21:08 -0400 Received: from mail-pg0-f53.google.com ([74.125.83.53]:47157 "EHLO mail-pg0-f53.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751291AbdJBTUQ (ORCPT ); Mon, 2 Oct 2017 15:20:16 -0400 Received: by mail-pg0-f53.google.com with SMTP id r25so1078942pgn.4 for ; Mon, 02 Oct 2017 12:20:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=nK7yck49fwghGm1WZd1eEKZvrQpWDz5hm2/+/sMQ1Qk=; b=YW0HT0dCm5sr9PmTrxo1/Q9JQIzrxcmp7GonRhVeIc5izXqB794QdJqJspwmqDMviF RcITI2mbxvXbVc3neUpqun2swPVRAxEJRML8Nu4JBepeWzNV0sNc/TYZ7vjx1w+Y0QI+ 5Ap3WMXFunXu9WxjaEhz+kbpZPhoTGRdaqnjY= 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=nK7yck49fwghGm1WZd1eEKZvrQpWDz5hm2/+/sMQ1Qk=; b=fatxKM7SwPbLn8FW/XqyT/8N9L4kaz5A/FB+cKBobCuEL1OTEJiSmnuQ74ucUT0Kpj pU25P0lSQoYOY19BygJswE2us9j26rNYRJfFP5ltiiSqTcDhjJrx/nmzyb6uUEUcFzPF DrlIx6GAQUoe7lOB+GWupQPqfy4gETqXyrz0q9PMZXVQGxFPrkqpddnmQ4cMubSgeQNz NhsQYslKF8fRCLllerFktt+NLP9fPMUc77s/tCZpCUamGNzUN6fWYc6v8RDEKsdiEl0l rTli3iqdV0lbRMuruw4lrk1ApbAuGUrZQCTH2qUAyG6TfTrc+QvGDHHag9wV+iify9bT EOjg== X-Gm-Message-State: AHPjjUjUvlMNDxhndS4MH3mfws/LQ7DOYQjyXLkK4emrkDthoqhMjAHV 4nOq0VSZYUyaCB4Wdh7eGPV6vg== X-Google-Smtp-Source: AOwi7QCWKNM4WEQYgo6wcZ1vif/bPj1ZeHlC4CP1TMqy3uKzSPDChfchFaOdUA1pb8iRh9dmjbbntQ== X-Received: by 10.84.133.161 with SMTP id f30mr15181563plf.270.1506972016291; Mon, 02 Oct 2017 12:20:16 -0700 (PDT) Received: from www.outflux.net (173-164-112-133-Oregon.hfc.comcastbusiness.net. [173.164.112.133]) by smtp.gmail.com with ESMTPSA id e66sm17060289pfe.79.2017.10.02.12.20.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 02 Oct 2017 12:20:12 -0700 (PDT) From: Kees Cook To: Andrew Morton Cc: Kees Cook , Masahiro Yamada , Michal Marek , Ingo Molnar , Laura Abbott , Nicholas Piggin , linux-kbuild@vger.kernel.org, Yoshinori Sato , Rich Felker , "David S. Miller" , Al Viro , linux-kernel@vger.kernel.org, linux-sh@vger.kernel.org, kernel-hardening@lists.openwall.com Subject: [PATCH 3/3] Makefile: Introduce CONFIG_CC_STACKPROTECTOR_AUTO Date: Mon, 2 Oct 2017 12:20:07 -0700 Message-Id: <1506972007-80614-4-git-send-email-keescook@chromium.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1506972007-80614-1-git-send-email-keescook@chromium.org> References: <1506972007-80614-1-git-send-email-keescook@chromium.org> Sender: linux-kbuild-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kbuild@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Nearly all modern compilers support a stack-protector option, and nearly all modern distributions enable the kernel stack-protector, so enabling this by default in kernel builds would make sense. However, Kconfig does not have knowledge of available compiler features, so it isn't safe to force on, as this would unconditionally break builds for the compilers or architectures that don't have support. Instead, this introduces a new option, CONFIG_CC_STACKPROTECTOR_AUTO, which attempts to discover the best possible stack-protector available, and will allow builds to proceed even if the compiler doesn't support any stack-protector. This option is made the default so that kernels built with modern compilers will be protected-by-default against stack buffer overflows, avoiding things like the recent BlueBorne attack. Selection of a specific stack-protector option remains available, including disabling it. Cc: Masahiro Yamada Cc: Michal Marek Cc: Andrew Morton Cc: Ingo Molnar Cc: Laura Abbott Cc: Nicholas Piggin Cc: linux-kbuild@vger.kernel.org Signed-off-by: Kees Cook --- Makefile | 11 +++++++++++ arch/Kconfig | 8 +++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index e122a9cf0399..9bd334b35003 100644 --- a/Makefile +++ b/Makefile @@ -676,6 +676,10 @@ endif # This selects the stack protector compiler flag. Testing it is delayed # until after .config has been reprocessed, in the prepare-compiler-check # target. +ifdef CONFIG_CC_STACKPROTECTOR_AUTO + stackp-flag := $(call cc-option,-fstack-protector-strong,$(call cc-option,-fstack-protector)) + stackp-name := AUTO +else ifdef CONFIG_CC_STACKPROTECTOR_REGULAR stackp-flag := -fstack-protector stackp-name := REGULAR @@ -688,6 +692,7 @@ else stackp-flag := $(call cc-option, -fno-stack-protector) endif endif +endif ifdef stackp-name # If the stack protector has been selected, inform the rest of the build. KBUILD_CFLAGS += -DCONFIG_CC_STACKPROTECTOR @@ -1084,6 +1089,12 @@ PHONY += prepare-compiler-check prepare-compiler-check: FORCE # Make sure compiler supports requested stack protector flag. ifdef stackp-name + # Warn about CONFIG_CC_STACKPROTECTOR_AUTO having found no option. + ifeq ($(stackp-flag),) + @echo CONFIG_CC_STACKPROTECTOR_$(stackp-name): \ + Compiler does not support any known stack-protector >&2 + endif + # Fail if specifically requested stack protector is missing. ifeq ($(call cc-option, $(stackp-flag)),) @echo Cannot use CONFIG_CC_STACKPROTECTOR_$(stackp-name): \ $(stackp-flag) not supported by compiler >&2 && exit 1 diff --git a/arch/Kconfig b/arch/Kconfig index 7007c1bfa79c..cd2676ff5d5d 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -526,7 +526,7 @@ config HAVE_CC_STACKPROTECTOR choice prompt "Stack Protector buffer overflow detection" depends on HAVE_CC_STACKPROTECTOR - default CC_STACKPROTECTOR_NONE + default CC_STACKPROTECTOR_AUTO help This option turns on the "stack-protector" GCC feature. This feature puts, at the beginning of functions, a canary value on @@ -573,6 +573,12 @@ config CC_STACKPROTECTOR_STRONG about 20% of all kernel functions, which increases the kernel code size by about 2%. +config CC_STACKPROTECTOR_AUTO + bool "Automatic" + help + If the compiler supports it, the best available stack-protector + option will be chosen. + endchoice config THIN_ARCHIVES