Re: [PATCH v2 0/5] Usermode Indirect Branch Tracking
Florian Weimer <[email protected]>
| Newsgroups | org.kernel.vger.linux-api,org.kernel.vger.linux-kernel,org.kernel.vger.linux-kselftest |
|---|---|
| Message-ID | <[email protected]> |
* 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/[email protected]/ > > 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