This is the mail archive of the
glibc-bugs@sourceware.org
mailing list for the glibc project.
[Bug dynamic-link/21598] i386 _dl_runtime_resolve/_dl_runtime_profile is incompatible with shadow stack
- From: "cvs-commit at gcc dot gnu.org" <sourceware-bugzilla at sourceware dot org>
- To: glibc-bugs at sourceware dot org
- Date: Sun, 13 Aug 2017 14:32:49 +0000
- Subject: [Bug dynamic-link/21598] i386 _dl_runtime_resolve/_dl_runtime_profile is incompatible with shadow stack
- Auto-submitted: auto-generated
- References: <bug-21598-131@http.sourceware.org/bugzilla/>
https://sourceware.org/bugzilla/show_bug.cgi?id=21598
--- Comment #38 from cvs-commit at gcc dot gnu.org <cvs-commit at gcc dot gnu.org> ---
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".
The branch, hjl/cet/pr21598 has been created
at 26bb65e293df8d6a042bf3d51d0a4d2f313f4eb5 (commit)
- Log -----------------------------------------------------------------
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=26bb65e293df8d6a042bf3d51d0a4d2f313f4eb5
commit 26bb65e293df8d6a042bf3d51d0a4d2f313f4eb5
Author: H.J. Lu <hjl.tools@gmail.com>
Date: Thu Jun 22 08:51:42 2017 -0700
x86: Add IBT/SHSTK bits to cpu-features
Add IBT/SHSTK bits to cpu-features for Shadow Stack in Intel Control-flow
Enforcement Technology (CET) instructions:
https://software.intel.com/sites/default/files/managed/4d/2a/control-flow-enforcement-technology-preview.pdf
* sysdeps/x86/cpu-features.h (bit_cpu_BIT): New.
(bit_cpu_SHSTK): Likewise.
(index_cpu_IBT): Likewise.
(index_cpu_SHSTK): Likewise.
(reg_IBT): Likewise.
(reg_SHSTK): Likewise.
* sysdeps/x86/cpu-tunables.c (TUNABLE_CALLBACK (set_hwcaps)):
Handle index_cpu_IBT and index_cpu_SHSTK.
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=6bd5c7a0dedf99a48a5a91d008669f5e9d15ab2e
commit 6bd5c7a0dedf99a48a5a91d008669f5e9d15ab2e
Author: H.J. Lu <hjl.tools@gmail.com>
Date: Fri Aug 11 15:36:08 2017 +0200
Add private_function for private functions within glibc [BZ #21598]
USE_REGPARMS in config.h.in is only used to control how parameters are
passed for internal functions on i386. On i386, we define
#define internal_function __attribute__ ((regparm (3), stdcall))
so that we pass up to 3 integer parameters in registers for internal
functuons on i386. i386 has
_dl_runtime_resolve:
movl (%esp), %ecx
movl %eax, (%esp) # Store the function address.
movl 4(%esp), %eax
ret $12 # Jump to function address.
which is incompatible with Shadow Stack in Intel Control-flow Enforcement
Technology (CET) instructions:
https://software.intel.com/sites/default/files/managed/4d/2a/control-flow-enforcement-technology-preview.pdf
since shadow stack doesn't match return stack. We need to use register
indirect branch via %ecx. That means only 2 parameters can be passed
in registers for external function calls with lazy binding when shadow
stack is enabled. However, internal_function, which should be used only
with hidden function within libc.so, are also used with private function
calls between different shared objects of glibc.
This patch removes USE_REGPARMS and internal_function from config.h.in.
It adds a new header file, function-attrs.h, to define internal_function
and private_function, which is for private function calls between
different shared objects. Currently, sysdeps/i386/function-attrs.h
defines private_function as
#define private_function __attribute__ ((regparm (3), stdcall))
There is no change in shared objects on Linux/i686 nor Linux/x86_64.
When shadow stack is enabled, private_function will be defined as
#define private_function __attribute__ ((regparm (2), stdcall))
so that %ecx can be used as scratch register by _dl_runtime_resolve.
[BZ #21598]
* config.h.in (USE_REGPARMS): Removed.
(internal_function): Likewise.
* debug/fortify_fail.c (__fortify_fail): Replace internal_function
with private_function.
* elf/dl-addr.c (_dl_addr): Likewise.
* elf/dl-error-skeleton.c (_dl_signal_error): Likewise.
(_dl_catch_error): Likewise.
* elf/dl-execstack.c (_dl_make_stack_executable): Likewise.
* elf/dl-load.c (_dl_rtld_di_serinfo): Likewise.
* elf/dl-open.c (_dl_find_dso_for_object): Likewise.
* elf/dl-support.c (_dl_make_stack_executable_hook): Likewise.
* elf/dl-sym.c (_dl_vsym): Likewise.
(_dl_sym): Likewise.
* elf/dl-tls.c (_dl_get_tls_static_info): Likewise.
(_dl_allocate_tls_init): Likewise.
(_dl_allocate_tls): Likewise.
(_dl_deallocate_tls): Likewise.
* grp/grp-merge.c (__copy_grp): Likewise.
(__merge_grp): Likewise.
* grp/grp-merge.h (__copy_grp): Likewise.
(__merge_grp): Likewise.
* include/dlfcn.h (_dl_addr): Likewise.
(_dl_sym): Likewise.
(_dl_vsym): Likewise.
* include/rpc/pmap_clnt.h (__libc_rpc_getport): Likewise.
* include/stdio.h (__fortify_fail): Likewise.
* include/stdlib.h (__strtof_nan): Likewise.
(__strtod_nan): Likewise.
(__strtold_nan): Likewise.
(__wcstof_nan): Likewise.
(__wcstod_nan): Likewise.
(__wcstold_nan): Likewise.
(__strtof128_nan): Likewise.
(__wcstof128_nan): Likewise.
* nptl/allocatestack.c (__make_stacks_executable): Likewise.
* nptl/libc_pthread_init.c (__libc_pthread_init): Likewise.
* nptl/pthreadP.h (__make_stacks_executable): Likewise.
(__libc_pthread_init): Likewise.
* nss/XXX-lookup.c (DB_LOOKUP_FCT): Likewise.
(DB_COMPAT_FCT): Likewise.
* nss/getXXbyYY_r.c (DB_LOOKUP_FCT): Likewise.
* nss/getXXent_r.c (DB_LOOKUP_FCT): Likewise.
* nss/nsswitch.h (db_lookup_function): Likewise.
* resolv/gai_misc.h (__gai_sigqueue): Likewise.
* resolv/gai_sigqueue.c (__gai_sigqueue): Likewise.
* stdlib/strtod_nan_main.c (STRTOD_NAN): Likewise.
* sunrpc/pm_getport.c (__libc_rpc_getport): Likewise.
* sysdeps/generic/ldsodefs.h (_dl_make_stack_executable_hook):
Likewise.
(_dl_make_stack_executable): Likewise.
(_dl_signal_error): Likewise.
(_dl_catch_error): Likewise.
(_dl_rtld_di_serinfo): Likewise.
(_dl_allocate_tls): Likewise.
(_dl_get_tls_static_info): Likewise.
(_dl_allocate_tls_init): Likewise.
(_dl_deallocate_tls): Likewise.
(_dl_find_dso_for_object): Likewise.
* sysdeps/unix/sysv/linux/dl-execstack.c
(_dl_make_stack_executable): Likewise.
* sysdeps/unix/sysv/linux/gai_sigqueue.c (__gai_sigqueue):
Likewise.
* sysdeps/unix/sysv/linux/netlink_assert_response.c
(__netlink_assert_response): Likewise.
* sysdeps/unix/sysv/linux/netlinkaccess.h
(__netlink_assert_response): Likewise.
* include/libc-symbols.h (internal_function): Removed.
Include <function-attrs.h>.
* sysdeps/generic/function-attrs.h: New file.
* sysdeps/i386/function-attrs.h: Likewise.
* sysdeps/i386/configure.ac (USE_REGPARMS): Removed.
* sysdeps/i386/configure: Regenerated.
-----------------------------------------------------------------------
--
You are receiving this mail because:
You are on the CC list for the bug.