Skip to content

Commit 8de62af

Browse files
kirylhansendc
authored andcommitted
x86/tdx: Disable NOTIFY_ENABLES
== Background == There is a class of side-channel attacks against SGX enclaves called "SGX Step"[1]. These attacks create lots of exceptions inside of enclaves. Basically, run an in-enclave instruction, cause an exception. Over and over. There is a concern that a VMM could attack a TDX guest in the same way by causing lots of #VE's. The TDX architecture includes new countermeasures for these attacks. It basically counts the number of exceptions and can send another *special* exception once the number of VMM-induced #VE's hits a critical threshold[2]. == Problem == But, these special exceptions are independent of any action that the guest takes. They can occur anywhere that the guest executes. This includes sensitive areas like the entry code. The (non-paranoid) #VE handler is incapable of handling exceptions in these areas. == Solution == Fortunately, the special exceptions can be disabled by the guest via write to NOTIFY_ENABLES TDCS field. NOTIFY_ENABLES is disabled by default, but might be enabled by a bootloader, firmware or an earlier kernel before the current kernel runs. Disable NOTIFY_ENABLES feature explicitly and unconditionally. Any NOTIFY_ENABLES-based #VE's that occur before this point will end up in the early #VE exception handler and die due to unexpected exit reason. [1] https://github.com/jovanbulck/sgx-step [2] https://intel.github.io/ccc-linux-guest-hardening-docs/security-spec.html#safety-against-ve-in-kernel-code Signed-off-by: Kirill A. Shutemov <[email protected]> Signed-off-by: Dave Hansen <[email protected]> Reviewed-by: Dave Hansen <[email protected]> Link: https://lore.kernel.org/all/20230126221159.8635-8-kirill.shutemov%40linux.intel.com
1 parent 47e67cf commit 8de62af

File tree

1 file changed

+7
-0
lines changed

1 file changed

+7
-0
lines changed

arch/x86/coco/tdx/tdx.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@
1919
#define TDX_GET_VEINFO 3
2020
#define TDX_GET_REPORT 4
2121
#define TDX_ACCEPT_PAGE 6
22+
#define TDX_WR 8
23+
24+
/* TDCS fields. To be used by TDG.VM.WR and TDG.VM.RD module calls */
25+
#define TDCS_NOTIFY_ENABLES 0x9100000000000010
2226

2327
/* TDX hypercall Leaf IDs */
2428
#define TDVMCALL_MAP_GPA 0x10001
@@ -863,6 +867,9 @@ void __init tdx_early_init(void)
863867
tdx_parse_tdinfo(&cc_mask);
864868
cc_set_mask(cc_mask);
865869

870+
/* Kernel does not use NOTIFY_ENABLES and does not need random #VEs */
871+
tdx_module_call(TDX_WR, 0, TDCS_NOTIFY_ENABLES, 0, -1ULL, NULL);
872+
866873
/*
867874
* All bits above GPA width are reserved and kernel treats shared bit
868875
* as flag, not as part of physical address.

0 commit comments

Comments
 (0)