diff options
| author | Jamie Gritton <jamie@FreeBSD.org> | 2013-07-05 21:31:16 +0000 |
|---|---|---|
| committer | Jamie Gritton <jamie@FreeBSD.org> | 2013-07-05 21:31:16 +0000 |
| commit | c71e336230ebd96f3617047923192a3b49f7befe (patch) | |
| tree | 27053ab76be2f31865a9a3cba2472860fcc9f592 /sys | |
| parent | 12df7d65b07a4ea7dac4e2ba3483cee9faf854d8 (diff) | |
Notes
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/dev/mem/memdev.c | 11 | ||||
| -rw-r--r-- | sys/kern/kern_priv.c | 9 | ||||
| -rw-r--r-- | sys/sys/priv.h | 6 |
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 |
