RE: [PATCH 3/3] hv_netvsc: Use vmbus_requestor to generate transaction IDs for VMBus hardening
From: Haiyang Zhang <haiyangz@microsoft.com>
Date: 2020-06-25 18:57:58
Also in:
linux-hyperv, lkml
quoted hunk ↗ jump to hunk
-----Original Message----- From: Andres Beltran <redacted> Sent: Thursday, June 25, 2020 11:37 AM To: KY Srinivasan <kys@microsoft.com>; Haiyang Zhang [off-list ref]; Stephen Hemminger [off-list ref]; wei.liu@kernel.org Cc: linux-hyperv@vger.kernel.org; linux-kernel@vger.kernel.org; Michael Kelley [off-list ref]; parri.andrea@gmail.com; Andres Beltran [off-list ref]; David S. Miller [off-list ref]; Jakub Kicinski [off-list ref]; netdev@vger.kernel.org Subject: [PATCH 3/3] hv_netvsc: Use vmbus_requestor to generate transaction IDs for VMBus hardening Currently, pointers to guest memory are passed to Hyper-V as transaction IDs in netvsc. In the face of errors or malicious behavior in Hyper-V, netvsc should not expose or trust the transaction IDs returned by Hyper-V to be valid guest memory addresses. Instead, use small integers generated by vmbus_requestor as requests (transaction) IDs. Cc: "David S. Miller" <davem@davemloft.net> Cc: Jakub Kicinski <kuba@kernel.org> Cc: netdev@vger.kernel.org Signed-off-by: Andres Beltran <redacted> --- drivers/net/hyperv/hyperv_net.h | 10 +++++ drivers/net/hyperv/netvsc.c | 75 +++++++++++++++++++++++++------ drivers/net/hyperv/rndis_filter.c | 1 + include/linux/hyperv.h | 1 + 4 files changed, 73 insertions(+), 14 deletions(-)diff --git a/drivers/net/hyperv/hyperv_net.h b/drivers/net/hyperv/hyperv_net.h index abda736e7c7d..14735c98e798 100644 --- a/drivers/net/hyperv/hyperv_net.h +++ b/drivers/net/hyperv/hyperv_net.h@@ -847,6 +847,16 @@ struct nvsp_message { #define NETVSC_XDP_HDRM 256 +#define NETVSC_MIN_OUT_MSG_SIZE (sizeof(struct vmpacket_descriptor) + \ + sizeof(struct nvsp_message)) +#define NETVSC_MIN_IN_MSG_SIZE sizeof(struct vmpacket_descriptor) + +/* Estimated requestor size: + * out_ring_size/min_out_msg_size + in_ring_size/min_in_msg_size + */ +#define NETVSC_RQSTOR_SIZE (netvsc_ring_bytes /NETVSC_MIN_OUT_MSG_SIZE + \ + netvsc_ring_bytes / NETVSC_MIN_IN_MSG_SIZE)
Please make the variable as the macro parameter for readability: #define NETVSC_RQSTOR_SIZE(ringbytes) (ringbytes / NETVSC_MIN_OUT_MSG_SIZE ... Then put the actual variable name when you use the macro. Thanks, - Haiyang