From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from beige.elm.relay.mailchannels.net (beige.elm.relay.mailchannels.net [23.83.212.16]) by sourceware.org (Postfix) with ESMTPS id 2FE7A388266A for ; Fri, 30 Jun 2023 13:51:49 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 2FE7A388266A Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=gotplt.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gotplt.org X-Sender-Id: dreamhost|x-authsender|siddhesh@gotplt.org Received: from relay.mailchannels.net (localhost [127.0.0.1]) by relay.mailchannels.net (Postfix) with ESMTP id C8E87140EDD; Fri, 30 Jun 2023 13:51:47 +0000 (UTC) Received: from pdx1-sub0-mail-a286.dreamhost.com (unknown [127.0.0.6]) (Authenticated sender: dreamhost) by relay.mailchannels.net (Postfix) with ESMTPA id 1575414124A; Fri, 30 Jun 2023 13:51:47 +0000 (UTC) ARC-Seal: i=1; s=arc-2022; d=mailchannels.net; t=1688133107; a=rsa-sha256; cv=none; b=ND0ZMU3EG6yPHIsZgCjDptKDFFOdGjRwecY7jSXPgZl8hUZcdHcwa17uT6s8ZTya1b8Rt9 +QczSD8LqMrKmLuf8zdXwSDCc7TcyPha6YnWUn72JaJ1VE3cXFmHdgUgPPyCFc/risijQ/ 6wRSAKkoFsQjEgnchiYOWbeALPD+yIJOdl6/aRjYKj8WyOvvp0aGgc/vObnKKww2sWs+6g A6HYNupiK9xTNtwSFMKiGORiRNJ37ER+fxIl8fg1Pdmexs22YcWgYkNRNuAZbEMJlIPGnj gKl3p+ncKuvviMHxXXzW7CbGasPAfc2btIIoph6SjHelIxaGmKiVIHBkKzPPsw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=mailchannels.net; s=arc-2022; t=1688133107; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=7GUAL7G4xju2d4USh5rVevCUf+kcoGTL4m4wi6AZuD4=; b=5C/ZAGUOPaiQjlNPg8pGPjpPL4GLdOUh8V+1Meg1q30L4NXS/imAKTLyQa0m8hQ72SIF9h zQ+uZNzgnW8ibLln9ed/8j2XZFeO9Ais5M5bbhyr7iNLZzcl1An6Ns//iI4JZGfWSYjBkr ARx2LYYoF7wuGQ3DArL1oMwSqi0BxbpDfNJDnD+ToDFzphGCh2DQb8Os+cVzDxrxicuZjn 2QjnzQRrpZ4Z4Yt9mFvGLRokGW6LTb6QK8RGHO+hZIJT60jXWnXTYjcVTgy7rIkGBZJsrK O+FXtVha+kMgyfJnichnIUYU/4FLANn+tZnIx5jELIjZoViSh5geODFO1GsL8Q== ARC-Authentication-Results: i=1; rspamd-9fcc56855-gcssm; auth=pass smtp.auth=dreamhost smtp.mailfrom=siddhesh@gotplt.org X-Sender-Id: dreamhost|x-authsender|siddhesh@gotplt.org X-MC-Relay: Neutral X-MailChannels-SenderId: dreamhost|x-authsender|siddhesh@gotplt.org X-MailChannels-Auth-Id: dreamhost X-Towering-Ski: 0293e43f6628cf23_1688133107632_3498840903 X-MC-Loop-Signature: 1688133107632:4110755684 X-MC-Ingress-Time: 1688133107632 Received: from pdx1-sub0-mail-a286.dreamhost.com (pop.dreamhost.com [64.90.62.162]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384) by 100.103.24.91 (trex/6.9.1); Fri, 30 Jun 2023 13:51:47 +0000 Received: from [192.168.0.182] (bras-vprn-toroon4834w-lp130-09-174-91-45-44.dsl.bell.ca [174.91.45.44]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: siddhesh@gotplt.org) by pdx1-sub0-mail-a286.dreamhost.com (Postfix) with ESMTPSA id 4QsxZB4JWrzn4; Fri, 30 Jun 2023 06:51:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gotplt.org; s=dreamhost; t=1688133106; bh=7GUAL7G4xju2d4USh5rVevCUf+kcoGTL4m4wi6AZuD4=; h=Date:Subject:To:From:Content-Type:Content-Transfer-Encoding; b=bdCIpZwbzHegPGYVLPHhL4JTQSpLWwCZoWSb1d1qZIexLt9uxRwCrve8QALCzRNu8 IEZBA4+I46N/XZOQnimizfooIoqpbAQQ4VoB8SHGR4cmS8tox+8S3rX1Z++3eJo2N8 VmRouMNaevTmWuH5U1ZKdJWnklgwC/RNWP1N8Osle/qMvaEnOagRRE5smlUdqug70C KrHtbj4HRJvEOx6iZ9D/p7I0vJylNuahzfLI+KME8C1Movd0e+8+KcWEvfTkTL9CPQ MfSuCDlWVBRdNYzRBrSTP92VNejJPOP6P1FKx7jw2R+WhDhkqgITlvMBqYjpvixNR4 W4f/2q2DyUtPQ== Message-ID: Date: Fri, 30 Jun 2023 09:51:45 -0400 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.12.0 Subject: Re: [PATCH v3 16/16] Add --enable-fortify-source option Content-Language: en-US To: =?UTF-8?B?RnLDqWTDqXJpYyBCw6lyYXQ=?= , libc-alpha@sourceware.org, Adhemerval Zanella References: <20230628084246.778302-1-fberat@redhat.com> <20230628084246.778302-17-fberat@redhat.com> From: Siddhesh Poyarekar In-Reply-To: <20230628084246.778302-17-fberat@redhat.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-3036.9 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,NICE_REPLY_A,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: On 2023-06-28 04:42, Frédéric Bérat wrote: > It is now possible to enable fortification through a configure option. > The level may be given as parameter, if none is provided, the configure > script will determine what is the highest level possible that can be set > considering GCC built-ins availability and set it. > If level is explicitly set to 3, configure checks if the compiler > supports the built-in function necessary for it or raise an error if it > isn't. > > The result of the configure checks is a new variables, ${fortify_source} > that can be used to appropriately populate CFLAGS. > > Updated NEWS and INSTALL. > > Adding dedicated x86_64 variant that enables the configuration. Adhemerval, do you still think we should drop this and only look at CFLAGS? I am still not a 100% convinced that we should only look at CFLAGS (it gives much less control which makes me uneasy) but I see your point. We'll be setting CFLAGS in Fedora anyway (which I guess will be true for Ubuntu, Gentoo, Debian, etc. too) and the pre-commit CI will likely have _FORTIFY_SOURCE disabled so we may have adequate coverage. Thanks, Sid > --- > INSTALL | 6 +++ > Makeconfig | 9 ++++- > NEWS | 7 ++-- > config.make.in | 1 + > configure | 77 ++++++++++++++++++++++++++++++++++++ > configure.ac | 42 ++++++++++++++++++-- > manual/install.texi | 6 +++ > scripts/build-many-glibcs.py | 4 +- > 8 files changed, 144 insertions(+), 8 deletions(-) > > diff --git a/INSTALL b/INSTALL > index 6d51475536..44daf64ebd 100644 > --- a/INSTALL > +++ b/INSTALL > @@ -276,6 +276,12 @@ if 'CFLAGS' is specified it must enable optimization. For example: > the GNU C Library. The default value refers to the main > bug-reporting information for the GNU C Library. > > +'--enable-fortify-source' > +'--enable-fortify-source=LEVEL' > + Use -D_FORTIFY_SOURCE='LEVEL' to control code hardening, if not > + provided, 'LEVEL' defaults to highest possible value for your > + system, based on the supported 'CC' features. > + > To build the library and related programs, type 'make'. This will > produce a lot of output, some of which may look like errors from 'make' > but aren't. Look for error messages from 'make' containing '***'. > diff --git a/Makeconfig b/Makeconfig > index f6396b3e0c..84e5043b14 100644 > --- a/Makeconfig > +++ b/Makeconfig > @@ -902,6 +902,11 @@ define elide-stack-protector > $(if $(filter $(@F),$(patsubst %,%$(1),$(2))), $(no-stack-protector)) > endef > > +# We might want to compile with fortify-source > +ifneq ($(fortify-source),) > ++fortify-source=$(fortify-source) > +endif > + > # Some routine can't be fortified like the ones used by fortify > define elide-fortify-source > $(if $(filter $(@F),$(patsubst %,%$(1),$(2))), $(no-fortify-source)) > @@ -973,7 +978,9 @@ endif # $(+cflags) == "" > # loader, cannot be fortified. Lastly debug is the fortification routines > # themselves and they cannot be fortified. > do-fortify = $(filter-out elf dlfcn csu debug,$(subdir)) > -ifneq ($(do-fortify),$(subdir)) > +ifeq ($(do-fortify),$(subdir)) > ++cflags += $(+fortify-source) > +else > +cflags += $(no-fortify-source) > endif > > diff --git a/NEWS b/NEWS > index 027506a44c..b586f0bad5 100644 > --- a/NEWS > +++ b/NEWS > @@ -48,6 +48,10 @@ Major new features: > * The strlcpy and strlcat functions have been added. They are derived > from OpenBSD, and are expected to be added to a future POSIX version. > > +* A new configure option, "--enable-fortify-source", can be used to build GLIBC > + with _FORTIFY_SOURCE. The level of fortification can either be provided, or > + is set to the highest value supported by the compiler. > + > Deprecated and removed features, and other changes affecting compatibility: > > * In the Linux kernel for the hppa/parisc architecture some of the > @@ -502,9 +506,6 @@ Major new features: > * The audit libraries will avoid unnecessary slowdown if it is not required > PLT tracking (by not implementing the la_pltenter or la_pltexit callbacks). > > -* Glibc now supports to be built with _FORTIFY_SOURCE. The value is undefined > - for parts of the library that can't be built with it. > - > Deprecated and removed features, and other changes affecting compatibility: > > * On x86-64, the LD_PREFER_MAP_32BIT_EXEC environment variable support > diff --git a/config.make.in b/config.make.in > index 75ad9765aa..d487a4f4e9 100644 > --- a/config.make.in > +++ b/config.make.in > @@ -64,6 +64,7 @@ have-fpie = @libc_cv_fpie@ > have-ssp = @libc_cv_ssp@ > stack-protector = @stack_protector@ > no-stack-protector = @no_stack_protector@ > +fortify-source = @fortify_source@ > no-fortify-source = @no_fortify_source@ > have-selinux = @have_selinux@ > have-libaudit = @have_libaudit@ > diff --git a/configure b/configure > index 7a15f8d3e6..fa4a1c2346 100755 > --- a/configure > +++ b/configure > @@ -611,7 +611,10 @@ libc_cv_gcc_unwind_find_fde > libc_extra_cppflags > libc_extra_cflags > libc_cv_cxx_thread_local > +fortify_source > no_fortify_source > +libc_cv_fortify_source > +enable_fortify_source > have_selinux > have_libcap > have_libaudit > @@ -782,6 +785,7 @@ enable_pt_chown > enable_mathvec > enable_cet > enable_scv > +enable_fortify_source > with_cpu > ' > ac_precious_vars='build_alias > @@ -1452,6 +1456,10 @@ Optional Features: > (CET), x86 only > --disable-scv syscalls will not use scv instruction, even if the > kernel supports it, powerpc only > + --enable-fortify-source[=1|2|3] > + Use -D_FORTIFY_SOURCE=[1|2|3] to control code > + hardening, defaults to highest possible value for > + your system > > Optional Packages: > --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] > @@ -3717,6 +3725,18 @@ if test "$use_scv" != "no"; then : > > fi > > +# Check whether --enable-fortify-source was given. > +if test "${enable_fortify_source+set}" = set; then : > + enableval=$enable_fortify_source; enable_fortify_source=$enableval > +else > + enable_fortify_source=no > +fi > + > +case "$enable_fortify_source" in > +1|2|3|no|yes) ;; > +*) as_fn_error $? "Not a valid argument for --enable-fortify-source: \"$enable_fortify_source\"" "$LINENO" 5;; > +esac > + > # We keep the original values in `$config_*' and never modify them, so we > # can write them unchanged into config.make. Everything else uses > # $machine, $vendor, and $os, and changes them whenever convenient. > @@ -6353,8 +6373,65 @@ $as_echo "#define HAVE_LIBCAP 1" >>confdefs.h > fi > > > +fortify_source="" > no_fortify_source="-Wp,-U_FORTIFY_SOURCE" > > +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __builtin_dynamic_object_size" >&5 > +$as_echo_n "checking for __builtin_dynamic_object_size... " >&6; } > +if ${libc_cv___builtin_dynamic_object_size+:} false; then : > + $as_echo_n "(cached) " >&6 > +else > + > + cat confdefs.h - <<_ACEOF >conftest.$ac_ext > +/* end confdefs.h. */ > + > +int > +main () > +{ > +__builtin_dynamic_object_size("", 0) > + ; > + return 0; > +} > +_ACEOF > +if ac_fn_c_try_link "$LINENO"; then : > + libc_cv___builtin_dynamic_object_size=yes > + if test "$enable_fortify_source" = yes; then : > + enable_fortify_source=3 > +fi > +else > + libc_cv___builtin_dynamic_object_size=no > + if test "$enable_fortify_source" = yes; then : > + enable_fortify_source=2 > +fi > +fi > +rm -f core conftest.err conftest.$ac_objext \ > + conftest$ac_exeext conftest.$ac_ext > + > +fi > +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv___builtin_dynamic_object_size" >&5 > +$as_echo "$libc_cv___builtin_dynamic_object_size" >&6; } > + > +case $enable_fortify_source in #( > + 1|2) : > + libc_cv_fortify_source=yes ;; #( > + 3) : > + if test "$libc_cv___builtin_dynamic_object_size" = yes; then : > + libc_cv_fortify_source=yes > +else > + as_fn_error $? "Compiler doesn't provide necessary support for _FORTIFY_SOURCE=3" "$LINENO" 5 > +fi ;; #( > + *) : > + libc_cv_fortify_source=no ;; > +esac > + > +if test "$libc_cv_fortify_source" = yes; then : > + fortify_source="${no_fortify_source},-D_FORTIFY_SOURCE=${enable_fortify_source}" > + > +fi > + > + > + > + > > > { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the assembler requires one version per symbol" >&5 > diff --git a/configure.ac b/configure.ac > index ebc04d49e6..ec4de6e551 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -466,6 +466,17 @@ AC_ARG_ENABLE([scv], > > AS_IF([[test "$use_scv" != "no"]],[AC_DEFINE(USE_PPC_SCV)]) > > +dnl Build glibc with _FORTIFY_SOURCE > +AC_ARG_ENABLE(fortify-source, > + AS_HELP_STRING([--enable-fortify-source@<:@=1|2|3@:>@], > + [Use -D_FORTIFY_SOURCE=[1|2|3] to control code hardening, defaults to highest possible value for your system]), > + [enable_fortify_source=$enableval], > + [enable_fortify_source=no]) > +case "$enable_fortify_source" in > +1|2|3|no|yes) ;; > +*) AC_MSG_ERROR([Not a valid argument for --enable-fortify-source: "$enable_fortify_source"]);; > +esac > + > # We keep the original values in `$config_*' and never modify them, so we > # can write them unchanged into config.make. Everything else uses > # $machine, $vendor, and $os, and changes them whenever convenient. > @@ -1559,12 +1570,37 @@ if test "x$have_selinux" = xyes; then > fi > AC_SUBST(have_selinux) > > -dnl Create a variable that can be used to control were _FORTIFY_SOURCE is set. > -dnl This will allow users to enable fortification through FLAGS or compiler > -dnl defaults macro definitions. > +dnl Check if we support the requested _FORTIFY_SOURCE level > +dnl If not, then don't use it. > +dnl Note that _FORTIFY_SOURCE may have been set through FLAGS too. > +dnl _FORTIFY_SOURCE value will be selectively disabled for function that can't > +dnl support it > +fortify_source="" > no_fortify_source="-Wp,-U_FORTIFY_SOURCE" > > +AC_CACHE_CHECK([for __builtin_dynamic_object_size], [libc_cv___builtin_dynamic_object_size], [ > + AC_LINK_IFELSE([AC_LANG_PROGRAM([], [__builtin_dynamic_object_size("", 0)])], > + [libc_cv___builtin_dynamic_object_size=yes > + AS_IF([test "$enable_fortify_source" = yes], [enable_fortify_source=3])], > + [libc_cv___builtin_dynamic_object_size=no > + AS_IF([test "$enable_fortify_source" = yes], [enable_fortify_source=2])]) > +]) > + > +AS_CASE([$enable_fortify_source], > + [1|2], [libc_cv_fortify_source=yes], > + [3], [AS_IF([test "$libc_cv___builtin_dynamic_object_size" = yes], > + [libc_cv_fortify_source=yes], > + [AC_MSG_ERROR([Compiler doesn't provide necessary support for _FORTIFY_SOURCE=3])])], > + [libc_cv_fortify_source=no]) > + > +AS_IF([test "$libc_cv_fortify_source" = yes], > + [fortify_source="${no_fortify_source},-D_FORTIFY_SOURCE=${enable_fortify_source}"] > + ) > + > +AC_SUBST(enable_fortify_source) > +AC_SUBST(libc_cv_fortify_source) > AC_SUBST(no_fortify_source) > +AC_SUBST(fortify_source) > > dnl Starting with binutils 2.35, GAS can attach multiple symbol versions > dnl to one symbol (PR 23840). > diff --git a/manual/install.texi b/manual/install.texi > index a44a552d1f..26b64062a0 100644 > --- a/manual/install.texi > +++ b/manual/install.texi > @@ -303,6 +303,12 @@ Specify the URL that users should visit if they wish to report a bug, > to be included in @option{--help} output from programs installed with > @theglibc{}. The default value refers to the main bug-reporting > information for @theglibc{}. > + > +@item --enable-fortify-source > +@itemx --enable-fortify-source=@var{LEVEL} > +Use -D_FORTIFY_SOURCE=@option{LEVEL} to control code hardening, if not > +provided, @option{LEVEL} defaults to highest possible value for your system, > +based on the supported @code{CC} features. > @end table > > To build the library and related programs, type @code{make}. This will > diff --git a/scripts/build-many-glibcs.py b/scripts/build-many-glibcs.py > index e022abe284..e4eaec01e3 100755 > --- a/scripts/build-many-glibcs.py > +++ b/scripts/build-many-glibcs.py > @@ -464,7 +464,9 @@ class Context(object): > {'arch': 'i486', > 'ccopts': '-m32 -march=i486'}, > {'arch': 'i586', > - 'ccopts': '-m32 -march=i586'}]) > + 'ccopts': '-m32 -march=i586'}, > + {'variant': 'enable-fortify-source', > + 'cfg': ['--enable-fortify-source']}]) > self.add_config(arch='x86_64', > os_name='gnu', > gcc_cfg=['--disable-multilib'])