On Tue, Oct 25, 2022 at 03:00:35PM -0700, Dave Hansen wrote: > On 10/25/22 04:07, Peter Zijlstra wrote: > > I think the focus should be on finding the source sites, not protecting > > the target sites. Where can an attacker control the register content and > > have an indirect jump/call. > > How would this work with something like 'struct file_operations' which > provide a rich set of indirect calls that frequently have fully > user-controlled values in registers? > > It certainly wouldn't *hurt* to be zeroing out the registers that are > unused at indirect call sites. But, the majority of gadgets in this > case used rdi and rsi, which are the least likely to be able to be > zapped at call sites. Right; so FineIBT will limit the targets to the right set of functions, and those functions must already assume the values are user controlled and take appropriate measures. If you really truly care about the old hardware, then one solution would be to de-virtualize the call using LTO or something (yes, it will need some compiler work and you might need to annotate the code a bit and even have a fixed/predetermined set of loadable modules, but meh). Barring that, you could perhaps put {min,max} range information next to the function pointer such that you can impose value ranges before doing the indirect call. But given this is all theoretical and FineIBT solves a lot of it I can't find myself to care too much.