From: "Michael S. Tsirkin" <mst@redhat.com>
To: Michael Bommarito <michael.bommarito@gmail.com>
Cc: Olivia Mackall <olivia@selenic.com>,
Herbert Xu <herbert@gondor.apana.org.au>,
linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org,
Jason Wang <jasowang@redhat.com>,
virtualization@lists.linux.dev
Subject: Re: [PATCH] hwrng: virtio: reject invalid used.len from the device
Date: Fri, 17 Apr 2026 20:13:31 -0400 [thread overview]
Message-ID: <20260417201129-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <20260418000020.1847122-1-michael.bommarito@gmail.com>
On Fri, Apr 17, 2026 at 08:00:20PM -0400, Michael Bommarito wrote:
> random_recv_done() stored the device-reported used.len directly into
> vi->data_avail without validating it against the posted buffer size
> sizeof(vi->data) (SMP_CACHE_BYTES bytes, typically 32 or 64). A
> malicious or buggy virtio-rng backend could set used.len beyond
> vi->data so that the subsequent copy_data() in virtio_read() issues
> memcpy() from vi->data + vi->data_idx past the end of the inline
> array, reading adjacent kmalloc-1k slab bytes into the hwrng core's
> buffer and from there into /dev/hwrng consumers and the kernel
> entropy pool.
>
> Exploitable most clearly in threat models that do not trust the
> hypervisor (confidential-compute guests on SEV-SNP or TDX; vhost-user
> split backends).
Exploitable? I don't get it. How is reading this data into hwrng
a problem?
> KASAN confirms the OOB on a guest booted under a QEMU 9.0 whose
> virtio-rng backend has been patched to report used.len = 0x10000:
>
> BUG: KASAN: slab-out-of-bounds in virtio_read+0x394/0x5d0
> Read of size 64 at addr ffff8880089c2220 by task hwrng/52
> Call Trace:
> __asan_memcpy
> virtio_read+0x394/0x5d0
> hwrng_fillfn+0xb2/0x470
> kthread
> Allocated by task 1:
> probe_common+0xa5/0x660
> virtio_dev_probe+0x549/0xbc0
> The buggy address belongs to the object at ffff8880089c2000
> which belongs to the cache kmalloc-1k of size 1024
> The buggy address is located 0 bytes to the right of
> allocated 544-byte region [ffff8880089c2000, ffff8880089c2220)
>
> hwrng_fillfn is a kernel thread that runs as soon as the device is
> probed; no guest userspace interaction is needed.
>
> Same class of bug as commit c04db81cd028 ("net/9p: Fix buffer overflow in USB transport layer"),
> which hardened usb9pfs_rx_complete against unchecked device-reported
> length in the USB 9p transport.
>
> With the added len-vs-sizeof(vi->data) clamp in place the same
> harness boots cleanly: the driver logs "bogus used.len" once and
> subsequent reads wait for a honest response.
>
> Fixes: f7f510ec1957 ("virtio: An entropy device, as suggested by hpa.")
> Cc: stable@vger.kernel.org
> Signed-off-by: Michael Bommarito <michael.bommarito@gmail.com>
> Assisted-by: Claude:claude-opus-4-7
> ---
> drivers/char/hw_random/virtio-rng.c | 12 ++++++++++++
> 1 file changed, 12 insertions(+)
>
> diff --git a/drivers/char/hw_random/virtio-rng.c b/drivers/char/hw_random/virtio-rng.c
> index 0ce02d7e5048..6cff480787ca 100644
> --- a/drivers/char/hw_random/virtio-rng.c
> +++ b/drivers/char/hw_random/virtio-rng.c
> @@ -47,6 +47,18 @@ static void random_recv_done(struct virtqueue *vq)
> if (!virtqueue_get_buf(vi->vq, &len))
> return;
>
> + /*
> + * The device sets used.len; a malicious or buggy backend can
> + * report more bytes than we posted. Clamp before it reaches
> + * copy_data() which indexes vi->data[].
> + */
> + if (len > sizeof(vi->data)) {
> + dev_err(&vq->vdev->dev,
> + "bogus used.len %u > buffer size %zu\n",
> + len, sizeof(vi->data));
> + len = 0;
> + }
> +
> smp_store_release(&vi->data_avail, len);
> complete(&vi->have_data);
> }
> --
> 2.53.0
next prev parent reply other threads:[~2026-04-18 0:13 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-18 0:00 [PATCH] hwrng: virtio: reject invalid used.len from the device Michael Bommarito
2026-04-18 0:13 ` Michael S. Tsirkin [this message]
2026-04-18 0:18 ` Michael Bommarito
2026-04-18 0:31 ` Michael S. Tsirkin
2026-04-18 0:47 ` Michael Bommarito
2026-04-18 12:11 ` Michael S. Tsirkin
2026-04-18 15:06 ` [PATCH v2] hwrng: virtio: clamp device-reported used.len at copy_data() Michael Bommarito
2026-04-18 17:18 ` Michael S. Tsirkin
2026-04-18 17:25 ` Michael Bommarito
2026-04-18 17:38 ` Michael S. Tsirkin
2026-04-18 17:56 ` Michael Bommarito
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=20260417201129-mutt-send-email-mst@kernel.org \
--to=mst@redhat.com \
--cc=herbert@gondor.apana.org.au \
--cc=jasowang@redhat.com \
--cc=linux-crypto@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=michael.bommarito@gmail.com \
--cc=olivia@selenic.com \
--cc=virtualization@lists.linux.dev \
/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.