From: Jarkko Sakkinen <jarkko@kernel.org>
To: Kai Huang <kai.huang@intel.com>
Cc: linux-sgx@vger.kernel.org, kvm@vger.kernel.org, x86@kernel.org,
seanjc@google.com, luto@kernel.org, dave.hansen@intel.com,
haitao.huang@intel.com, pbonzini@redhat.com, bp@alien8.de,
tglx@linutronix.de, mingo@redhat.com, hpa@zytor.com
Subject: Re: [RFC PATCH v2 14/26] x86/sgx: Move provisioning device creation out of SGX driver
Date: Wed, 20 Jan 2021 16:09:45 +0200 [thread overview]
Message-ID: <YAg5qU5KMGLuPdjy@kernel.org> (raw)
In-Reply-To: <4aeb65be69701a4a6e7d479ad3563bf7a9f052d5.1610935432.git.kai.huang@intel.com>
On Mon, Jan 18, 2021 at 04:28:07PM +1300, Kai Huang wrote:
> From: Sean Christopherson <sean.j.christopherson@intel.com>
>
> And extract sgx_set_attribute() out of sgx_ioc_enclave_provision() and
> export it as symbol for KVM to use.
>
> Provisioning key is sensitive. SGX driver only allows to create enclave
> which can access provisioning key when enclave creator has permission to
> open /dev/sgx_provision. It should apply to VM as well, as provisioning
> key is platform specific, thus unrestricted VM can also potentially
> compromise provisioning key.
>
> Move provisioning device creation out of sgx_drv_init() to sgx_init() as
> preparation for adding SGX virtualization support, so that even SGX
> driver is not enabled due to flexible launch control is not available,
> SGX virtualization can still be enabled, and use it to restrict VM's
> capability of being able to access provisioning key.
>
> Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
> Signed-off-by: Kai Huang <kai.huang@intel.com>
> ---
> arch/x86/include/asm/sgx.h | 3 +++
> arch/x86/kernel/cpu/sgx/driver.c | 17 ------------
> arch/x86/kernel/cpu/sgx/ioctl.c | 16 ++----------
> arch/x86/kernel/cpu/sgx/main.c | 45 +++++++++++++++++++++++++++++++-
> 4 files changed, 49 insertions(+), 32 deletions(-)
>
> diff --git a/arch/x86/include/asm/sgx.h b/arch/x86/include/asm/sgx.h
> index 0d643b985085..795d724fab87 100644
> --- a/arch/x86/include/asm/sgx.h
> +++ b/arch/x86/include/asm/sgx.h
> @@ -4,6 +4,9 @@
>
> #include <linux/types.h>
>
> +int sgx_set_attribute(unsigned long *allowed_attributes,
> + unsigned int attribute_fd);
> +
> #ifdef CONFIG_X86_SGX_VIRTUALIZATION
> struct sgx_pageinfo;
>
> diff --git a/arch/x86/kernel/cpu/sgx/driver.c b/arch/x86/kernel/cpu/sgx/driver.c
> index f2eac41bb4ff..4f3241109bda 100644
> --- a/arch/x86/kernel/cpu/sgx/driver.c
> +++ b/arch/x86/kernel/cpu/sgx/driver.c
> @@ -133,10 +133,6 @@ static const struct file_operations sgx_encl_fops = {
> .get_unmapped_area = sgx_get_unmapped_area,
> };
>
> -const struct file_operations sgx_provision_fops = {
> - .owner = THIS_MODULE,
> -};
> -
> static struct miscdevice sgx_dev_enclave = {
> .minor = MISC_DYNAMIC_MINOR,
> .name = "sgx_enclave",
> @@ -144,13 +140,6 @@ static struct miscdevice sgx_dev_enclave = {
> .fops = &sgx_encl_fops,
> };
>
> -static struct miscdevice sgx_dev_provision = {
> - .minor = MISC_DYNAMIC_MINOR,
> - .name = "sgx_provision",
> - .nodename = "sgx_provision",
> - .fops = &sgx_provision_fops,
> -};
> -
> int __init sgx_drv_init(void)
> {
> unsigned int eax, ebx, ecx, edx;
> @@ -184,11 +173,5 @@ int __init sgx_drv_init(void)
> if (ret)
> return ret;
>
> - ret = misc_register(&sgx_dev_provision);
> - if (ret) {
> - misc_deregister(&sgx_dev_enclave);
> - return ret;
> - }
> -
> return 0;
> }
> diff --git a/arch/x86/kernel/cpu/sgx/ioctl.c b/arch/x86/kernel/cpu/sgx/ioctl.c
> index 1bae754268d1..4714de12422d 100644
> --- a/arch/x86/kernel/cpu/sgx/ioctl.c
> +++ b/arch/x86/kernel/cpu/sgx/ioctl.c
> @@ -2,6 +2,7 @@
> /* Copyright(c) 2016-20 Intel Corporation. */
>
> #include <asm/mman.h>
> +#include <asm/sgx.h>
> #include <linux/mman.h>
> #include <linux/delay.h>
> #include <linux/file.h>
> @@ -664,24 +665,11 @@ static long sgx_ioc_enclave_init(struct sgx_encl *encl, void __user *arg)
> static long sgx_ioc_enclave_provision(struct sgx_encl *encl, void __user *arg)
> {
> struct sgx_enclave_provision params;
> - struct file *file;
>
> if (copy_from_user(¶ms, arg, sizeof(params)))
> return -EFAULT;
>
> - file = fget(params.fd);
> - if (!file)
> - return -EINVAL;
> -
> - if (file->f_op != &sgx_provision_fops) {
> - fput(file);
> - return -EINVAL;
> - }
> -
> - encl->attributes_mask |= SGX_ATTR_PROVISIONKEY;
> -
> - fput(file);
> - return 0;
> + return sgx_set_attribute(&encl->attributes_mask, params.fd);
> }
>
> long sgx_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
> diff --git a/arch/x86/kernel/cpu/sgx/main.c b/arch/x86/kernel/cpu/sgx/main.c
> index 1cf1f0f058b8..e14ddfa9b78b 100644
> --- a/arch/x86/kernel/cpu/sgx/main.c
> +++ b/arch/x86/kernel/cpu/sgx/main.c
> @@ -1,14 +1,18 @@
> // SPDX-License-Identifier: GPL-2.0
> /* Copyright(c) 2016-20 Intel Corporation. */
>
> +#include <linux/file.h>
> #include <linux/freezer.h>
> #include <linux/highmem.h>
> #include <linux/kthread.h>
> +#include <linux/miscdevice.h>
> #include <linux/pagemap.h>
> #include <linux/ratelimit.h>
> #include <linux/sched/mm.h>
> #include <linux/sched/signal.h>
> #include <linux/slab.h>
> +#include <asm/sgx_arch.h>
> +#include <asm/sgx.h>
> #include "driver.h"
> #include "encl.h"
> #include "encls.h"
> @@ -705,6 +709,38 @@ void sgx_update_lepubkeyhash(u64 *lepubkeyhash)
> wrmsrl(MSR_IA32_SGXLEPUBKEYHASH0 + i, lepubkeyhash[i]);
> }
>
> +const struct file_operations sgx_provision_fops = {
> + .owner = THIS_MODULE,
> +};
> +
> +static struct miscdevice sgx_dev_provision = {
> + .minor = MISC_DYNAMIC_MINOR,
> + .name = "sgx_provision",
> + .nodename = "sgx_provision",
> + .fops = &sgx_provision_fops,
> +};
> +
> +int sgx_set_attribute(unsigned long *allowed_attributes,
> + unsigned int attribute_fd)
kdoc
> +{
> + struct file *file;
> +
> + file = fget(attribute_fd);
> + if (!file)
> + return -EINVAL;
> +
> + if (file->f_op != &sgx_provision_fops) {
> + fput(file);
> + return -EINVAL;
> + }
> +
> + *allowed_attributes |= SGX_ATTR_PROVISIONKEY;
> +
> + fput(file);
> + return 0;
> +}
> +EXPORT_SYMBOL_GPL(sgx_set_attribute);
> +
> static void __init sgx_init(void)
> {
> int ret;
> @@ -719,13 +755,20 @@ static void __init sgx_init(void)
> if (!sgx_page_reclaimer_init())
> goto err_page_cache;
>
> + ret = misc_register(&sgx_dev_provision);
> + if (ret)
> + goto err_kthread;
> +
> /* Success if the native *or* virtual EPC driver initialized cleanly. */
> ret = !!sgx_drv_init() & !!sgx_virt_epc_init();
> if (ret)
> - goto err_kthread;
> + goto err_provision;
>
> return;
>
> +err_provision:
> + misc_deregister(&sgx_dev_provision);
> +
> err_kthread:
> kthread_stop(ksgxd_tsk);
>
> --
> 2.29.2
>
>
/Jarkko
next prev parent reply other threads:[~2021-01-20 17:23 UTC|newest]
Thread overview: 91+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-18 3:26 [RFC PATCH v2 00/26] KVM SGX virtualization support Kai Huang
2021-01-18 3:26 ` [RFC PATCH v2 01/26] x86/cpufeatures: Add SGX1 and SGX2 sub-features Kai Huang
2021-01-19 16:19 ` Borislav Petkov
2021-01-19 18:03 ` Sean Christopherson
2021-01-19 22:54 ` Kai Huang
2021-01-20 10:28 ` Borislav Petkov
2021-01-20 11:50 ` Jarkko Sakkinen
2021-01-20 23:23 ` Kai Huang
2021-01-21 1:01 ` Jarkko Sakkinen
2021-01-18 3:26 ` [RFC PATCH v2 02/26] x86/sgx: Remove a warn from sgx_free_epc_page() Kai Huang
2021-01-19 8:32 ` Jarkko Sakkinen
2021-01-20 0:42 ` Kai Huang
2021-01-18 3:26 ` [RFC PATCH v2 03/26] x86/sgx: Wipe out EREMOVE " Kai Huang
2021-01-18 3:26 ` [RFC PATCH v2 04/26] x86/sgx: Add SGX_CHILD_PRESENT hardware error code Kai Huang
2021-01-20 11:51 ` Jarkko Sakkinen
2021-01-18 3:26 ` [RFC PATCH v2 05/26] x86/sgx: Introduce virtual EPC for use by KVM guests Kai Huang
2021-01-20 11:54 ` Jarkko Sakkinen
2021-01-20 17:40 ` Sean Christopherson
2021-01-21 0:54 ` Jarkko Sakkinen
2021-01-21 0:55 ` Jarkko Sakkinen
2021-01-18 3:27 ` [RFC PATCH v2 06/26] x86/cpu/intel: Allow SGX virtualization without Launch Control support Kai Huang
2021-01-20 21:02 ` Dave Hansen
2021-01-20 22:36 ` Sean Christopherson
2021-01-20 23:27 ` Dave Hansen
2021-01-20 23:48 ` Kai Huang
2021-01-20 23:51 ` Dave Hansen
2021-01-21 1:53 ` Kai Huang
2021-01-21 14:35 ` Jarkko Sakkinen
2021-01-21 1:12 ` Jarkko Sakkinen
2021-01-20 23:50 ` Kai Huang
2021-01-21 1:11 ` Jarkko Sakkinen
2021-01-18 3:27 ` [RFC PATCH v2 07/26] x86/sgx: Initialize virtual EPC driver even when SGX driver is disabled Kai Huang
2021-01-18 3:27 ` [RFC PATCH v2 08/26] x86/sgx: Expose SGX architectural definitions to the kernel Kai Huang
2021-01-20 11:58 ` Jarkko Sakkinen
2021-01-20 23:53 ` Kai Huang
2021-01-18 3:27 ` [RFC PATCH v2 09/26] x86/sgx: Move ENCLS leaf definitions to sgx_arch.h Kai Huang
2021-01-20 11:59 ` Jarkko Sakkinen
2021-01-18 3:28 ` [RFC PATCH v2 10/26] x86/sgx: Add SGX2 ENCLS leaf definitions (EAUG, EMODPR and EMODT) Kai Huang
2021-01-20 11:59 ` Jarkko Sakkinen
2021-01-18 3:28 ` [RFC PATCH v2 11/26] x86/sgx: Add encls_faulted() helper Kai Huang
2021-01-20 12:03 ` Jarkko Sakkinen
2021-01-20 23:43 ` Kai Huang
2021-01-21 1:08 ` Jarkko Sakkinen
2021-01-21 1:12 ` Kai Huang
2021-01-21 14:38 ` Jarkko Sakkinen
2021-01-18 3:28 ` [RFC PATCH v2 12/26] x86/sgx: Add helper to update SGX_LEPUBKEYHASHn MSRs Kai Huang
2021-01-20 12:03 ` Jarkko Sakkinen
2021-01-20 18:36 ` Dave Hansen
2021-01-20 23:36 ` Kai Huang
2021-01-20 23:50 ` Dave Hansen
2021-01-21 1:06 ` Kai Huang
2021-01-21 1:15 ` Dave Hansen
2021-01-21 1:44 ` Kai Huang
2021-01-21 14:36 ` Jarkko Sakkinen
2021-01-21 1:18 ` Kai Huang
2021-01-21 1:09 ` Jarkko Sakkinen
2021-01-21 1:08 ` Jarkko Sakkinen
2021-01-18 3:28 ` [RFC PATCH v2 13/26] x86/sgx: Add helpers to expose ECREATE and EINIT to KVM Kai Huang
2021-01-20 12:04 ` Jarkko Sakkinen
2021-01-20 23:29 ` Kai Huang
2021-01-18 3:28 ` [RFC PATCH v2 14/26] x86/sgx: Move provisioning device creation out of SGX driver Kai Huang
2021-01-20 14:09 ` Jarkko Sakkinen [this message]
2021-01-20 23:24 ` Kai Huang
2021-01-18 3:28 ` [RFC PATCH v2 15/26] KVM: VMX: Convert vcpu_vmx.exit_reason to a union Kai Huang
2021-01-20 14:18 ` Jarkko Sakkinen
2021-01-20 16:39 ` Sean Christopherson
2021-01-21 0:47 ` Jarkko Sakkinen
2021-01-21 16:33 ` Sean Christopherson
2021-01-22 17:29 ` Jarkko Sakkinen
2021-01-18 3:28 ` [RFC PATCH v2 16/26] KVM: x86: Export kvm_mmu_gva_to_gpa_{read,write}() for SGX (VMX) Kai Huang
2021-01-20 14:19 ` Jarkko Sakkinen
2021-01-18 3:28 ` [RFC PATCH v2 17/26] KVM: x86: Define new #PF SGX error code bit Kai Huang
2021-01-18 3:28 ` [RFC PATCH v2 18/26] KVM: x86: Add support for reverse CPUID lookup of scattered features Kai Huang
2021-01-18 3:28 ` [RFC PATCH v2 19/26] KVM: x86: Add reverse-CPUID lookup support for scattered SGX features Kai Huang
2021-01-18 3:28 ` [RFC PATCH v2 20/26] KVM: VMX: Add basic handling of VM-Exit from SGX enclave Kai Huang
2021-01-18 3:28 ` [RFC PATCH v2 21/26] KVM: VMX: Frame in ENCLS handler for SGX virtualization Kai Huang
2021-01-18 3:28 ` [RFC PATCH v2 22/26] KVM: VMX: Add SGX ENCLS[ECREATE] handler to enforce CPUID restrictions Kai Huang
2021-01-18 3:28 ` [RFC PATCH v2 23/26] KVM: VMX: Add emulation of SGX Launch Control LE hash MSRs Kai Huang
2021-01-18 3:28 ` [RFC PATCH v2 24/26] KVM: VMX: Add ENCLS[EINIT] handler to support SGX Launch Control (LC) Kai Huang
2021-01-18 3:28 ` [RFC PATCH v2 25/26] KVM: VMX: Enable SGX virtualization for SGX1, SGX2 and LC Kai Huang
2021-01-18 3:29 ` [RFC PATCH v2 26/26] KVM: x86: Add capability to grant VM access to privileged SGX attribute Kai Huang
2021-01-19 8:23 ` [RFC PATCH v2 00/26] KVM SGX virtualization support Jarkko Sakkinen
2021-01-20 0:52 ` Kai Huang
2021-01-20 16:35 ` Sean Christopherson
2021-01-20 16:39 ` Paolo Bonzini
2021-01-21 1:28 ` Kai Huang
2021-01-20 23:43 ` Jarkko Sakkinen
2021-01-20 23:52 ` Kai Huang
2021-01-21 1:16 ` Jarkko Sakkinen
2021-01-21 1:27 ` Kai Huang
2021-01-21 14:34 ` 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=YAg5qU5KMGLuPdjy@kernel.org \
--to=jarkko@kernel.org \
--cc=bp@alien8.de \
--cc=dave.hansen@intel.com \
--cc=haitao.huang@intel.com \
--cc=hpa@zytor.com \
--cc=kai.huang@intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-sgx@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mingo@redhat.com \
--cc=pbonzini@redhat.com \
--cc=seanjc@google.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).