So how does this protect against the MELTDOWN attack (CVE-2017-5754) and the MELTATOMBOMBA4 worm which uses this exploit? Ced On 25 November 2017 at 20:29, Jarkko Sakkinen <jarkko.sakkinen@xxxxxxxxxxxxxxx> wrote: > Intel(R) SGX is a set of CPU instructions that can be used by applications to > set aside private regions of code and data. The code outside the enclave is > disallowed to access the memory inside the enclave by the CPU access control. > In a way you can think that SGX provides inverted sandbox. It protects the > application from a malicious host. > > There is a new hardware unit in the processor called Memory Encryption Engine > (MEE) starting from the Skylake microacrhitecture. BIOS can define one or many > MEE regions that can hold enclave data by configuring them with PRMRR > registers. > > The MEE automatically encrypts the data leaving the processor package to the > MEE regions. The data is encrypted using a random key whose life-time is > exactly one power cycle. > > You can tell if your CPU supports SGX by looking into /proc/cpuinfo: > > cat /proc/cpuinfo | grep sgx > > The GIT repositoy for SGX driver resides in > > https://github.com/jsakkine-intel/linux-sgx.git > > 'le' branch contains the upstream candidate patches. > > 'master' branch contains the same patches with the following differences: > > * top-level patch modifies the ioctl API to be SDK compatible > * does not use flexible launch control but instead relies on SDK provided > Intel launch enclave. > > Backlog: > * AES: how to use arch/x86/crypto/aesni-intel_asm.S from the enclave. I > guess these routines should be fairly easy to call directly (haven't > investigated deeply). Any advice is appreciated. > * Layout: what and where to place in arch/x86. > * MAINTAINERS: who to add as reviewer. > > v6 > * Fixed semaphore underrun when accessing /dev/sgx from the launch enclave. > * In sgx_encl_create() s/IS_ERR(secs)/IS_ERR(encl)/. > * Removed virtualization chapter from the documentation. > * Changed the default filename for the signing key as signing_key.pem. > * Reworked EPC management in a way that instead of a linked list of > struct sgx_epc_page instances there is an array of integers that > encodes address and bank of an EPC page (the same data as 'pa' field > earlier). The locking has been moved to the EPC bank level instead > of a global lock. > * Relaxed locking requirements for EPC management. EPC pages can be > released back to the EPC bank concurrently. > * Cleaned up ptrace() code. > * Refined commit messages for new architectural constants. > * Sorted includes in every source file. > * Sorted local variable declarations according to the line length in > every function. > * Style fixes based on Darren's comments to sgx_le.c. > > v5: > * Described IPC between the Launch Enclave and kernel in the commit messages. > * Fixed all relevant checkpatch.pl issues that I have forgot fix in earlier > versions except those that exist in the imported TinyCrypt code. > * Fixed spelling mistakes in the documentation. > * Forgot to check the return value of sgx_drv_subsys_init(). > * Encapsulated properly page cache init and teardown. > * Collect epc pages to a temp list in sgx_add_epc_bank > * Removed SGX_ENCLAVE_INIT_ARCH constant. > > v4: > * Tied life-cycle of the sgx_le_proxy process to /dev/sgx. > * Removed __exit annotation from sgx_drv_subsys_exit(). > * Fixed a leak of a backing page in sgx_process_add_page_req() in the > case when vm_insert_pfn() fails. > * Removed unused symbol exports for sgx_page_cache.c. > * Updated sgx_alloc_page() to require encl parameter and documented the > behavior (Sean Christopherson). > * Refactored a more lean API for sgx_encl_find() and documented the behavior. > * Moved #PF handler to sgx_fault.c. > * Replaced subsys_system_register() with plain bus_register(). > * Retry EINIT 2nd time only if MSRs are not locked. > > v3: > * Check that FEATURE_CONTROL_LOCKED and FEATURE_CONTROL_SGX_ENABLE are set. > * Return -ERESTARTSYS in __sgx_encl_add_page() when sgx_alloc_page() fails. > * Use unused bits in epc_page->pa to store the bank number. > * Removed #ifdef for WQ_NONREENTRANT. > * If mmu_notifier_register() fails with -EINTR, return -ERESTARTSYS. > * Added --remove-section=.got.plt to objcopy flags in order to prevent a > dummy .got.plt, which will cause an inconsistent size for the LE. > * Documented sgx_encl_* functions. > * Added remark about AES implementation used inside the LE. > * Removed redundant sgx_sys_exit() from le/main.c. > * Fixed struct sgx_secinfo alignment from 128 to 64 bytes. > * Validate miscselect in sgx_encl_create(). > * Fixed SSA frame size calculation to take the misc region into account. > * Implemented consistent exception handling to __encls() and __encls_ret(). > * Implemented a proper device model in order to allow sysfs attributes > and in-kernel API. > * Cleaned up various "find enclave" implementations to the unified > sgx_encl_find(). > * Validate that vm_pgoff is zero. > * Discard backing pages with shmem_truncate_range() after EADD. > * Added missing EEXTEND operations to LE signing and launch. > * Fixed SSA size for GPRS region from 168 to 184 bytes. > * Fixed the checks for TCS flags. Now DBGOPTIN is allowed. > * Check that TCS addresses are in ELRANGE and not just page aligned. > * Require kernel to be compiled with X64_64 and CPU_SUP_INTEL. > * Fixed an incorrect value for SGX_ATTR_DEBUG from 0x01 to 0x02. > > v2: > * get_rand_uint32() changed the value of the pointer instead of value > where it is pointing at. > * Launch enclave incorrectly used sigstruct attributes-field instead of > enclave attributes-field. > * Removed unused struct sgx_add_page_req from sgx_ioctl.c > * Removed unused sgx_has_sgx2. > * Updated arch/x86/include/asm/sgx.h so that it provides stub > implementations when sgx in not enabled. > * Removed cruft rdmsr-calls from sgx_set_pubkeyhash_msrs(). > * return -ENOMEM in sgx_alloc_page() when VA pages consume too much space > * removed unused global sgx_nr_pids > * moved sgx_encl_release to sgx_encl.c > * return -ERESTARTSYS instead of -EINTR in sgx_encl_init() > > > Haim Cohen (1): > x86: add SGX MSRs to msr-index.h > > Jarkko Sakkinen (8): > intel_sgx: updated MAINTAINERS > x86: define IA32_FEATUE_CONTROL.SGX_LC > intel_sgx: driver for Intel Software Guard Extensions > intel_sgx: ptrace() support > intel_sgx: in-kernel launch enclave > fs/pipe.c: export create_pipe_files() and replace_fd() > intel_sgx: glue code for in-kernel LE > intel_sgx: driver documentation > > Kai Huang (1): > x86: add SGX definition to cpufeature > > Sean Christopherson (1): > x86: define IA32_FEATURE_CONTROL.SGX_ENABLE > > Documentation/index.rst | 1 + > Documentation/x86/intel_sgx.rst | 101 +++ > MAINTAINERS | 5 + > arch/x86/include/asm/cpufeatures.h | 2 + > arch/x86/include/asm/msr-index.h | 8 + > arch/x86/include/asm/sgx.h | 233 +++++ > arch/x86/include/asm/sgx_arch.h | 268 ++++++ > arch/x86/include/uapi/asm/sgx.h | 138 +++ > drivers/platform/x86/Kconfig | 2 + > drivers/platform/x86/Makefile | 1 + > drivers/platform/x86/intel_sgx/Kconfig | 34 + > drivers/platform/x86/intel_sgx/Makefile | 32 + > drivers/platform/x86/intel_sgx/le/Makefile | 26 + > drivers/platform/x86/intel_sgx/le/enclave/Makefile | 46 + > .../x86/intel_sgx/le/enclave/aes_encrypt.c | 191 ++++ > .../platform/x86/intel_sgx/le/enclave/cmac_mode.c | 254 ++++++ > .../x86/intel_sgx/le/enclave/encl_bootstrap.S | 163 ++++ > .../intel_sgx/le/enclave/include/tinycrypt/aes.h | 133 +++ > .../le/enclave/include/tinycrypt/cmac_mode.h | 194 ++++ > .../le/enclave/include/tinycrypt/constants.h | 59 ++ > .../intel_sgx/le/enclave/include/tinycrypt/utils.h | 95 ++ > drivers/platform/x86/intel_sgx/le/enclave/main.c | 203 +++++ > .../platform/x86/intel_sgx/le/enclave/sgx_le.lds | 28 + > .../platform/x86/intel_sgx/le/enclave/sgxsign.c | 538 +++++++++++ > drivers/platform/x86/intel_sgx/le/enclave/utils.c | 78 ++ > drivers/platform/x86/intel_sgx/le/entry.S | 117 +++ > .../platform/x86/intel_sgx/le/include/sgx_asm.h | 64 ++ > .../platform/x86/intel_sgx/le/include/sgx_encl.h | 110 +++ > drivers/platform/x86/intel_sgx/le/main.c | 214 +++++ > drivers/platform/x86/intel_sgx/le/sgx_le_piggy.S | 15 + > drivers/platform/x86/intel_sgx/sgx.h | 268 ++++++ > drivers/platform/x86/intel_sgx/sgx_encl.c | 999 +++++++++++++++++++++ > drivers/platform/x86/intel_sgx/sgx_ioctl.c | 282 ++++++ > drivers/platform/x86/intel_sgx/sgx_le.c | 319 +++++++ > .../platform/x86/intel_sgx/sgx_le_proxy_piggy.S | 15 + > drivers/platform/x86/intel_sgx/sgx_main.c | 456 ++++++++++ > drivers/platform/x86/intel_sgx/sgx_page_cache.c | 619 +++++++++++++ > drivers/platform/x86/intel_sgx/sgx_util.c | 394 ++++++++ > drivers/platform/x86/intel_sgx/sgx_vma.c | 236 +++++ > fs/file.c | 1 + > fs/pipe.c | 1 + > 41 files changed, 6943 insertions(+) > create mode 100644 Documentation/x86/intel_sgx.rst > create mode 100644 arch/x86/include/asm/sgx.h > create mode 100644 arch/x86/include/asm/sgx_arch.h > create mode 100644 arch/x86/include/uapi/asm/sgx.h > create mode 100644 drivers/platform/x86/intel_sgx/Kconfig > create mode 100644 drivers/platform/x86/intel_sgx/Makefile > create mode 100644 drivers/platform/x86/intel_sgx/le/Makefile > create mode 100644 drivers/platform/x86/intel_sgx/le/enclave/Makefile > create mode 100644 drivers/platform/x86/intel_sgx/le/enclave/aes_encrypt.c > create mode 100644 drivers/platform/x86/intel_sgx/le/enclave/cmac_mode.c > create mode 100644 drivers/platform/x86/intel_sgx/le/enclave/encl_bootstrap.S > create mode 100644 drivers/platform/x86/intel_sgx/le/enclave/include/tinycrypt/aes.h > create mode 100644 drivers/platform/x86/intel_sgx/le/enclave/include/tinycrypt/cmac_mode.h > create mode 100644 drivers/platform/x86/intel_sgx/le/enclave/include/tinycrypt/constants.h > create mode 100644 drivers/platform/x86/intel_sgx/le/enclave/include/tinycrypt/utils.h > create mode 100644 drivers/platform/x86/intel_sgx/le/enclave/main.c > create mode 100644 drivers/platform/x86/intel_sgx/le/enclave/sgx_le.lds > create mode 100644 drivers/platform/x86/intel_sgx/le/enclave/sgxsign.c > create mode 100644 drivers/platform/x86/intel_sgx/le/enclave/utils.c > create mode 100644 drivers/platform/x86/intel_sgx/le/entry.S > create mode 100644 drivers/platform/x86/intel_sgx/le/include/sgx_asm.h > create mode 100644 drivers/platform/x86/intel_sgx/le/include/sgx_encl.h > create mode 100644 drivers/platform/x86/intel_sgx/le/main.c > create mode 100644 drivers/platform/x86/intel_sgx/le/sgx_le_piggy.S > create mode 100644 drivers/platform/x86/intel_sgx/sgx.h > create mode 100644 drivers/platform/x86/intel_sgx/sgx_encl.c > create mode 100644 drivers/platform/x86/intel_sgx/sgx_ioctl.c > create mode 100644 drivers/platform/x86/intel_sgx/sgx_le.c > create mode 100644 drivers/platform/x86/intel_sgx/sgx_le_proxy_piggy.S > create mode 100644 drivers/platform/x86/intel_sgx/sgx_main.c > create mode 100644 drivers/platform/x86/intel_sgx/sgx_page_cache.c > create mode 100644 drivers/platform/x86/intel_sgx/sgx_util.c > create mode 100644 drivers/platform/x86/intel_sgx/sgx_vma.c > > -- > 2.14.1 > -- Cedric Blancher <cedric.blancher@xxxxxxxxx> [https://plus.google.com/u/0/+CedricBlancher/] Institute Pasteur