From: Sean Christopherson <sean.j.christopherson@intel.com>
To: Borislav Petkov <bp@alien8.de>
Cc: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>,
linux-kernel@vger.kernel.org, x86@kernel.org,
linux-sgx@vger.kernel.org, akpm@linux-foundation.org,
dave.hansen@intel.com, nhorman@redhat.com, npmccallum@redhat.com,
serge.ayoun@intel.com, shay.katz-zamir@intel.com,
haitao.huang@intel.com, andriy.shevchenko@linux.intel.com,
tglx@linutronix.de, kai.svahn@intel.com, josh@joshtriplett.org,
luto@kernel.org, kai.huang@intel.com, rientjes@google.com,
cedric.xing@intel.com, Kai Huang <kai.huang@linux.intel.com>,
Haim Cohen <haim.cohen@intel.com>
Subject: Re: [PATCH v22 02/24] x86/cpufeatures: x86/msr: Intel SGX Launch Control hardware bits
Date: Tue, 24 Sep 2019 13:22:10 -0700 [thread overview]
Message-ID: <20190924202210.GC16218@linux.intel.com> (raw)
In-Reply-To: <20190924155232.GG19317@zn.tnic>
On Tue, Sep 24, 2019 at 05:52:32PM +0200, Borislav Petkov wrote:
> On Tue, Sep 03, 2019 at 05:26:33PM +0300, Jarkko Sakkinen wrote:
> > From: Kai Huang <kai.huang@linux.intel.com>
> >
> > Add X86_FEATURE_SGX_LC, which informs whether or not the CPU supports SGX
> > Launch Control.
> >
> > Add MSR_IA32_SGXLEPUBKEYHASH{0, 1, 2, 3}, which when combined contain a
> > SHA256 hash of a 3072-bit RSA public key. SGX backed software packages, so
> > called enclaves, are always signed. All enclaves signed with the public key
> > are unconditionally allowed to initialize. [1]
> >
> > Add FEATURE_CONTROL_SGX_LE_WR bit of the feature control MSR, which informs
> > whether the formentioned MSRs are writable or not. If the bit is off, the
> > public key MSRs are read-only for the OS.
> >
> > If the MSRs are read-only, the platform must provide a launch enclave (LE).
> > LE can create cryptographic tokens for other enclaves that they can pass
> > together with their signature to the ENCLS(EINIT) opcode, which is used
> > to initialize enclaves.
> >
> > Linux is unlikely to support the locked configuration because it takes away
> > the control of the launch decisions from the kernel.
>
> Right, who has control over FEATURE_CONTROL_SGX_LE_WR? Can the
> kernel set it and put another hash in there or there will be locked
> configurations where setting that bit will trap?
Short answer, BIOS controls SGX_LE_WR.
The approach we chose (patch 04, which we were discussing) is to disable
SGX if SGX_LE_WR is not set, i.e. disallow SGX unless the hash MSRs exist
and are fully writable.
WRMSR will #GP if FEATURE_CONTROL is locked (bit 0), e.g. attempting to
set SGX_LE_WR will trap if FEATURE_CONTROL was locked by BIOS. And
conversely, the various enable bits in FEATURE_CONTROL don't take effect
until FEATURE_CONTROL is locked, e.g. the LE hash MSRs aren't writable if
FEATURE_CONTROL is unlocked, regardless of whether SGX_LE_WR is set.
> I don't want to leave anything in the hands of the BIOS controlling
> whether the platform can set its own key because BIOS is known to f*ck
> it up almost every time. And so I'd like for us to be able to fix up
> things without depending on the mood of some OEM vendor's BIOS fixing
> desire.
Sadly, because FEATURE_CONTROL must be locked to fully enable SGX, the
reality is that any BIOS that supports SGX will lock FEATURE_CONTROL.
That's the status quo today as well since VMX (and SMX/TXT) is also
enabled via FEATURE_CONTROL. KVM does have logic to enable VMX and lock
FEATURE_CONTROL if the MSR isn't locked, but AIUI that exists only to work
with old BIOSes.
If we want to support setting and locking FEATURE_CONTROL in the extremely
unlikely scenario that BIOS left it unlocked, the proper change would be
to move the existing KVM FEATURE_CONTROL logic into the early-ish boot
flow and try to set all known bits before locking FEATURE_CONTROL. I
don't have a strong preference either way. We opted not to try and set
FEATURE_CONTROL as we felt that doing so was more likely to cause breakage
than it was to actually "fix" a broken BIOS.
> > [1] Intel SDM: 38.1.4 Intel SGX Launch Control Configuration
One note on Launch Control that isn't covered in the SDM: the LE hash
MSRs can also be written before SGX is activated. SGX activation must
occur before FEATURE_CONTROL is locked, meaning BIOS can set the LE
hash MSRs to a non-intel and then lock FEATURE_CONTROL with SGX_LE_WR=0.
There's a blurb on SGX activation in the kernel docs (patch 23).
> > diff --git a/arch/x86/include/asm/cpufeatures.h b/arch/x86/include/asm/cpufeatures.h
> > index c5582e766121..ca82226e25ec 100644
> > --- a/arch/x86/include/asm/cpufeatures.h
> > +++ b/arch/x86/include/asm/cpufeatures.h
> > @@ -355,6 +355,7 @@
> > #define X86_FEATURE_CLDEMOTE (16*32+25) /* CLDEMOTE instruction */
> > #define X86_FEATURE_MOVDIRI (16*32+27) /* MOVDIRI instruction */
> > #define X86_FEATURE_MOVDIR64B (16*32+28) /* MOVDIR64B instruction */
> > +#define X86_FEATURE_SGX_LC (16*32+30) /* Software Guard Extensions Launch Control */
>
> Amazing. SGX feature bits are spread around at least three CPUID leafs:
>
> 7_EBX, 7_ECX, 12_EAX. Maybe there's a 4th somewhere because hey... :-\
Heh, why stop at 4? 12_EBX, 12_1_ECX and 12_1_EDX are effectively feature
leafs as well, although the kernel can ignore them for the most part.
next prev parent reply other threads:[~2019-09-24 20:22 UTC|newest]
Thread overview: 102+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-03 14:26 [PATCH v22 00/24] Intel SGX foundations Jarkko Sakkinen
2019-09-03 14:26 ` [PATCH v22 01/24] x86/cpufeatures: x86/msr: Add Intel SGX hardware bits Jarkko Sakkinen
2019-09-24 15:28 ` Borislav Petkov
2019-09-24 16:11 ` Sean Christopherson
2019-09-24 16:25 ` Borislav Petkov
2019-09-03 14:26 ` [PATCH v22 02/24] x86/cpufeatures: x86/msr: Intel SGX Launch Control " Jarkko Sakkinen
2019-09-24 15:52 ` Borislav Petkov
2019-09-24 20:22 ` Sean Christopherson [this message]
2019-09-25 8:51 ` Borislav Petkov
2019-09-25 17:18 ` Sean Christopherson
2019-09-25 18:31 ` Borislav Petkov
2019-09-25 19:08 ` Sean Christopherson
2019-09-27 16:11 ` Jarkko Sakkinen
2019-09-25 14:09 ` Jarkko Sakkinen
2019-09-25 14:10 ` Jarkko Sakkinen
2019-09-25 14:38 ` Jarkko Sakkinen
2019-09-25 15:19 ` Borislav Petkov
2019-09-25 16:49 ` Sean Christopherson
2019-09-25 17:28 ` Borislav Petkov
2019-09-25 18:18 ` Sean Christopherson
2019-09-03 14:26 ` [PATCH v22 03/24] x86/mm: x86/sgx: Signal SIGSEGV with PF_SGX Jarkko Sakkinen
2019-09-24 16:04 ` Borislav Petkov
2019-09-25 14:16 ` Jarkko Sakkinen
2019-09-03 14:26 ` [PATCH v22 04/24] x86/cpu/intel: Detect SGX supprt Jarkko Sakkinen
2019-09-24 16:13 ` Borislav Petkov
2019-09-24 17:43 ` Sean Christopherson
2019-09-24 18:21 ` Borislav Petkov
2019-09-25 14:46 ` Jarkko Sakkinen
2019-09-03 14:26 ` [PATCH v22 05/24] x86/sgx: Add ENCLS architectural error codes Jarkko Sakkinen
2019-09-27 10:20 ` Borislav Petkov
2019-09-27 16:08 ` Jarkko Sakkinen
2019-09-27 17:20 ` Sean Christopherson
2019-10-01 20:23 ` Jarkko Sakkinen
2019-09-03 14:26 ` [PATCH v22 06/24] x86/sgx: Add SGX microarchitectural data structures Jarkko Sakkinen
2019-09-27 16:27 ` Borislav Petkov
2019-10-01 19:10 ` Jarkko Sakkinen
2019-10-01 20:39 ` Jarkko Sakkinen
2019-09-03 14:26 ` [PATCH v22 07/24] x86/sgx: Add wrappers for ENCLS leaf functions Jarkko Sakkinen
2019-10-04 9:45 ` Borislav Petkov
2019-10-04 18:56 ` Jarkko Sakkinen
2019-10-08 4:04 ` Sean Christopherson
2019-10-08 7:18 ` Borislav Petkov
2019-10-08 13:35 ` Sean Christopherson
2019-10-08 14:56 ` Borislav Petkov
2019-09-03 14:26 ` [PATCH v22 08/24] x86/sgx: Enumerate and track EPC sections Jarkko Sakkinen
2019-10-05 9:26 ` Borislav Petkov
2019-10-07 11:58 ` Jarkko Sakkinen
2019-09-03 14:26 ` [PATCH v22 09/24] x86/sgx: Add functions to allocate and free EPC pages Jarkko Sakkinen
2019-10-05 16:44 ` Borislav Petkov
2019-10-07 14:50 ` Sean Christopherson
2019-10-08 9:09 ` Borislav Petkov
2019-10-08 13:31 ` Sean Christopherson
2019-10-07 17:55 ` Jarkko Sakkinen
2019-10-07 18:09 ` Borislav Petkov
2019-09-03 14:26 ` [PATCH v22 10/24] x86/sgx: Add sgx_einit() for wrapping ENCLS[EINIT] Jarkko Sakkinen
2019-10-08 17:30 ` Borislav Petkov
2019-10-08 17:45 ` Sean Christopherson
2019-10-08 17:46 ` Sean Christopherson
2019-10-08 17:53 ` Borislav Petkov
2019-09-03 14:26 ` [PATCH v22 11/24] mm: Introduce vm_ops->may_mprotect() Jarkko Sakkinen
2019-10-08 17:41 ` Borislav Petkov
2019-09-03 14:26 ` [PATCH v22 12/24] x86/sgx: Linux Enclave Driver Jarkko Sakkinen
2019-10-08 17:59 ` Borislav Petkov
2019-10-08 18:17 ` Sean Christopherson
2019-10-08 19:19 ` Borislav Petkov
2019-09-03 14:26 ` [PATCH v22 13/24] x86/sgx: Add provisioning Jarkko Sakkinen
2019-09-03 14:26 ` [PATCH v22 14/24] x86/sgx: Add a page reclaimer Jarkko Sakkinen
2019-09-03 14:26 ` [PATCH v22 15/24] x86/sgx: ptrace() support for the SGX driver Jarkko Sakkinen
2019-09-03 14:26 ` [PATCH v22 16/24] x86/vdso: Add support for exception fixup in vDSO functions Jarkko Sakkinen
2019-10-02 23:18 ` Jarkko Sakkinen
2019-10-02 23:45 ` Jarkko Sakkinen
2019-10-04 0:03 ` Sean Christopherson
2019-10-04 18:49 ` Jarkko Sakkinen
2019-10-04 0:15 ` Sean Christopherson
2019-10-04 18:52 ` Jarkko Sakkinen
2019-10-05 15:54 ` Sean Christopherson
2019-10-07 7:57 ` Jarkko Sakkinen
2019-10-07 8:10 ` Jarkko Sakkinen
2019-10-07 12:04 ` Jarkko Sakkinen
2019-10-08 4:54 ` Sean Christopherson
2019-10-05 18:39 ` Sean Christopherson
2019-10-07 8:01 ` Jarkko Sakkinen
2019-10-06 23:38 ` Jarkko Sakkinen
2019-10-06 23:40 ` Jarkko Sakkinen
2019-09-03 14:26 ` [PATCH v22 17/24] x86/fault: Add helper function to sanitize error code Jarkko Sakkinen
2019-09-03 14:26 ` [PATCH v22 18/24] x86/traps: Attempt to fixup exceptions in vDSO before signaling Jarkko Sakkinen
2019-09-03 14:26 ` [PATCH v22 19/24] x86/vdso: Add __vdso_sgx_enter_enclave() to wrap SGX enclave transitions Jarkko Sakkinen
2019-09-03 14:26 ` [PATCH v22 20/24] selftests/x86: Add a selftest for SGX Jarkko Sakkinen
2019-09-03 14:26 ` [PATCH v22 21/24] selftests/x86: Recurse into subdirectories Jarkko Sakkinen
2019-09-03 14:26 ` [PATCH v22 22/24] x86/sgx: Update MAINTAINERS Jarkko Sakkinen
2019-09-03 14:26 ` [PATCH v22 23/24] docs: x86/sgx: Document microarchitecture Jarkko Sakkinen
2019-09-27 18:15 ` Randy Dunlap
2019-09-03 14:26 ` [PATCH v22 24/24] docs: x86/sgx: Document kernel internals Jarkko Sakkinen
2019-09-27 17:07 ` Randy Dunlap
2019-10-01 19:34 ` Jarkko Sakkinen
2019-09-13 20:38 ` [PATCH v22 00/24] Intel SGX foundations Dave Hansen
2019-09-14 13:41 ` Jarkko Sakkinen
2019-09-14 15:32 ` Dave Hansen
2019-09-16 5:23 ` Jarkko Sakkinen
2019-09-24 17:20 ` Andy Lutomirski
2019-09-25 14:32 ` Jarkko Sakkinen
2019-10-02 23:42 ` Jarkko Sakkinen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190924202210.GC16218@linux.intel.com \
--to=sean.j.christopherson@intel.com \
--cc=akpm@linux-foundation.org \
--cc=andriy.shevchenko@linux.intel.com \
--cc=bp@alien8.de \
--cc=cedric.xing@intel.com \
--cc=dave.hansen@intel.com \
--cc=haim.cohen@intel.com \
--cc=haitao.huang@intel.com \
--cc=jarkko.sakkinen@linux.intel.com \
--cc=josh@joshtriplett.org \
--cc=kai.huang@intel.com \
--cc=kai.huang@linux.intel.com \
--cc=kai.svahn@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sgx@vger.kernel.org \
--cc=luto@kernel.org \
--cc=nhorman@redhat.com \
--cc=npmccallum@redhat.com \
--cc=rientjes@google.com \
--cc=serge.ayoun@intel.com \
--cc=shay.katz-zamir@intel.com \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).