Re: Redoing eXclusive Page Frame Ownership (XPFO) with isolated CPUs in mind (for KVM to isolate its guests per CPU)
From: David Woodhouse <dwmw2@infradead.org>
Date: 2018-08-21 16:07:28
Also in:
lkml
On Tue, 2018-08-21 at 17:01 +0300, Liran Alon wrote:
quoted
On 21 Aug 2018, at 12:57, David Woodhouse [off-list ref]wrote:quoted
Another alternative... I'm told POWER8 does an interesting thingwithquoted
hyperthreading and gang scheduling for KVM. The host kernel doesn't actually *see* the hyperthreads at all, and KVM just launches thefullquoted
set of siblings when it enters a guest, and gathers them again whenanyquoted
of them exits. That's definitely worth investigating as an optionforquoted
x86, too.I actually think that such scheduling mechanism which prevents leaking cache entries to sibling hyperthreads should co-exist together with the KVM address space isolation to fully mitigate L1TF and other similar vulnerabilities. The address space isolation should prevent VMExit handlers code gadgets from loading arbitrary host memory to the cache. Once VMExit code path switches to full host address space, then we should also make sure that no other sibling hyprethread is running in the guest.
The KVM POWER8 solution (see arch/powerpc/kvm/book3s_hv.c) does that. The siblings are *never* running host kernel code; they're all torn down when any of them exits the guest. And it's always the *same* guest.
Focusing on the scheduling mechanism, we must make sure that when a logical processor runs guest code, all siblings logical processors must run code which do not populate L1D cache with information unrelated to this VM. This includes forbidding one logical processor to run guest code while sibling is running a host task such as a NIC interrupt handler. Thus, when a vCPU thread exits the guest into the host and VMExit handler reaches code flow which could populate L1D cache with this information, we should force an exit from the guest of the siblings logical processors, such that they will be allowed to resume only on a core which we can promise that the L1D cache is free from information unrelated to this VM. At first, I have created a patch series which attempts to implement such mechanism in KVM. However, it became clear to me that this may need to be implemented in the scheduler itself. This is because: 1. It is difficult to handle all new scheduling contrains only in KVM. 2. This mechanism should be relevant for any Type-2 hypervisor which runs inside Linux besides KVM (Such as VMware Workstation or VirtualBox). 3. This mechanism could also be used to prevent future “core-cache- leaking” vulnerabilities to be exploited between processes of different security domains which run as siblings on the same core.
I'm not sure I agree. If KVM is handling "only let siblings run the *same* guest" and the siblings aren't visible to the host at all, that's quite simple. Any other hypervisor can also do it. Now, the down-side of this is that the siblings aren't visible to the host. They can't be used to run multiple threads of the same userspace processes; only multiple threads of the same KVM guest. A truly generic core scheduler would cope with userspace threads too. BUT I strongly suspect there's a huge correlation between the set of people who care enough about the KVM/L1TF issue to enable a costly XFPO-like solution, and the set of people who mostly don't give a shit about having sibling CPUs available to run the host's userspace anyway. This is not the "I happen to run a Windows VM on my Linux desktop" use case...
Attachments
- smime.p7s [application/x-pkcs7-signature] 5213 bytes