From: Sean Christopherson <seanjc@google.com>
To: Pei Li <peili.dev@gmail.com>
Cc: David Woodhouse <dwmw2@infradead.org>,
Paul Durrant <paul@xen.org>, Paolo Bonzini <pbonzini@redhat.com>,
Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
Dave Hansen <dave.hansen@linux.intel.com>,
x86@kernel.org, "H. Peter Anvin" <hpa@zytor.com>,
Nathan Chancellor <nathan@kernel.org>,
Nick Desaulniers <ndesaulniers@google.com>,
Bill Wendling <morbo@google.com>,
Justin Stitt <justinstitt@google.com>,
kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
skhan@linuxfoundation.org,
linux-kernel-mentees@lists.linuxfoundation.org,
syzkaller-bugs@googlegroups.com, llvm@lists.linux.dev,
syzbot+fd555292a1da3180fc82@syzkaller.appspotmail.com
Subject: Re: [PATCH] kvm: Fix warning in__kvm_gpc_refresh
Date: Wed, 26 Jun 2024 13:08:47 -0700 [thread overview]
Message-ID: <Znx1T_hHNA_uThf2@google.com> (raw)
In-Reply-To: <20240625-bug5-v1-1-e072ed5fce85@gmail.com>
On Tue, Jun 25, 2024, Pei Li wrote:
> Check for invalid hva address stored in data before calling
> kvm_gpc_activate_hva() instead of only compare with 0.
>
> Reported-by: syzbot+fd555292a1da3180fc82@syzkaller.appspotmail.com
> Closes: https://syzkaller.appspot.com/bug?extid=fd555292a1da3180fc82
> Tested-by: syzbot+fd555292a1da3180fc82@syzkaller.appspotmail.com
> Signed-off-by: Pei Li <peili.dev@gmail.com>
> ---
> Syzbot reports a warning message in __kvm_gpc_refresh(). This warning
> requires at least one of gpa and uhva to be valid.
> WARNING: CPU: 0 PID: 5090 at arch/x86/kvm/../../../virt/kvm/pfncache.c:259 __kvm_gpc_refresh+0xf17/0x1090 arch/x86/kvm/../../../virt/kvm/pfncache.c:259
>
> We are calling it from kvm_gpc_activate_hva(). This function always calls
> __kvm_gpc_activate() with INVALID_GPA. Thus, uhva must be valid to
> disable this warning.
>
> This patch checks for invalid hva address as well instead of only
> comparing hva with 0 before calling kvm_gpc_activate_hva()
>
> syzbot has tested the proposed patch and the reproducer did not trigger
> any issue.
>
> Tested on:
>
> commit: 55027e68 Merge tag 'input-for-v6.10-rc5' of git://git...
> git tree: upstream
> console output: https://syzkaller.appspot.com/x/log.txt?x=16ea803a980000
> kernel config: https://syzkaller.appspot.com/x/.config?x=e40800950091403a
> dashboard link: https://syzkaller.appspot.com/bug?extid=fd555292a1da3180fc82
> compiler: Debian clang version 15.0.6, GNU ld (GNU Binutils for Debian) 2.40
> patch: https://syzkaller.appspot.com/x/patch.diff?x=16eeb53e980000
>
> Note: testing is done by a robot and is best-effort only.
> ---
> arch/x86/kvm/xen.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/arch/x86/kvm/xen.c b/arch/x86/kvm/xen.c
> index f65b35a05d91..de5f34492405 100644
> --- a/arch/x86/kvm/xen.c
> +++ b/arch/x86/kvm/xen.c
> @@ -881,7 +881,7 @@ int kvm_xen_vcpu_set_attr(struct kvm_vcpu *vcpu, struct kvm_xen_vcpu_attr *data)
> r = kvm_gpc_activate(&vcpu->arch.xen.vcpu_info_cache,
> data->u.gpa, sizeof(struct vcpu_info));
> } else {
> - if (data->u.hva == 0) {
> + if (data->u.hva == 0 || kvm_is_error_hva(data->u.hva)) {
> kvm_gpc_deactivate(&vcpu->arch.xen.vcpu_info_cache);
> r = 0;
> break;
Hmm, I think what we want is to return -EINVAL in this case, not deactivate the
region. I could have sworn KVM does that. Gah, I caught
KVM_XEN_ATTR_TYPE_SHARED_INFO_HVA during review, but missed this one. So to fix
this immediate bug, and avoid similar issues in the future, this?
diff --git a/arch/x86/kvm/xen.c b/arch/x86/kvm/xen.c
index 93814d3850eb..622fe24da910 100644
--- a/arch/x86/kvm/xen.c
+++ b/arch/x86/kvm/xen.c
@@ -741,7 +741,7 @@ int kvm_xen_hvm_set_attr(struct kvm *kvm, struct kvm_xen_hvm_attr *data)
} else {
void __user * hva = u64_to_user_ptr(data->u.shared_info.hva);
- if (!PAGE_ALIGNED(hva) || !access_ok(hva, PAGE_SIZE)) {
+ if (!PAGE_ALIGNED(hva)) {
r = -EINVAL;
} else if (!hva) {
kvm_gpc_deactivate(&kvm->arch.xen.shinfo_cache);
diff --git a/virt/kvm/pfncache.c b/virt/kvm/pfncache.c
index 0ab90f45db37..728d2c1b488a 100644
--- a/virt/kvm/pfncache.c
+++ b/virt/kvm/pfncache.c
@@ -438,6 +438,9 @@ int kvm_gpc_activate(struct gfn_to_pfn_cache *gpc, gpa_t gpa, unsigned long len)
int kvm_gpc_activate_hva(struct gfn_to_pfn_cache *gpc, unsigned long uhva, unsigned long len)
{
+ if (!access_ok((void __user *)uhva, len))
+ return -EINVAL;
+
return __kvm_gpc_activate(gpc, INVALID_GPA, uhva, len);
}
next prev parent reply other threads:[~2024-06-26 20:08 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-26 3:23 [PATCH] kvm: Fix warning in__kvm_gpc_refresh Pei Li
2024-06-26 20:08 ` Sean Christopherson [this message]
2024-06-27 4:32 ` Pei Li
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=Znx1T_hHNA_uThf2@google.com \
--to=seanjc@google.com \
--cc=bp@alien8.de \
--cc=dave.hansen@linux.intel.com \
--cc=dwmw2@infradead.org \
--cc=hpa@zytor.com \
--cc=justinstitt@google.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel-mentees@lists.linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=llvm@lists.linux.dev \
--cc=mingo@redhat.com \
--cc=morbo@google.com \
--cc=nathan@kernel.org \
--cc=ndesaulniers@google.com \
--cc=paul@xen.org \
--cc=pbonzini@redhat.com \
--cc=peili.dev@gmail.com \
--cc=skhan@linuxfoundation.org \
--cc=syzbot+fd555292a1da3180fc82@syzkaller.appspotmail.com \
--cc=syzkaller-bugs@googlegroups.com \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
/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.