All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Sean Christopherson" <seanjc@google.com>
Cc: kvm@vger.kernel.org
Subject: Re: [PATCH v2 10/10] KVM: Pre-check uaccesses in KVM's APIs to read/write guest memory
Date: Fri, 02 Oct 2026 09:13:42 +0000	[thread overview]
Message-ID: <20261002091343.02E3B1F00899@smtp.kernel.org> (raw)
In-Reply-To: <20261001202234.3794060-11-seanjc@google.com>

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] kvm: bounds check bypass in kvm_is_guest_access_ok due to integer truncation and size ignore
--

commit 3b0fbcae79b36e79408bde507ed9fb555ab9f477
Author: Sean Christopherson <seanjc@google.com>

KVM: Pre-check uaccesses in KVM's APIs to read/write guest memory

This commit adds an early check for user access validity in KVM's guest
memory APIs. It introduces kvm_is_guest_access_ok() to validate access
bounds before performing memslot lookups, aiming to catch bugs during VM
teardown more noisily.

> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> index 770a2c3bd4458..80b19d47840b2 100644
> --- a/virt/kvm/kvm_main.c
> +++ b/virt/kvm/kvm_main.c
[ ... ]
> @@ -3211,6 +3211,11 @@ static int next_segment(unsigned long len, int offset)
>  		return len;
>  }
>  
> +static bool kvm_is_guest_access_ok(struct kvm *kvm, int offset, int len, int size)
> +{
> +	return kvm_can_do_uaccess(kvm) && !WARN_ON_ONCE(offset + len > PAGE_SIZE);
> +}

[Severity: Medium]
Does this helper ignore the provided size parameter? 

By hardcoding PAGE_SIZE in the WARN_ON_ONCE check, callers that pass a
smaller boundary (such as ghc->len) will have their custom bounds check
bypassed. If offset + len exceeds the custom size limit but remains under
PAGE_SIZE, it appears the access would be incorrectly permitted.

[ ... ]
> @@ -3294,7 +3299,7 @@ static int __kvm_read_guest_atomic(struct kvm *kvm, struct kvm_memory_slot *slot
>  	int r;
>  	unsigned long addr;
>  
> -	if (WARN_ON_ONCE(offset + len > PAGE_SIZE))
> +	if (!kvm_is_guest_access_ok(kvm, offset, len, PAGE_SIZE))

[Severity: Medium]
Does this silently truncate the len parameter?

In __kvm_read_guest_atomic(), len is defined as an unsigned long, but
kvm_is_guest_access_ok() takes len as a signed int.

>  		return -EFAULT;
>  
>  	addr = gfn_to_hva_memslot_prot(slot, gfn, NULL);
[ ... ]
> @@ -3457,7 +3462,7 @@ int kvm_write_guest_offset_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc,
>  	int r;
>  	gpa_t gpa = ghc->gpa + offset;
>  
> -	if (WARN_ON_ONCE(len + offset > ghc->len))
> +	if (!kvm_is_guest_access_ok(kvm, offset, len, ghc->len))

[Severity: Medium]
Similar to the above, len is an unsigned long here, which gets truncated
when passed to the signed int argument of the helper. 

Additionally, ghc->len is passed as the size parameter, which is completely
ignored by kvm_is_guest_access_ok() in favor of PAGE_SIZE. Will this bypass
the intended cache length check?

>  		return -EINVAL;
>  
>  	if (slots->generation != ghc->generation) {

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20261001202234.3794060-1-seanjc@google.com?part=10

  reply	other threads:[~2026-10-02  9:13 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-01 20:22 [PATCH v2 00/10] KVM: Fix+harden against bad uaccess using dying VM Sean Christopherson
2026-10-01 20:22 ` [PATCH v2 01/10] KVM: Reject user accesses to guest memory if current->mm != kvm->mm Sean Christopherson
2026-10-01 21:08   ` James Houghton
2026-10-01 21:18     ` Sean Christopherson
2026-10-01 21:28       ` James Houghton
2026-10-01 20:22 ` [PATCH v2 02/10] KVM: PPC: Flush/zap all memslots on kvm_arch_flush_shadow_all() Sean Christopherson
2026-10-01 20:22 ` [PATCH v2 03/10] KVM: x86: Unmap VMAs for KVM-internal memslots when the memslot is freed Sean Christopherson
2026-10-01 21:26   ` James Houghton
2026-10-02  9:13   ` sashiko-bot
2026-10-02 13:36     ` Sean Christopherson
2026-10-01 20:22 ` [PATCH v2 04/10] KVM: Disallow setting memslots when the VM is being destroyed Sean Christopherson
2026-10-01 20:22 ` [PATCH v2 05/10] KVM: Destroy memslots immediately after mmu_notifiers are unregistered Sean Christopherson
2026-10-02  9:13   ` sashiko-bot
2026-10-02 14:07     ` Sean Christopherson
2026-10-01 20:22 ` [PATCH v2 06/10] KVM: WARN if KVM attempts to do guest-related uaccess with "wrong" process Sean Christopherson
2026-10-01 20:22 ` [PATCH v2 07/10] KVM: WARN and reject guest-based uaccess if VM is dying Sean Christopherson
2026-10-01 20:22 ` [PATCH v2 08/10] KVM: nVMX: Don't flush shadow VMCS12 to guest memory during vCPU teardown Sean Christopherson
2026-10-01 20:22 ` [PATCH v2 09/10] KVM: nVMX: Don't try to load eVMCS12 page when the VM is dying Sean Christopherson
2026-10-01 20:22 ` [PATCH v2 10/10] KVM: Pre-check uaccesses in KVM's APIs to read/write guest memory Sean Christopherson
2026-10-02  9:13   ` sashiko-bot [this message]
2026-10-02 13:54     ` Sean Christopherson
2026-10-02 20:30 ` [syzbot ci] Re: KVM: Fix+harden against bad uaccess using dying VM syzbot ci
2026-10-02 20:39   ` Sean Christopherson

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=20261002091343.02E3B1F00899@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=kvm@vger.kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    --cc=seanjc@google.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.