From: Sean Christopherson <seanjc@google.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
Peter Xu <peterx@redhat.com>, Yan Zhao <yan.y.zhao@intel.com>,
Maxim Levitsky <mlevitsk@redhat.com>,
Sean Christopherson <seanjc@google.com>
Subject: [PATCH 0/5] KVM: Dirty ring fixes and cleanups
Date: Fri, 10 Jan 2025 17:04:04 -0800 [thread overview]
Message-ID: <20250111010409.1252942-1-seanjc@google.com> (raw)
Yan's series to fix a flaw where a buggy/malicious userspace could coerce
KVM into corrupting TDX SPTEs got me wondering what other bad things userspace
could do by writing into the dirty ring...
The main issue is that KVM doesn't bound the processing of harvested entries
in any way, which allows userspace to keep KVM in a tight loop indefinitely.
E.g.
struct kvm_dirty_gfn *dirty_gfns = vcpu_map_dirty_ring(vcpu);
if (fork()) {
int r;
for (;;) {
r = kvm_vm_reset_dirty_ring(vcpu->vm);
if (r)
printf("RESET %d dirty ring entries\n", r);
}
} else {
int i;
for (i = 0; i < test_dirty_ring_count; i++) {
dirty_gfns[i].slot = TEST_MEM_SLOT_INDEX;
dirty_gfns[i].offset = (i * 64) % host_num_pages;
}
for (;;) {
for (i = 0; i < test_dirty_ring_count; i++)
WRITE_ONCE(dirty_gfns[i].flags, KVM_DIRTY_GFN_F_RESET);
}
}
Patches 1-3 address that class of bugs. Patches 4 and 5 are cleanups.
[*] https://lore.kernel.org/all/20241220082027.15851-1-yan.y.zhao@intel.com
Sean Christopherson (5):
KVM: Bound the number of dirty ring entries in a single reset at
INT_MAX
KVM: Bail from the dirty ring reset flow if a signal is pending
KVM: Conditionally reschedule when resetting the dirty ring
KVM: Check for empty mask of harvested dirty ring entries in caller
KVM: Use mask of harvested dirty ring entries to coalesce dirty ring
resets
include/linux/kvm_dirty_ring.h | 8 ++--
virt/kvm/dirty_ring.c | 88 +++++++++++++++++++++-------------
virt/kvm/kvm_main.c | 9 ++--
3 files changed, 66 insertions(+), 39 deletions(-)
base-commit: 10485c4bc3caad3e93a6a4e99003e8ffffcd826a
--
2.47.1.613.gc27f4b7a9f-goog
next reply other threads:[~2025-01-11 1:04 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-11 1:04 Sean Christopherson [this message]
2025-01-11 1:04 ` [PATCH 1/5] KVM: Bound the number of dirty ring entries in a single reset at INT_MAX Sean Christopherson
2025-01-13 6:48 ` Yan Zhao
2025-01-13 6:57 ` Yan Zhao
2025-01-11 1:04 ` [PATCH 2/5] KVM: Bail from the dirty ring reset flow if a signal is pending Sean Christopherson
2025-01-13 9:31 ` Yan Zhao
2025-01-13 15:48 ` Sean Christopherson
2025-01-14 7:29 ` Yan Zhao
2025-01-14 17:16 ` Sean Christopherson
2025-01-11 1:04 ` [PATCH 3/5] KVM: Conditionally reschedule when resetting the dirty ring Sean Christopherson
2025-01-13 7:04 ` Yan Zhao
2025-01-13 16:28 ` Sean Christopherson
2025-01-14 7:58 ` Yan Zhao
2025-01-11 1:04 ` [PATCH 4/5] KVM: Check for empty mask of harvested dirty ring entries in caller Sean Christopherson
2025-01-13 10:30 ` Yan Zhao
2025-01-13 16:48 ` Sean Christopherson
2025-01-14 8:13 ` Yan Zhao
2025-01-11 1:04 ` [PATCH 5/5] KVM: Use mask of harvested dirty ring entries to coalesce dirty ring resets Sean Christopherson
2025-01-13 9:51 ` [PATCH 0/5] KVM: Dirty ring fixes and cleanups Yan Zhao
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250111010409.1252942-1-seanjc@google.com \
--to=seanjc@google.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mlevitsk@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peterx@redhat.com \
--cc=yan.y.zhao@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®