Daniel Wagner b7ea8f
From: Keith Busch <kbusch@kernel.org>
Daniel Wagner b7ea8f
Date: Thu, 22 Sep 2022 07:54:06 -0700
Daniel Wagner b7ea8f
Subject: [PATCH] nvme: restrict management ioctls to admin
Oscar Salvador 32aee9
Patch-mainline: v6.0-rc2
Daniel Wagner b7ea8f
Git-commit: 23e085b2dead13b51fe86d27069895b740f749c0
Daniel Wagner b7ea8f
References: bsc#1203290 CVE-2022-3169
Daniel Wagner b7ea8f
Daniel Wagner b7ea8f
The passthrough commands already have this restriction, but the other
Daniel Wagner b7ea8f
operations do not. Require the same capabilities for all users as all of
Daniel Wagner b7ea8f
these operations, which include resets and rescans, can be disruptive.
Daniel Wagner b7ea8f
Daniel Wagner b7ea8f
Signed-off-by: Keith Busch <kbusch@kernel.org>
Daniel Wagner b7ea8f
Signed-off-by: Christoph Hellwig <hch@lst.de>
Daniel Wagner b7ea8f
[dwagner: updated context]
Daniel Wagner b7ea8f
Acked-by: Daniel Wagner <dwagner@suse.de>
Daniel Wagner b7ea8f
---
Daniel Wagner b7ea8f
 drivers/nvme/host/core.c |    6 ++++++
Daniel Wagner b7ea8f
 1 file changed, 6 insertions(+)
Daniel Wagner b7ea8f
Daniel Wagner b7ea8f
--- a/drivers/nvme/host/core.c
Daniel Wagner b7ea8f
+++ b/drivers/nvme/host/core.c
Daniel Wagner b7ea8f
@@ -3106,11 +3106,17 @@ static long nvme_dev_ioctl(struct file *
Daniel Wagner b7ea8f
 	case NVME_IOCTL_IO_CMD:
Daniel Wagner b7ea8f
 		return nvme_dev_user_cmd(ctrl, argp);
Daniel Wagner b7ea8f
 	case NVME_IOCTL_RESET:
Daniel Wagner b7ea8f
+		if (!capable(CAP_SYS_ADMIN))
Daniel Wagner b7ea8f
+			return -EACCES;
Daniel Wagner b7ea8f
 		dev_warn(ctrl->device, "resetting controller\n");
Daniel Wagner b7ea8f
 		return nvme_reset_ctrl_sync(ctrl);
Daniel Wagner b7ea8f
 	case NVME_IOCTL_SUBSYS_RESET:
Daniel Wagner b7ea8f
+		if (!capable(CAP_SYS_ADMIN))
Daniel Wagner b7ea8f
+			return -EACCES;
Daniel Wagner b7ea8f
 		return nvme_reset_subsystem(ctrl);
Daniel Wagner b7ea8f
 	case NVME_IOCTL_RESCAN:
Daniel Wagner b7ea8f
+		if (!capable(CAP_SYS_ADMIN))
Daniel Wagner b7ea8f
+			return -EACCES;
Daniel Wagner b7ea8f
 		nvme_queue_scan(ctrl);
Daniel Wagner b7ea8f
 		return 0;
Daniel Wagner b7ea8f
 	default: