All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Andrea Parri (Microsoft)" <parri.andrea@gmail.com>
To: KY Srinivasan <kys@microsoft.com>,
	Haiyang Zhang <haiyangz@microsoft.com>,
	Stephen Hemminger <sthemmin@microsoft.com>,
	Wei Liu <wei.liu@kernel.org>, Dexuan Cui <decui@microsoft.com>,
	Michael Kelley <mikelley@microsoft.com>,
	Stefano Garzarella <sgarzare@redhat.com>,
	David Miller <davem@davemloft.net>,
	Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>
Cc: linux-hyperv@vger.kernel.org,
	virtualization@lists.linux-foundation.org,
	netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
	"Andrea Parri (Microsoft)" <parri.andrea@gmail.com>
Subject: [RFC PATCH 3/6] hv_sock: Add validation for untrusted Hyper-V values
Date: Wed, 13 Apr 2022 22:47:39 +0200	[thread overview]
Message-ID: <20220413204742.5539-4-parri.andrea@gmail.com> (raw)
In-Reply-To: <20220413204742.5539-1-parri.andrea@gmail.com>

For additional robustness in the face of Hyper-V errors or malicious
behavior, validate all values that originate from packets that Hyper-V
has sent to the guest in the host-to-guest ring buffer.  Ensure that
invalid values cannot cause data being copied out of the bounds of the
source buffer in hvs_stream_dequeue().

Signed-off-by: Andrea Parri (Microsoft) <parri.andrea@gmail.com>
---
 include/linux/hyperv.h           |  5 +++++
 net/vmw_vsock/hyperv_transport.c | 11 +++++++++--
 2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h
index fe2e0179ed51e..55478a6810b60 100644
--- a/include/linux/hyperv.h
+++ b/include/linux/hyperv.h
@@ -1663,6 +1663,11 @@ static inline u32 hv_pkt_datalen(const struct vmpacket_descriptor *desc)
 	return (desc->len8 << 3) - (desc->offset8 << 3);
 }
 
+/* Get packet length associated with descriptor */
+static inline u32 hv_pkt_len(const struct vmpacket_descriptor *desc)
+{
+	return desc->len8 << 3;
+}
 
 struct vmpacket_descriptor *
 hv_pkt_iter_first_raw(struct vmbus_channel *channel);
diff --git a/net/vmw_vsock/hyperv_transport.c b/net/vmw_vsock/hyperv_transport.c
index 8c37d07017fc4..092cadc2c866d 100644
--- a/net/vmw_vsock/hyperv_transport.c
+++ b/net/vmw_vsock/hyperv_transport.c
@@ -577,12 +577,19 @@ static bool hvs_dgram_allow(u32 cid, u32 port)
 static int hvs_update_recv_data(struct hvsock *hvs)
 {
 	struct hvs_recv_buf *recv_buf;
-	u32 payload_len;
+	u32 pkt_len, payload_len;
+
+	pkt_len = hv_pkt_len(hvs->recv_desc);
+
+	/* Ensure the packet is big enough to read its header */
+	if (pkt_len < HVS_HEADER_LEN)
+		return -EIO;
 
 	recv_buf = (struct hvs_recv_buf *)(hvs->recv_desc + 1);
 	payload_len = recv_buf->hdr.data_size;
 
-	if (payload_len > HVS_MTU_SIZE)
+	/* Ensure the packet is big enough to read its payload */
+	if (payload_len > pkt_len - HVS_HEADER_LEN || payload_len > HVS_MTU_SIZE)
 		return -EIO;
 
 	if (payload_len == 0)
-- 
2.25.1


  parent reply	other threads:[~2022-04-13 20:48 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-13 20:47 [RFC PATCH 0/6] hv_sock: Hardening changes Andrea Parri (Microsoft)
2022-04-13 20:47 ` [RFC PATCH 1/6] hv_sock: Check hv_pkt_iter_first_raw()'s return value Andrea Parri (Microsoft)
2022-04-15  3:33   ` Michael Kelley (LINUX) via Virtualization
2022-04-15  3:33     ` Michael Kelley (LINUX)
2022-04-15  6:41     ` Andrea Parri
2022-04-15 14:27       ` Michael Kelley (LINUX) via Virtualization
2022-04-15 14:27         ` Michael Kelley (LINUX)
2022-04-15 16:09         ` Andrea Parri
2022-04-13 20:47 ` [RFC PATCH 2/6] hv_sock: Copy packets sent by Hyper-V out of the ring buffer Andrea Parri (Microsoft)
2022-04-15  3:33   ` Michael Kelley (LINUX) via Virtualization
2022-04-15  3:33     ` Michael Kelley (LINUX)
2022-04-15  6:42     ` Andrea Parri
2022-04-13 20:47 ` Andrea Parri (Microsoft) [this message]
2022-04-13 20:47 ` [RFC PATCH 4/6] hv_sock: Initialize send_buf in hvs_stream_enqueue() Andrea Parri (Microsoft)
2022-04-15  3:33   ` Michael Kelley (LINUX) via Virtualization
2022-04-15  3:33     ` Michael Kelley (LINUX)
2022-04-15  6:50     ` Andrea Parri
2022-04-15 14:30       ` Michael Kelley (LINUX) via Virtualization
2022-04-15 14:30         ` Michael Kelley (LINUX)
2022-04-15 16:16         ` Andrea Parri
2022-04-13 20:47 ` [RFC PATCH 5/6] Drivers: hv: vmbus: Accept hv_sock offers in isolated guests Andrea Parri (Microsoft)
2022-04-15  3:33   ` Michael Kelley (LINUX) via Virtualization
2022-04-15  3:33     ` Michael Kelley (LINUX)
2022-04-15  6:58     ` Andrea Parri
2022-04-13 20:47 ` [RFC PATCH 6/6] Drivers: hv: vmbus: Refactor the ring-buffer iterator functions Andrea Parri (Microsoft)
2022-04-15  3:34   ` Michael Kelley (LINUX) via Virtualization
2022-04-15  3:34     ` Michael Kelley (LINUX)
2022-04-15  7:00     ` Andrea Parri
2022-04-15 16:28       ` Andrea Parri
2022-04-15 16:44         ` Michael Kelley (LINUX)
2022-04-15 16:44           ` Michael Kelley (LINUX) via Virtualization
2022-04-15 17:05           ` Andrea Parri

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=20220413204742.5539-4-parri.andrea@gmail.com \
    --to=parri.andrea@gmail.com \
    --cc=davem@davemloft.net \
    --cc=decui@microsoft.com \
    --cc=haiyangz@microsoft.com \
    --cc=kuba@kernel.org \
    --cc=kys@microsoft.com \
    --cc=linux-hyperv@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mikelley@microsoft.com \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=sgarzare@redhat.com \
    --cc=sthemmin@microsoft.com \
    --cc=virtualization@lists.linux-foundation.org \
    --cc=wei.liu@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.