[PATCH v6 3/3] elf: Add glibc.rtld.execstack
Florian Weimer
fweimer@redhat.com
Mon Dec 23 17:33:26 GMT 2024
* Adhemerval Zanella:
> diff --git a/manual/tunables.texi b/manual/tunables.texi
> index 0b1b2898c0..c3e894f4fe 100644
> --- a/manual/tunables.texi
> +++ b/manual/tunables.texi
> @@ -355,6 +355,25 @@ tests for @code{AT_SECURE} programs and not meant to be a security feature.
> The default value of this tunable is @samp{0}.
> @end deftp
>
> +@deftp Tunable glibc.rtld.execstack
> +@theglibc{} will use either the default architecture ABI flags (that might
> +contain the executable bit) or the value of @code{PT_GNU_STACK} (if present)
> +to define whether to mark the stack non-executable, and if the program or
> +any shared library dependency require an executable stack the loader will
> +change the main stack permission if kernel starts with a non executable stack.
> +
> +The @code{glibc.rtld.execstack} tunable allows the user to control how
> +to proceed regarding the stack execution bit. Setting its value to @code{0}
> +disables executable stacks, where @code{1} enables it. The default value
> +is @code{1}.
Isn't this quite misleading? As far as I understand it, 0 disables
auto-negotiation (not executable stacks, see below), and 1 enables
auto-negotiation. In both cases, stacks can end up executable or
non-executable from a functionality point of view. This would perhaps
be cleaner to explain if there was a mode that disables
auto-negotiation, but tries to enable executable stacks if possible at
all; that could help with the dlopen issue mentioned below, too. (The
NEWS entry is much clearer in this regard.)
> +When executable stacks are not allowed, and if the main program requires an
> +executable stack, the loader will fail with an error message.
> +@strong{NB:} Trying to load a dynamic shared library with @code{dlopen} or
> +@code{dlmopen} that requires an executable stack will always fail if the
> +default flags does not contain the executable bit.
> +@end deftp
Missing paragraph break before @strong{NB:}. I think this needs to be
rephrased so that it's clear that this is true regardless the setting of
the tunable. And I assume the gating factor is whether an executable
stack was initially enabled at process startup (for whatever reason),
not what the “default flags” (where?) say. At least I hope the
implementation behaves this way.
Maybe also add:
“
Some systems do not have separate page protection flags at the hardware
level for read access and execute access (sometimes referred to as
read-implies-exec). This mode can also be enabled on certain systems
where the hardware supports separate protection flags. The glibc
tunable configuration is independent of hardware capabilities and kernel
configuration.
”
This doesn't explain that the kernel tracks PROT_EXEC in software even
if the hardware does not enforce it, but this level of detail probably
isn't required here.
Thanks,
Florian
More information about the Libc-alpha
mailing list