Skip to content

Commit 82ace18

Browse files
rpedgecohansendc
authored andcommitted
x86/mm/cpa: Warn for set_memory_XXcrypted() VMM fails
On TDX it is possible for the untrusted host to cause set_memory_encrypted() or set_memory_decrypted() to fail such that an error is returned and the resulting memory is shared. Callers need to take care to handle these errors to avoid returning decrypted (shared) memory to the page allocator, which could lead to functional or security issues. In terms of security, the problematic case is guest PTEs mapping the shared alias GFNs, since the VMM has control of the shared mapping in the EPT/NPT. Such conversion errors may herald future system instability, but are temporarily survivable with proper handling in the caller. The kernel traditionally makes every effort to keep running, but it is expected that some coco guests may prefer to play it safe security-wise, and panic in this case. To accommodate both cases, warn when the arch breakouts for converting memory at the VMM layer return an error to CPA. Security focused users can rely on panic_on_warn to defend against bugs in the callers. Some VMMs are not known to behave in the troublesome way, so users that would like to terminate on any unusual behavior by the VMM around this will be covered as well. Since the arch breakouts host the logic for handling coco implementation specific errors, an error returned from them means that the set_memory() call is out of options for handling the error internally. Make this the condition to warn about. It is possible that very rarely these functions could fail due to guest memory pressure (in the case of failing to allocate a huge page when splitting a page table). Don't warn in this case because it is a lot less likely to indicate an attack by the host and it is not clear which set_memory() calls should get the same treatment. That corner should be addressed by future work that considers the more general problem and not just papers over a single set_memory() variant. Suggested-by: Michael Kelley (LINUX) <mikelley@microsoft.com> Signed-off-by: Rick Edgecombe <rick.p.edgecombe@intel.com> Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com> Reviewed-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> Reviewed-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Reviewed-by: Michael Kelley <mikelley@microsoft.com> Link: https://lore.kernel.org/all/20240122184003.129104-1-rick.p.edgecombe%40intel.com
1 parent 8f588af commit 82ace18

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

arch/x86/mm/pat/set_memory.c

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2153,7 +2153,7 @@ static int __set_memory_enc_pgtable(unsigned long addr, int numpages, bool enc)
21532153

21542154
/* Notify hypervisor that we are about to set/clr encryption attribute. */
21552155
if (!x86_platform.guest.enc_status_change_prepare(addr, numpages, enc))
2156-
return -EIO;
2156+
goto vmm_fail;
21572157

21582158
ret = __change_page_attr_set_clr(&cpa, 1);
21592159

@@ -2166,13 +2166,20 @@ static int __set_memory_enc_pgtable(unsigned long addr, int numpages, bool enc)
21662166
*/
21672167
cpa_flush(&cpa, 0);
21682168

2169+
if (ret)
2170+
return ret;
2171+
21692172
/* Notify hypervisor that we have successfully set/clr encryption attribute. */
2170-
if (!ret) {
2171-
if (!x86_platform.guest.enc_status_change_finish(addr, numpages, enc))
2172-
ret = -EIO;
2173-
}
2173+
if (!x86_platform.guest.enc_status_change_finish(addr, numpages, enc))
2174+
goto vmm_fail;
21742175

2175-
return ret;
2176+
return 0;
2177+
2178+
vmm_fail:
2179+
WARN_ONCE(1, "CPA VMM failure to convert memory (addr=%p, numpages=%d) to %s.\n",
2180+
(void *)addr, numpages, enc ? "private" : "shared");
2181+
2182+
return -EIO;
21762183
}
21772184

21782185
static int __set_memory_enc_dec(unsigned long addr, int numpages, bool enc)

0 commit comments

Comments
 (0)