From: Florian Weimer <fweimer@redhat.com>
To: Jann Horn <jannh@google.com>
Cc: oss-security@lists.openwall.com, x86-64-abi@googlegroups.com,
Kernel Hardening <kernel-hardening@lists.openwall.com>,
Szabolcs Nagy <szabolcs.nagy@arm.com>
Subject: Re: Alternative CET ABI
Date: Thu, 30 Jul 2020 18:54:50 +0200 [thread overview]
Message-ID: <87h7tpeyed.fsf@oldenburg2.str.redhat.com> (raw)
In-Reply-To: <CAG48ez3OF7DPupKv9mBBKmg-9hDVhVe83KrJ4Jk=CL0nOc7=Jg@mail.gmail.com> (Jann Horn's message of "Thu, 30 Jul 2020 18:41:40 +0200")
* Jann Horn:
> On Thu, Jul 30, 2020 at 6:02 PM Florian Weimer <fweimer@redhat.com> wrote:
>> Functions no longer start with the ENDBR64 prefix. Instead, the link
>> editor produces a PLT entry with an ENDBR64 prefix if it detects any
>> address-significant relocation for it. The PLT entry performs a NOTRACK
>> jump to the target address. This assumes that the target address is
>> subject to RELRO, of course, so that redirection is not possible.
>> Without address-significant relocations, the link editor produces a PLT
>> entry without the ENDBR64 prefix (but still with the NOTRACK jump), or
>> perhaps no PLT entry at all.
>
> How would this interact with function pointer comparisons? As in, if
> library A exports a function func1 without referencing it, and
> libraries B and C both take references to func1, would they end up
> with different function pointers (pointing to their respective PLT
> entries)?
Same as today. ELF already deals with this by picking one canonical
function address per process.
Some targets already need PLTs for inter-DSO calls, so the problem is
not new. It happens even on x86 because the main program can refer to
its PLT stubs without run-time relocations, so those determine the
canonical address of those functions, and not the actual implementation
in a shared object.
> Would this mean that the behavior of a program that compares
> function pointers obtained through different shared libraries might
> change?
Hopefully not, because that would break things quite horribly (as it's
sometimes possible to observe if the RTLD_DEEPBIND flag is used).
Both the canonicalization and the fact in order to observe the function
pointer, you need to take its address should take care of this.
> I guess you could maybe canonicalize function pointers somehow, but
> that'd probably at least break dlclose(), right?
Ahh, dlclose. I think in this case, my idea to generate a PLT stub
locally in the address-generating DSO will not work because the
canonical address must survive dlclose if it refers to another DSO.
There are two ways to deal with this: do not unload the PLT stub until
the target DSO is also unloaded (but make sure that the DSO can be
reloaded at a different address; probably not worth the complexity),
or use the dlsym hack I sketched for regular symbol binding as well.
Even more room for experiments, I guess.
Thanks,
Florian
next prev parent reply other threads:[~2020-07-30 16:56 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-30 16:01 Alternative CET ABI Florian Weimer
2020-07-30 16:41 ` Jann Horn
2020-07-30 16:47 ` Szabolcs Nagy
2020-07-30 16:54 ` Florian Weimer [this message]
2020-07-30 17:14 ` H.J. Lu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87h7tpeyed.fsf@oldenburg2.str.redhat.com \
--to=fweimer@redhat.com \
--cc=jannh@google.com \
--cc=kernel-hardening@lists.openwall.com \
--cc=oss-security@lists.openwall.com \
--cc=szabolcs.nagy@arm.com \
--cc=x86-64-abi@googlegroups.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.