Commit 21a4e356 authored by Andrea Parri (Microsoft)'s avatar Andrea Parri (Microsoft) Committed by Wei Liu

Drivers: hv: vmbus: Restrict vmbus_devices on isolated guests

Only the VSCs or ICs that have been hardened and that are critical for
the successful adoption of Confidential VMs should be allowed if the
guest is running isolated.  This change reduces the footprint of the
code that will be exercised by Confidential VMs and hence the exposure
to bugs and vulnerabilities.
Signed-off-by: default avatarAndrea Parri (Microsoft) <parri.andrea@gmail.com>
Reviewed-by: default avatarMichael Kelley <mikelley@microsoft.com>
Link: https://lore.kernel.org/r/20210201144814.2701-3-parri.andrea@gmail.comSigned-off-by: default avatarWei Liu <wei.liu@kernel.org>
parent a6c76bb0
...@@ -31,101 +31,118 @@ const struct vmbus_device vmbus_devs[] = { ...@@ -31,101 +31,118 @@ const struct vmbus_device vmbus_devs[] = {
{ .dev_type = HV_IDE, { .dev_type = HV_IDE,
HV_IDE_GUID, HV_IDE_GUID,
.perf_device = true, .perf_device = true,
.allowed_in_isolated = false,
}, },
/* SCSI */ /* SCSI */
{ .dev_type = HV_SCSI, { .dev_type = HV_SCSI,
HV_SCSI_GUID, HV_SCSI_GUID,
.perf_device = true, .perf_device = true,
.allowed_in_isolated = true,
}, },
/* Fibre Channel */ /* Fibre Channel */
{ .dev_type = HV_FC, { .dev_type = HV_FC,
HV_SYNTHFC_GUID, HV_SYNTHFC_GUID,
.perf_device = true, .perf_device = true,
.allowed_in_isolated = false,
}, },
/* Synthetic NIC */ /* Synthetic NIC */
{ .dev_type = HV_NIC, { .dev_type = HV_NIC,
HV_NIC_GUID, HV_NIC_GUID,
.perf_device = true, .perf_device = true,
.allowed_in_isolated = true,
}, },
/* Network Direct */ /* Network Direct */
{ .dev_type = HV_ND, { .dev_type = HV_ND,
HV_ND_GUID, HV_ND_GUID,
.perf_device = true, .perf_device = true,
.allowed_in_isolated = false,
}, },
/* PCIE */ /* PCIE */
{ .dev_type = HV_PCIE, { .dev_type = HV_PCIE,
HV_PCIE_GUID, HV_PCIE_GUID,
.perf_device = false, .perf_device = false,
.allowed_in_isolated = false,
}, },
/* Synthetic Frame Buffer */ /* Synthetic Frame Buffer */
{ .dev_type = HV_FB, { .dev_type = HV_FB,
HV_SYNTHVID_GUID, HV_SYNTHVID_GUID,
.perf_device = false, .perf_device = false,
.allowed_in_isolated = false,
}, },
/* Synthetic Keyboard */ /* Synthetic Keyboard */
{ .dev_type = HV_KBD, { .dev_type = HV_KBD,
HV_KBD_GUID, HV_KBD_GUID,
.perf_device = false, .perf_device = false,
.allowed_in_isolated = false,
}, },
/* Synthetic MOUSE */ /* Synthetic MOUSE */
{ .dev_type = HV_MOUSE, { .dev_type = HV_MOUSE,
HV_MOUSE_GUID, HV_MOUSE_GUID,
.perf_device = false, .perf_device = false,
.allowed_in_isolated = false,
}, },
/* KVP */ /* KVP */
{ .dev_type = HV_KVP, { .dev_type = HV_KVP,
HV_KVP_GUID, HV_KVP_GUID,
.perf_device = false, .perf_device = false,
.allowed_in_isolated = false,
}, },
/* Time Synch */ /* Time Synch */
{ .dev_type = HV_TS, { .dev_type = HV_TS,
HV_TS_GUID, HV_TS_GUID,
.perf_device = false, .perf_device = false,
.allowed_in_isolated = true,
}, },
/* Heartbeat */ /* Heartbeat */
{ .dev_type = HV_HB, { .dev_type = HV_HB,
HV_HEART_BEAT_GUID, HV_HEART_BEAT_GUID,
.perf_device = false, .perf_device = false,
.allowed_in_isolated = true,
}, },
/* Shutdown */ /* Shutdown */
{ .dev_type = HV_SHUTDOWN, { .dev_type = HV_SHUTDOWN,
HV_SHUTDOWN_GUID, HV_SHUTDOWN_GUID,
.perf_device = false, .perf_device = false,
.allowed_in_isolated = true,
}, },
/* File copy */ /* File copy */
{ .dev_type = HV_FCOPY, { .dev_type = HV_FCOPY,
HV_FCOPY_GUID, HV_FCOPY_GUID,
.perf_device = false, .perf_device = false,
.allowed_in_isolated = false,
}, },
/* Backup */ /* Backup */
{ .dev_type = HV_BACKUP, { .dev_type = HV_BACKUP,
HV_VSS_GUID, HV_VSS_GUID,
.perf_device = false, .perf_device = false,
.allowed_in_isolated = false,
}, },
/* Dynamic Memory */ /* Dynamic Memory */
{ .dev_type = HV_DM, { .dev_type = HV_DM,
HV_DM_GUID, HV_DM_GUID,
.perf_device = false, .perf_device = false,
.allowed_in_isolated = false,
}, },
/* Unknown GUID */ /* Unknown GUID */
{ .dev_type = HV_UNKNOWN, { .dev_type = HV_UNKNOWN,
.perf_device = false, .perf_device = false,
.allowed_in_isolated = false,
}, },
}; };
...@@ -903,6 +920,20 @@ find_primary_channel_by_offer(const struct vmbus_channel_offer_channel *offer) ...@@ -903,6 +920,20 @@ find_primary_channel_by_offer(const struct vmbus_channel_offer_channel *offer)
return channel; return channel;
} }
static bool vmbus_is_valid_device(const guid_t *guid)
{
u16 i;
if (!hv_is_isolation_supported())
return true;
for (i = 0; i < ARRAY_SIZE(vmbus_devs); i++) {
if (guid_equal(guid, &vmbus_devs[i].guid))
return vmbus_devs[i].allowed_in_isolated;
}
return false;
}
/* /*
* vmbus_onoffer - Handler for channel offers from vmbus in parent partition. * vmbus_onoffer - Handler for channel offers from vmbus in parent partition.
* *
...@@ -917,6 +948,13 @@ static void vmbus_onoffer(struct vmbus_channel_message_header *hdr) ...@@ -917,6 +948,13 @@ static void vmbus_onoffer(struct vmbus_channel_message_header *hdr)
trace_vmbus_onoffer(offer); trace_vmbus_onoffer(offer);
if (!vmbus_is_valid_device(&offer->offer.if_type)) {
pr_err_ratelimited("Invalid offer %d from the host supporting isolation\n",
offer->child_relid);
atomic_dec(&vmbus_connection.offer_in_progress);
return;
}
oldchannel = find_primary_channel_by_offer(offer); oldchannel = find_primary_channel_by_offer(offer);
if (oldchannel != NULL) { if (oldchannel != NULL) {
......
...@@ -789,6 +789,7 @@ struct vmbus_device { ...@@ -789,6 +789,7 @@ struct vmbus_device {
u16 dev_type; u16 dev_type;
guid_t guid; guid_t guid;
bool perf_device; bool perf_device;
bool allowed_in_isolated;
}; };
#define VMBUS_DEFAULT_MAX_PKT_SIZE 4096 #define VMBUS_DEFAULT_MAX_PKT_SIZE 4096
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment