Retpoline integration
Thomas Wuerthinger
thomas.wuerthinger at oracle.com
Sun Jan 7 18:35:50 UTC 2018
CVE-2017-5753 is not addressed in the linked document. And jcc instructions are quite common.
A software-level fix for managed languages seems to be to mask the index of array accesses. There is however a performance impact; in particular if the mask should guarantee isolation within the heap and not just isolation of heap vs off-heap accesses (like currently applied in the browser engines). So what one could do is to change every array access code:
array[index]
Into this:
array[min(index, length-1)]
And calculate min(index, length) without any branching via:
array[index + ((length-1-index) & (length-1-index)>>31)]
I created pull request https://github.com/graalvm/graal/pull/279 <https://github.com/graalvm/graal/pull/279> with a patch that performs the modification in Graal to create such a guard for every array access.
- thomas
> On 05.01.2018, at 11:50, Mike Hearn <mike at plan99.net> wrote:
>
> [fixing the email address for the c2 developer list]
>
> Hi Remi,
>
> Currently unclear: there's this semi-helpful table that suggests it may
> still be needed on some chips, for variant 2?
>
> https://docs.google.com/document/d/e/2PACX-1vSMrwkaoSUBAFc6Fjd19F18c1O9pudkfAY-7lGYGOTN8mc9ul-J6pWadcAaBJZcVA7W_3jlLKRtKRbd/pub
>
> Yesterday AMD was saying Spectre doesn't affect them, but it's not clear
> from reading the paper that this is really true. ARM's advice is somewhat
> similar to retpoline (insertion of barriers into recompiled code):
>
> https://developer.arm.com/support/security-update/download-the-whitepaper
>
> Also, for variant 1 compiler changes are still being recommended by Google
> for anything that compiles and runs sandboxed code, like a JVM. But this
> isn't the retpoline, it's a different set of changes.
>
> Still, the news of an impending microcode update is very welcome. It was
> not being mentioned yesterday at all, although the ability to patch variant
> 2 via microcode would seem to be critical information (!). Given that there
> was a coordinated embargo it seemed like the workarounds being proposed
> yesterday would be finalised, but apparently not.
>
> So, I probably jumped the gun a bit here. Better to wait for activity on
> the kernel mailing list to settle down before drawing conclusions on what
> the final set of needed fixes are.
>
>
> On Fri, Jan 05, 2018 at 01:29:30, Remi Forax<forax at univ-mlv.fr>wrote:
>
>> Hi Mike,
>> as far as i understand, it seems that at least Intel has provided a patch
>> to mitigate CVE-2017-5715 so retpoline may not be necessary [1].
>>
>> Rémi
>> [1] https://security.googleblog.com/2018/01/
>> more-details-about-mitigations-for-cpu_4.html
>>
>> ----- Mail original -----
>>
>> De: "Mike Hearn" <mike at plan99.net>
>> À: graal-dev at openjdk.java.net, hotspot-compiler-dev at mail.openjdk.net
>> Envoyé: Jeudi 4 Janvier 2018 15:38:40
>> Objet: Retpoline integration
>>
>> Hello,
>>
>> I'm sure many of us spent this morning reading about the new set of side
>> channel based attacks that dropped today (Spectre and Meltdown
>> <https://spectreattack.com/>). Looks like the talk I gave on side
>> channels to the Graal team in Zürich may have been well timed!
>>
>> While some of these attacks are mitigated by kernel changes, Spectre seems
>> to have the problematic property that it works across protection domains
>> against programs that contain indirect jumps/virtual calls i.e. all of
>> them. Programs that contain such code patterns can have sensitive data
>> extracted that was meant to be protected by the page table mappings.
>>
>> There is a fix, at least for the current wave of side channel attacks (we
>> will without a doubt see more advanced attacks in future). It is truly
>> atrocious but easy to implement inside a JIT compiler. Google describe it
>> conceptually here:
>>
>> https://support.google.com/faqs/answer/7625886
>>
>> A patch for LLVM is available here - I provide a Google cache link because
>> LLVM's review website appears to have been taken offline, probably by
>> weight of traffic right now. Arm's website is also hosed, very likely for
>> the same reason.
>>
>> http://webcache.googleusercontent.com/
>> search?q=cache%3Ahttps%3A%2F%2Freviews.llvm.
>> org%2FD41723&oq=cache%3Ahttps%3A%2F%2Freviews.llvm.
>> org%2FD41723&aqs=chrome..69i57j69i58.950j0j4&sourceid=chrome&ie=UTF-8
>>
>> Essentially all calls that cannot be devirtualised have to jump through a
>> special code pattern that has the effect of breaking the speculative
>> execution unit on the core (the so-called "ret trampoline" or "retpoline").
>> Unfortunately this has a performance impact: LLVM team report about 10% on
>> real world software, that's *after* PGO is applied. I hope that the JVM is
>> capable of devirtualising more calls than LLVM can.
>>
>> Please note that the actual code pattern that should be used seems to be
>> varying between different projects, perhaps due to the early collapse of
>> the security embargo. The Linux kernel is using *lfence* instructions to
>> block speculative execution, but the Google web page describes using
>> *pause* to put the speculated execution stream into an infinite loop.
>> According to a footnote in the Spectre paper *lfence* is sufficient to
>> block speculation and Intel is updating their ISA reference to make this
>> behaviour officially documented, so *lfence* is probably the one to go for.
>>
>> Are there any plans to update Graal or C2 to include this optional
>> mitigation? (optional because, it only matters if you share your CPU cores
>> with untrusted code).
>>
>>
More information about the graal-dev
mailing list