Re: [PATCH v10 02/15] livepatch: avoid position-based search if `-z unique-symbol` is available

From: Josh Poimboeuf
Date: Mon Feb 14 2022 - 16:21:28 EST


NOTE: Maybe -zunique-symbol won't get used after all, based on maskray's
objections. Regardless, I'm replying below, because the rest of the
approach in this patch seems all wrong.

On Mon, Feb 14, 2022 at 01:14:47PM +0100, Alexander Lobakin wrote:
> From: Josh Poimboeuf <jpoimboe@xxxxxxxxxx>
> Date: Fri, 11 Feb 2022 09:41:30 -0800
>
> > On Wed, Feb 09, 2022 at 07:57:39PM +0100, Alexander Lobakin wrote:
> > > Position-based search, which means that if there are several symbols
> > > with the same name, the user needs to additionally provide the
> > > "index" of a desired symbol, is fragile. For example, it breaks
> > > when two symbols with the same name are located in different
> > > sections.
> > >
> > > Since a while, LD has a flag `-z unique-symbol` which appends
> > > numeric suffixes to the functions with the same name (in symtab
> > > and strtab). It can be used to effectively prevent from having
> > > any ambiguity when referring to a symbol by its name.
> >
> > In the patch description can you also give the version of binutils (and
> > possibly other linkers) which have the flag?
>
> Yeah, sure.

> > > Check for its availability and always prefer when the livepatching
> > > is on. It can be used unconditionally later on after broader testing
> > > on a wide variety of machines, but for now let's stick to the actual
> > > CONFIG_LIVEPATCH=y case, which is true for most of distro configs
> > > anyways.
> >
> > Has anybody objected to just enabling it for *all* configs, not just for
> > livepatch?
>
> A few folks previously.

Why? It would be good to document that here.

> > I'd much prefer that: the less "special" livepatch is (and the distros
> > which enable it), the better. And I think having unique symbols would
> > benefit some other components.
>
> Agree, I just want this series to be as least invasive for
> non-FG-KASLR builds as possible.

But in a very real sense, this patch is making the series *more*
invasive by complexifying the config space.

Adding -zunique-symbols could have kernel-wide implications. If there
were bugs, we'd want to root them out, not hide them behind obscure
config combinations we hope nobody uses. Effectively this is
destabilizing CONFIG_LIVEPATCH.

Beyond "least invasive", we also need to consider:

- What makes fgkaslr most compatible with other features?
- What makes fgkaslr most palatable for wide use?
- What's best for the kernel as a whole?

It's much better to integrate new features properly with the kernel,
rather than just grafting them on to the side. Otherwise it just adds
technical debt, with no benefit to the rest of the kernel. Then it
might as well just remain an out-of-tree patch set.

> > > + if (IS_ENABLED(CONFIG_LD_HAS_Z_UNIQUE_SYMBOL))
> > > + sympos = 0;
> > > +
> >
> > Similarly, I don't see a need for this. If the patch is legit then
> > sympos should already be zero. If not, an error gets reported and the
> > patch fails to load.
>
> Right, but for both those chunks the main idea is to let the
> compiler optimize-out the code non-actual for unique-symbol builds:
>
> add/remove: 0/0 grow/shrink: 1/2 up/down: 3/-80 (-77)
> Function old new delta
> klp_find_callback 139 142 +3
> klp_find_object_symbol.cold 85 48 -37
> klp_find_object_symbol 168 125 -43

As I said, it's not a hot path, so there's no need to complicate the
code with edge cases, and remove useful error checking in the process.

--
Josh