aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/ixl
diff options
context:
space:
mode:
authorEric Joyner <erj@FreeBSD.org>2020-01-02 23:24:57 +0000
committerEric Joyner <erj@FreeBSD.org>2020-01-02 23:24:57 +0000
commitab43ce7a22690b66cf76f0d8e70d538442657077 (patch)
tree126cbbb6cb3ae63679a54d7975fc86e1dc377a6b /sys/dev/ixl
parent9aafc7c0523456c8b5ee8919c97f75277cf4d70b (diff)
ixl: prevent non-privileged access to NVM update interface
Add a privilege check to the ixl_handle_nvmupd_cmd function, ensuring that only privileged users are allowed to access the NVM update interface. Signed-off-by: Jacob Keller <jacob.e.keller@intel.com> Submitted by: Jacob Keller <jacob.e.keller@intel.com> Reported by: markj@ Reviewed by: markj@, erj@, jeffrey.e.pieper@intel.com MFC after: 3 days Sponsored by: Intel Corporation Differential Revision: https://reviews.freebsd.org/D22870
Notes
Notes: svn path=/head/; revision=356309
Diffstat (limited to 'sys/dev/ixl')
-rw-r--r--sys/dev/ixl/if_ixl.c28
-rw-r--r--sys/dev/ixl/ixl.h1
2 files changed, 24 insertions, 5 deletions
diff --git a/sys/dev/ixl/if_ixl.c b/sys/dev/ixl/if_ixl.c
index 9e63e9a23556..ecf41e3d568f 100644
--- a/sys/dev/ixl/if_ixl.c
+++ b/sys/dev/ixl/if_ixl.c
@@ -1624,11 +1624,29 @@ ixl_if_priv_ioctl(if_ctx_t ctx, u_long command, caddr_t data)
struct ifdrv *ifd = (struct ifdrv *)data;
int error = 0;
- /* NVM update command */
- if (ifd->ifd_cmd == I40E_NVM_ACCESS)
- error = ixl_handle_nvmupd_cmd(pf, ifd);
- else
- error = EINVAL;
+ /*
+ * The iflib_if_ioctl forwards SIOCxDRVSPEC and SIOGPRIVATE_0 without
+ * performing privilege checks. It is important that this function
+ * perform the necessary checks for commands which should only be
+ * executed by privileged threads.
+ */
+
+ switch(command) {
+ case SIOCGDRVSPEC:
+ case SIOCSDRVSPEC:
+ /* NVM update command */
+ if (ifd->ifd_cmd == I40E_NVM_ACCESS) {
+ error = priv_check(curthread, PRIV_DRIVER);
+ if (error)
+ break;
+ error = ixl_handle_nvmupd_cmd(pf, ifd);
+ } else {
+ error = EINVAL;
+ }
+ break;
+ default:
+ error = EOPNOTSUPP;
+ }
return (error);
}
diff --git a/sys/dev/ixl/ixl.h b/sys/dev/ixl/ixl.h
index d38f391cf928..41d682dadfea 100644
--- a/sys/dev/ixl/ixl.h
+++ b/sys/dev/ixl/ixl.h
@@ -52,6 +52,7 @@
#include <sys/sockio.h>
#include <sys/eventhandler.h>
#include <sys/syslog.h>
+#include <sys/priv.h>
#include <net/if.h>
#include <net/if_var.h>