4 ms·
There are already compiler patches for retpoline, but section 5.2 is alarming for Skylake and above: "When the return stack buffer “stack” is empty on [>= Skyl
by Scaevolus 9y ago
There are already compiler patches for retpoline, but section 5.2 is alarming for Skylake and above:
"When the return stack buffer “stack” is empty on [>= Skylake] processors, a RET instruction may speculate based on the contents of the indirect branch predictor, the structure that retpoline is designed to avoid. The RSB may become empty under the following conditions:
1. Call stacks deeper than the minimum RSB depth (16) may empty the RSB when executing RET instructions. This includes CALL instructions and RET instructions within aborting TSX transactions.
[list of ~10 other situations that empty the RSB stack]"
They describe an "RSB stuffing" procedure, but I don't see any realistic way to guarantee that it happens properly with general code. How many call stacks do you have that are more than 16 frames deep? How many of those are recursive or dynamic?
- hansendc 9y agoDisclaimer: I put a big chunk of that paper together. You ask how it can be guaranteed with "general code". The first thing to remember is that retpoline is not for "general code". Linux, for instance, does not support arbitrary call depth and barely uses recursion. Also, take a close look at the "Exploit Composition" section of the paper. Those five conditions are much harder to satisfy at 'RET' than they are during the demonstrated Spectre variant 2 exploit points. For instance, a long speculation window (#5) for 'RET' is interesting to generate since it means a stall while waiting on something to come off the stack.
- anarazel 9y agoBut there's plenty userland software that has code with different privilege levels running in it. E.g. databases.
- jesup 9y ago"Linux, for instance, does not support arbitrary call depth and barely uses recursion." Perhaps there's context missing from that statement? Linux certainly can have arbitrarily deep call depth, depending on the stack size. Are you referring to the kernel? That would be odd, since the paper talks about application code needing to be fully recompiled with retpoline to be safe. (Of course, that means that all libraries you link with or dynamically load have to be compiled with retpoline too.)
- hansendc 9y agoYes, I was referring to the Linux kernel: it does barely uses recursion and has small stack sizes compared to normal applications.