Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: [Bug] modules zsh/tcp, zsh/zftp unloadable, probably affecting most modern Linuxes
On 6/6/23, Philippe Troin <phil@xxxxxxxx> wrote:
> On Tue, 2023-06-06 at 16:01 +0100, Peter Stephenson wrote:
>> > On 06/06/2023 15:38 Jun. T <takimoto-j@xxxxxxxxxxxxxxxxx> wrote:
>> >
>> >
>> > > 2023/06/06 18:05, Peter Stephenson <p.w.stephenson@xxxxxxxxxxxx>
>> > > wrote:
>> > >
>> > > > On 06/06/2023 07:42 Jun T <takimoto-j@xxxxxxxxxxxxxxxxx> wrote:
>> > > >
>> > > > Why '-z now' is used when building binary packages? For
>> > > > security?
>> > >
>> > > I think this is just so that failure to find symbols at all will
>> > > show up quickly in the build rather than at run time, which would
>> > > be a real pain.
>> >
>> > I think '-z now' is to mark (add the flag) zftp.so so that the
>> > dynamic linker resolves all the symbols when _loading_ it;
>> > the symbols are not resolved when _building_ zftp.so.
>>
>> Yes, it does say it gets applied at the point of dlopen(), so it's
>> explicitly counteracting RTLD_LAZY.
>>
>> Is this specific to the Fedora configuration in their own source
>> package? I don't see an obvious sign the standard zsh build itself
>> is making this choice. configure has some system-specific tweaks
>> for dynamic loading, but not this.
>
> "-z now" is automatically added to all builds by the hardening
> configuration on RedHat/Fedora and possibly derived distributions:
>
> % ag -- -Wl.*now /usr/lib/rpm/
> /usr/lib/rpm/macros.d/macros.rust
> 46: -Clink-arg=-Wl,-z,now
>
> /usr/lib/rpm/redhat/macros
> 302:%_hardening_ldflags -Wl,-z,now %[ "%{toolchain}" == "gcc" ?
> "-specs=/usr/lib/rpm/redhat/redhat-hardened-ld" : "" ]
The zftp module's setup_ function is:
int
setup_(UNUSED(Module m))
{
return (require_module("zsh/net/tcp", NULL, 0) == 1);
}
So the module providing the "missing" symbol will always be loaded
before any functions in zftp using it will be called, and there will
not be any failed symbol resolutions at runtime, which we indicate by
the RTLD_LAZY flag to dlopen().
The glibc manpage says
RTLD_LAZY Perform lazy binding. Resolve symbols only as the
code that references them
is executed. If the symbol is never referenced, then it is never resolved.
The posix manpage does not agree with the glibc manpage and says
RTLD_LAZY Relocations shall be performed at an
implementation-defined time, ranging from the time of the dlopen()
call until the first reference to a given symbol occurs.
Ie, it allows the behavior in Fedora.
I guess it would probably not be very hard to make this work on both
setups. Another workaround you (or the packager) could do in the
meantime is to statically link the tcp module.
--
Mikael Magnusson
- References:
- [Bug] modules zsh/tcp, zsh/zftp unloadable, probably affecting most modern Linuxes
- Re: [Bug] modules zsh/tcp, zsh/zftp unloadable, probably affecting most modern Linuxes
- Re: [Bug] modules zsh/tcp, zsh/zftp unloadable, probably affecting most modern Linuxes
- Re: [Bug] modules zsh/tcp, zsh/zftp unloadable, probably affecting most modern Linuxes
- Re: [Bug] modules zsh/tcp, zsh/zftp unloadable, probably affecting most modern Linuxes
- Re: [Bug] modules zsh/tcp, zsh/zftp unloadable, probably affecting most modern Linuxes
- Re: [Bug] modules zsh/tcp, zsh/zftp unloadable, probably affecting most modern Linuxes
- Re: [Bug] modules zsh/tcp, zsh/zftp unloadable, probably affecting most modern Linuxes
- Re: [Bug] modules zsh/tcp, zsh/zftp unloadable, probably affecting most modern Linuxes
- Re: [Bug] modules zsh/tcp, zsh/zftp unloadable, probably affecting most modern Linuxes
Messages sorted by:
Reverse Date,
Date,
Thread,
Author