aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorJamie Gritton <jamie@FreeBSD.org>2013-07-05 21:31:16 +0000
committerJamie Gritton <jamie@FreeBSD.org>2013-07-05 21:31:16 +0000
commitc71e336230ebd96f3617047923192a3b49f7befe (patch)
tree27053ab76be2f31865a9a3cba2472860fcc9f592 /sys
parent12df7d65b07a4ea7dac4e2ba3483cee9faf854d8 (diff)
Notes
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/mem/memdev.c11
-rw-r--r--sys/kern/kern_priv.c9
-rw-r--r--sys/sys/priv.h6
3 files changed, 24 insertions, 2 deletions
diff --git a/sys/dev/mem/memdev.c b/sys/dev/mem/memdev.c
index 28ed6ebc4e93..37bad1538f7f 100644
--- a/sys/dev/mem/memdev.c
+++ b/sys/dev/mem/memdev.c
@@ -37,6 +37,7 @@ __FBSDID("$FreeBSD$");
#include <sys/memrange.h>
#include <sys/module.h>
#include <sys/mutex.h>
+#include <sys/priv.h>
#include <sys/proc.h>
#include <sys/signalvar.h>
#include <sys/systm.h>
@@ -67,8 +68,14 @@ memopen(struct cdev *dev __unused, int flags, int fmt __unused,
{
int error = 0;
- if (flags & FWRITE)
- error = securelevel_gt(td->td_ucred, 0);
+ if (flags & FREAD)
+ error = priv_check(td, PRIV_KMEM_READ);
+ if (flags & FWRITE) {
+ if (error == 0)
+ error = priv_check(td, PRIV_KMEM_WRITE);
+ if (error == 0)
+ error = securelevel_gt(td->td_ucred, 0);
+ }
return (error);
}
diff --git a/sys/kern/kern_priv.c b/sys/kern/kern_priv.c
index fcd599393be4..204e00bb95e9 100644
--- a/sys/kern/kern_priv.c
+++ b/sys/kern/kern_priv.c
@@ -142,6 +142,15 @@ priv_check_cred(struct ucred *cred, int priv, int flags)
}
/*
+ * Writes to kernel memory are a typical root-only operation,
+ * but non-root users are expected to be able to read it.
+ */
+ if (priv == PRIV_KMEM_READ) {
+ error = 0;
+ goto out;
+ }
+
+ /*
* Now check with MAC, if enabled, to see if a policy module grants
* privilege.
*/
diff --git a/sys/sys/priv.h b/sys/sys/priv.h
index b984f1a0beb4..de3f3bd03b1c 100644
--- a/sys/sys/priv.h
+++ b/sys/sys/priv.h
@@ -494,6 +494,12 @@
#define PRIV_RCTL_REMOVE_RULE 674
/*
+ * Kernel memory privileges.
+ */
+#define PRIV_KMEM_READ 680 /* Read from kernel memory. */
+#define PRIV_KMEM_WRITE 681 /* Write to kernel memory. */
+
+/*
* Track end of privilege list.
*/
#define _PRIV_HIGHEST 675