[Spice-devel] [PATCH usbredir 2/8] Add whitelists and blacklists to control access.

Jeremy White jwhite at codeweavers.com
Wed Dec 9 14:16:02 PST 2015


Signed-off-by: Jeremy White <jwhite at codeweavers.com>
---
 kernel/main.c  | 10 ++++++++++
 kernel/redir.c | 34 ++++++++++++++++++++++++++++++++++
 2 files changed, 44 insertions(+)

diff --git a/kernel/main.c b/kernel/main.c
index cf11cbb..7b52b94 100644
--- a/kernel/main.c
+++ b/kernel/main.c
@@ -88,6 +88,16 @@ module_param(devices_per_hub, uint, S_IRUSR|S_IWUSR);
 MODULE_PARM_DESC(devices_per_hub,
 		"Maximum number of devices per hub; default 16");
 
+char *whitelist = NULL;
+module_param(whitelist, charp, S_IRUSR|S_IWUSR);
+MODULE_PARM_DESC(whitelist,
+		"List of acceptable devices permitted to connect.");
+
+char *blacklist = NULL;
+module_param(blacklist, charp, S_IRUSR|S_IWUSR);
+MODULE_PARM_DESC(blacklist,
+		"List of devices not permitted to connect.");
+
 module_init(usbredir_main_init);
 module_exit(usbredir_main_exit);
 
diff --git a/kernel/redir.c b/kernel/redir.c
index 5531707..0c71aee 100644
--- a/kernel/redir.c
+++ b/kernel/redir.c
@@ -141,6 +141,19 @@ static void redir_free_lock(void *lock)
 	kfree(lock);
 }
 
+static bool find_device(const char *list, int vendor, int id)
+{
+	const char *p;
+	char buf[24];
+
+	sprintf(buf, "%04x:%04x", vendor, id);
+
+	for (p = list; strlen(p) >= strlen(buf); p++)
+		if (strncasecmp(p, buf, strlen(buf)) == 0)
+			return true;
+
+	return false;
+}
 
 /* The below callbacks are called when a complete packet of the relevant
    type has been received.
@@ -154,6 +167,8 @@ static void redir_hello(void *priv, struct usb_redir_hello_header *hello)
 	pr_debug("Hello!\n");
 }
 
+extern char *whitelist;
+extern char *blacklist;
 static void redir_device_connect(void *priv,
 	struct usb_redir_device_connect_header *device_connect)
 {
@@ -165,6 +180,25 @@ static void redir_device_connect(void *priv,
 	pr_debug("  vendor 0x%04x product %04x\n",
 		device_connect->vendor_id, device_connect->product_id);
 
+	if (whitelist && ! find_device(whitelist, device_connect->vendor_id,
+			device_connect->product_id)) {
+		pr_err("Device %04x:%04x not in white list.\n",
+		device_connect->vendor_id, device_connect->product_id);
+		if (udev->socket)
+			kernel_sock_shutdown(udev->socket, SHUT_RDWR);
+		return;
+	}
+
+	if (blacklist && find_device(blacklist, device_connect->vendor_id,
+			device_connect->product_id)) {
+		pr_err("Device %04x:%04x in black list.\n",
+		device_connect->vendor_id, device_connect->product_id);
+		if (udev->socket)
+			kernel_sock_shutdown(udev->socket, SHUT_RDWR);
+		return;
+	}
+
+
 	spin_lock(&udev->lock);
 	udev->connect_header = *device_connect;
 	spin_unlock(&udev->lock);
-- 
2.1.4



More information about the Spice-devel mailing list