On Tue, Apr 28, 2020 at 6:41 AM Andrew Cooper <andrew.coop...@citrix.com> wrote:
>
> On 28/04/2020 14:00, H.J. Lu wrote:
> > On Tue, Apr 28, 2020 at 5:43 AM Andrew Cooper <andrew.coop...@citrix.com> 
> > wrote:
> >> Hello,
> >>
> >> I raised https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93654 but it has
> >> had nothing but tumbleweeds in months, and it is continuing to cause
> >> problems for Xen.
> >>
> >> During the Spectre embargo period, it was specifically identified that
> >> kernels would need to be able to compile one single binary, which was
> >> retpoline safe on older hardware, and able to use CET on newer hardware.
> >>
> >> thunk-extern was deliberately constructed (along with
> >> -mindirect-branch-register) such that the thunk could be turned into
> >> something which wasn't a ROP gadget when hardware was less broken.  Both
> >> Linux and Xen use this, with the ability to substitute the exact thunk
> >> in use to be suitable for the CPU booted on.  (In particular, AMD
> >> recommend `lfence; jmp *%reg` over the traditional retpoline thunk.)
> >>
> >>
> >> A consequence of GCC rejecting this combination is that Linux has
> >> unilaterally disabled -fcf-protection
> >>
> >> # ensure -fcf-protection is disabled when using retpoline as it is
> >> # incompatible with -mindirect-branch=thunk-extern
> >> ifdef CONFIG_RETPOLINE
> >> KBUILD_CFLAGS += $(call cc-option,-fcf-protection=none)
> >> endif
> >>
> >> and a change similar to this is being proposed for Xen.  However, doing
> >> this will leave distros with the choice between disabling retpoline or
> >> not using CET, which is not in the best security interest of the user.
> >>
> >> Please can the original change be partially reverted?  thunk-extern
> >> means "I'm providing the thunks, and I'll take care of ensuring that
> >> they are appropriate", and that includes not being a ROP gadget when CET
> >> is active.
> >>
> > Please DO disable -fcf-protection in the kernel build.  We are enabling
> > CET for the user space first.   The kernel CET will be the next.
> >
> > I am enclosing a proposal to make -fcf-protection compatible with retpoline.
> > It targets user space.  It can be made compatible with kernel.
>
> Its fine to focus on userspace first, but the kernel is far more simple.
>
> Looking at that presentation, the only thing missing for kernel is the
> notrack thunks, in the unlikely case that such code would be tolerated
> (Frankly, I don't expect Xen or Linux to run with notrack enabled, as
> there is no legacy code to be concerned with).
>
> What is going to happen about unbreaking this combination of options?
> How will we know when kernel mode is supported (not that I can see
> anything further required from the toolchain)?  I really hope you're not

My proposal requires assembler, linker and compiler changes.

> suggesting that we'll need to use something separate such as
> -fcf-protection=magic-kernel-mode when plain -fcf-protection would do.

-mcmodel=kernel should be sufficient.  If

-mcmodel=kernel -fcf-protection -mindirect-branch=thunk-extern

works, your toolchain has implemented my proposal.

-- 
H.J.

Reply via email to