Skip to content

Commit d4fc4d0

Browse files
legionushansendc
authored andcommitted
x86/tdx: Fix "in-kernel MMIO" check
TDX only supports kernel-initiated MMIO operations. The handle_mmio() function checks if the #VE exception occurred in the kernel and rejects the operation if it did not. However, userspace can deceive the kernel into performing MMIO on its behalf. For example, if userspace can point a syscall to an MMIO address, syscall does get_user() or put_user() on it, triggering MMIO #VE. The kernel will treat the #VE as in-kernel MMIO. Ensure that the target MMIO address is within the kernel before decoding instruction. Fixes: 31d58c4 ("x86/tdx: Handle in-kernel MMIO") Signed-off-by: Alexey Gladkov (Intel) <legion@kernel.org> Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Reviewed-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Acked-by: Dave Hansen <dave.hansen@linux.intel.com> Cc:stable@vger.kernel.org Link: https://lore.kernel.org/all/565a804b80387970460a4ebc67c88d1380f61ad1.1726237595.git.legion%40kernel.org
1 parent 98f7e32 commit d4fc4d0

File tree

1 file changed

+6
-0
lines changed

1 file changed

+6
-0
lines changed

arch/x86/coco/tdx/tdx.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <asm/insn-eval.h>
1717
#include <asm/pgtable.h>
1818
#include <asm/set_memory.h>
19+
#include <asm/traps.h>
1920

2021
/* MMIO direction */
2122
#define EPT_READ 0
@@ -433,6 +434,11 @@ static int handle_mmio(struct pt_regs *regs, struct ve_info *ve)
433434
return -EINVAL;
434435
}
435436

437+
if (!fault_in_kernel_space(ve->gla)) {
438+
WARN_ONCE(1, "Access to userspace address is not supported");
439+
return -EINVAL;
440+
}
441+
436442
/*
437443
* Reject EPT violation #VEs that split pages.
438444
*

0 commit comments

Comments
 (0)