Skip to content

Commit 4c0c5dc

Browse files
legionusgregkh
authored andcommitted
x86/tdx: Fix "in-kernel MMIO" check
commit d4fc4d0 upstream. 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 Signed-off-by: Alexey Gladkov (Intel) <legion@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 440fba8 commit 4c0c5dc

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
@@ -14,6 +14,7 @@
1414
#include <asm/insn.h>
1515
#include <asm/insn-eval.h>
1616
#include <asm/pgtable.h>
17+
#include <asm/traps.h>
1718

1819
/* MMIO direction */
1920
#define EPT_READ 0
@@ -405,6 +406,11 @@ static int handle_mmio(struct pt_regs *regs, struct ve_info *ve)
405406
return -EINVAL;
406407
}
407408

409+
if (!fault_in_kernel_space(ve->gla)) {
410+
WARN_ONCE(1, "Access to userspace address is not supported");
411+
return -EINVAL;
412+
}
413+
408414
/*
409415
* Reject EPT violation #VEs that split pages.
410416
*

0 commit comments

Comments
 (0)