• Rick Edgecombe's avatar
    x86/mm/cpa: Warn for set_memory_XXcrypted() VMM fails · 82ace185
    Rick Edgecombe authored
    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: default avatarMichael Kelley (LINUX) <mikelley@microsoft.com>
    Signed-off-by: default avatarRick Edgecombe <rick.p.edgecombe@intel.com>
    Signed-off-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
    Reviewed-by: default avatarTom Lendacky <thomas.lendacky@amd.com>
    Reviewed-by: default avatarKuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
    Reviewed-by: default avatarKirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Reviewed-by: default avatarMichael Kelley <mikelley@microsoft.com>
    Link: https://lore.kernel.org/all/20240122184003.129104-1-rick.p.edgecombe%40intel.com
    82ace185
set_memory.c 61.3 KB