Re: [PATCH v2 0/5] Usermode Indirect Branch Tracking
From: Florian Weimer
Date: Sat Jun 06 2026 - 09:40:37 EST
* Richard Patel:
> On Fri, Jun 05, 2026 at 09:34:46PM +0200, Florian Weimer wrote:
>
>> How do you detect that handling a signal is complete and IBT can be
>> re-enabled? Or is it re-enabled before entering the userspace signal
>> handler?
>
> Hi Florian,
>
> In v1, we backed up the IBT CPU state into the (user-accessible) signal
> frame from FRED/XSAVE, then restored it:
> https://lore.kernel.org/lkml/20260517183024.16292-4-ripatel@xxxxxxx/
>
> In v2, when entering the signal handler, the kernel just context switches
> to the new user rip, bypassing IBT checks (continues executing if the
> signal handler does not begin with endbr).
What's the reason for this?
> Some time in the future, ideally:
> - signal handler is *required* to start with endbr (this is easy)
> - sigreturn as in my asm example enforces endbr after returning from a
> signal handler to a in-progres indirect branc
> - libc (sig)longjmp is made IBT-compatible
I think the compiler already emits ENDBR markers for returns-twice
functions, which is why longjmp does not use a no-track jump. Other
architectures require such a proliferation of markers because they do
not support no-track jumps at all. However, longjmp is arguable a
corner case. It's not completely safe, like loading a function address
from a RELRO GOT and jumping to it.
> Btw, I had self-tests for the v1 design, and {signal handle,rt_sigreturn,
> siglongjmp} with {success case,violation} works flawlessly with Fedora 44
> glibc amd64. With glibc i686 I ran into PLT issues, probably my fault.
There's no IBT support planned for i686, that's why we dropped all
marker instructions in Fedora.
> It is quite surprised that siglongjmp was working, btw, since the glibc
> longjmp code uses 'jmp *reg' (without notrack prefix). I guess you do an
> endbr64 at the setjmp side?
Yes, compilers generate landing pads for returns-twice functions. Not
ideal, but it's the only way to get setjmp working on targets without
NOTRACK.
>> Adding the ELF GNU note parsing can be added later, but perhaps not
>> cleanly. I'm still a bit worried we might have to rev the markup
>> because too many binaries are in circulation that claim compatibility,
>> have never been tested, and are actually broken. If the kernel does not
>> look at the ELF bits, things a slightly simpler.
>
> Phew, I was hoping you'd say that.
>
> If you want, I can sketch out glibc IBT enabling and test it on Debian
> and Fedora, which IIRC already emit compile with -fcf-protection=branch
> for all OS packages.
For Fedora, please coordinate with Arjun (Cc:ed), who is going through
the motions of enabling SHSTK for real.
>> That's not necessarily a problem because its address cannot be directly
>> overwritten in userspace. Not all indirect branches need to be checked,
>> only those that have tweakable targets. In fact, fewer ENDBR64 markers
>> are better (although we wouldn't drop the marker from a signal handler
>> specifically, of course).
>
> Just one concern I have is that people start relying on signal handlers
> not requiring endbr64, and then a future kernel version breaking them once
> we enforce it.
Would software enforcement be a possibility? The kernel could check if
the landing pad is there.
Thanks,
Florian