• Mingwei Zhang's avatar
    KVM: SEV: add cache flush to solve SEV cache incoherency issues · 683412cc
    Mingwei Zhang authored
    Flush the CPU caches when memory is reclaimed from an SEV guest (where
    reclaim also includes it being unmapped from KVM's memslots).  Due to lack
    of coherency for SEV encrypted memory, failure to flush results in silent
    data corruption if userspace is malicious/broken and doesn't ensure SEV
    guest memory is properly pinned and unpinned.
    
    Cache coherency is not enforced across the VM boundary in SEV (AMD APM
    vol.2 Section 15.34.7). Confidential cachelines, generated by confidential
    VM guests have to be explicitly flushed on the host side. If a memory page
    containing dirty confidential cachelines was released by VM and reallocated
    to another user, the cachelines may corrupt the new user at a later time.
    
    KVM takes a shortcut by assuming all confidential memory remain pinned
    until the end of VM lifetime. Therefore, KVM does not flush cache at
    mmu_notifier invalidation events. Because of this incorrect assumption and
    the lack of cache flushing, malicous userspace can crash the host kernel:
    creating a malicious VM and continuously allocates/releases unpinned
    confidential memory pages when the VM is running.
    
    Add cache flush operations to mmu_notifier operations to ensure that any
    physical memory leaving the guest VM get flushed. In particular, hook
    mmu_notifier_invalidate_range_start and mmu_notifier_release events and
    flush cache accordingly. The hook after releasing the mmu lock to avoid
    contention with other vCPUs.
    
    Cc: stable@vger.kernel.org
    Suggested-by: default avatarSean Christpherson <seanjc@google.com>
    Reported-by: default avatarMingwei Zhang <mizhang@google.com>
    Signed-off-by: default avatarMingwei Zhang <mizhang@google.com>
    Message-Id: <20220421031407.2516575-4-mizhang@google.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    683412cc
svm.h 17.6 KB