summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorderaadt <deraadt@openbsd.org>2013-03-20 03:43:07 +0000
committerderaadt <deraadt@openbsd.org>2013-03-20 03:43:07 +0000
commit7f8de6195e8b6741c34c1a4a21b80a41bb7f9dcf (patch)
tree0617aafbfadbbb6b732ec3c55310571b7edd6349
parent- Sync the ring setup code closer to FreeBSD's driver (diff)
downloadwireguard-openbsd-7f8de6195e8b6741c34c1a4a21b80a41bb7f9dcf.tar.xz
wireguard-openbsd-7f8de6195e8b6741c34c1a4a21b80a41bb7f9dcf.zip
When non-root asks sysctl for kinfo proc or file requests, do not fill in
any kernel addresses information. ok guenther
-rw-r--r--lib/libkvm/kvm_proc2.c6
-rw-r--r--sys/kern/kern_sysctl.c46
-rw-r--r--sys/sys/sysctl.h20
3 files changed, 47 insertions, 25 deletions
diff --git a/lib/libkvm/kvm_proc2.c b/lib/libkvm/kvm_proc2.c
index bd4f81e8070..7d0ee24559a 100644
--- a/lib/libkvm/kvm_proc2.c
+++ b/lib/libkvm/kvm_proc2.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kvm_proc2.c,v 1.14 2012/11/12 00:29:09 guenther Exp $ */
+/* $OpenBSD: kvm_proc2.c,v 1.15 2013/03/20 03:43:08 deraadt Exp $ */
/* $NetBSD: kvm_proc.c,v 1.30 1999/03/24 05:50:50 mrg Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -289,7 +289,7 @@ kvm_proclist(kvm_t *kd, int op, int arg, struct proc *p,
if ((proc.p_flag & P_THREAD) == 0) {
FILL_KPROC(&kp, do_copy_str, &proc, &process, &pcred,
&ucred, &pgrp, p, proc.p_p, &sess, vmp, limp, sap,
- 0);
+ 0, 1);
/* stuff that's too painful to generalize */
kp.p_pid = process_pid;
@@ -322,7 +322,7 @@ kvm_proclist(kvm_t *kd, int op, int arg, struct proc *p,
continue;
FILL_KPROC(&kp, do_copy_str, &proc, &process, &pcred, &ucred,
- &pgrp, p, proc.p_p, &sess, vmp, limp, sap, 1);
+ &pgrp, p, proc.p_p, &sess, vmp, limp, sap, 1, 1);
/* stuff that's too painful to generalize into the macros */
kp.p_pid = process_pid;
diff --git a/sys/kern/kern_sysctl.c b/sys/kern/kern_sysctl.c
index 3aba61cac2f..9b2179f0947 100644
--- a/sys/kern/kern_sysctl.c
+++ b/sys/kern/kern_sysctl.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_sysctl.c,v 1.231 2013/02/11 11:11:42 mpi Exp $ */
+/* $OpenBSD: kern_sysctl.c,v 1.232 2013/03/20 03:43:08 deraadt Exp $ */
/* $NetBSD: kern_sysctl.c,v 1.17 1996/05/20 17:49:05 mrg Exp $ */
/*-
@@ -1061,23 +1061,28 @@ fill_file2(struct kinfo_file2 *kf, struct file *fp, struct filedesc *fdp,
int fd, struct vnode *vp, struct proc *pp, struct proc *p)
{
struct vattr va;
+ int show_pointers = suser(curproc, 0) == 0;
memset(kf, 0, sizeof(*kf));
kf->fd_fd = fd; /* might not really be an fd */
if (fp != NULL) {
- kf->f_fileaddr = PTRTOINT64(fp);
+ if (show_pointers)
+ kf->f_fileaddr = PTRTOINT64(fp);
kf->f_flag = fp->f_flag;
kf->f_iflags = fp->f_iflags;
kf->f_type = fp->f_type;
kf->f_count = fp->f_count;
kf->f_msgcount = fp->f_msgcount;
- kf->f_ucred = PTRTOINT64(fp->f_cred);
+ if (show_pointers)
+ kf->f_ucred = PTRTOINT64(fp->f_cred);
kf->f_uid = fp->f_cred->cr_uid;
kf->f_gid = fp->f_cred->cr_gid;
- kf->f_ops = PTRTOINT64(fp->f_ops);
- kf->f_data = PTRTOINT64(fp->f_data);
+ if (show_pointers)
+ kf->f_ops = PTRTOINT64(fp->f_ops);
+ if (show_pointers)
+ kf->f_data = PTRTOINT64(fp->f_data);
kf->f_usecount = 0;
if (suser(p, 0) == 0 || p->p_ucred->cr_uid == fp->f_cred->cr_uid) {
@@ -1103,12 +1108,15 @@ fill_file2(struct kinfo_file2 *kf, struct file *fp, struct filedesc *fdp,
if (fp != NULL)
vp = (struct vnode *)fp->f_data;
- kf->v_un = PTRTOINT64(vp->v_un.vu_socket);
+ if (show_pointers)
+ kf->v_un = PTRTOINT64(vp->v_un.vu_socket);
kf->v_type = vp->v_type;
kf->v_tag = vp->v_tag;
kf->v_flag = vp->v_flag;
- kf->v_data = PTRTOINT64(vp->v_data);
- kf->v_mount = PTRTOINT64(vp->v_mount);
+ if (show_pointers)
+ kf->v_data = PTRTOINT64(vp->v_data);
+ if (show_pointers)
+ kf->v_mount = PTRTOINT64(vp->v_mount);
if (vp->v_mount)
strlcpy(kf->f_mntonname,
vp->v_mount->mnt_stat.f_mntonname,
@@ -1128,11 +1136,13 @@ fill_file2(struct kinfo_file2 *kf, struct file *fp, struct filedesc *fdp,
kf->so_type = so->so_type;
kf->so_state = so->so_state;
- kf->so_pcb = PTRTOINT64(so->so_pcb);
+ if (show_pointers)
+ kf->so_pcb = PTRTOINT64(so->so_pcb);
kf->so_protocol = so->so_proto->pr_protocol;
kf->so_family = so->so_proto->pr_domain->dom_family;
if (so->so_splice) {
- kf->so_splice = PTRTOINT64(so->so_splice);
+ if (show_pointers)
+ kf->so_splice = PTRTOINT64(so->so_splice);
kf->so_splicelen = so->so_splicelen;
} else if (so->so_spliceback)
kf->so_splicelen = -1;
@@ -1142,7 +1152,8 @@ fill_file2(struct kinfo_file2 *kf, struct file *fp, struct filedesc *fdp,
case AF_INET: {
struct inpcb *inpcb = so->so_pcb;
- kf->inp_ppcb = PTRTOINT64(inpcb->inp_ppcb);
+ if (show_pointers)
+ kf->inp_ppcb = PTRTOINT64(inpcb->inp_ppcb);
kf->inp_lport = inpcb->inp_lport;
kf->inp_laddru[0] = inpcb->inp_laddr.s_addr;
kf->inp_fport = inpcb->inp_fport;
@@ -1170,7 +1181,8 @@ fill_file2(struct kinfo_file2 *kf, struct file *fp, struct filedesc *fdp,
case AF_UNIX: {
struct unpcb *unpcb = so->so_pcb;
- kf->unp_conn = PTRTOINT64(unpcb->unp_conn);
+ if (show_pointers)
+ kf->unp_conn = PTRTOINT64(unpcb->unp_conn);
break;
}
}
@@ -1180,7 +1192,8 @@ fill_file2(struct kinfo_file2 *kf, struct file *fp, struct filedesc *fdp,
case DTYPE_PIPE: {
struct pipe *pipe = (struct pipe *)fp->f_data;
- kf->pipe_peer = PTRTOINT64(pipe->pipe_peer);
+ if (show_pointers)
+ kf->pipe_peer = PTRTOINT64(pipe->pipe_peer);
kf->pipe_state = pipe->pipe_state;
break;
}
@@ -1525,9 +1538,11 @@ fill_kproc(struct proc *p, struct kinfo_proc *ki, int isthread)
struct session *s = pr->ps_session;
struct tty *tp;
struct timeval ut, st;
+ int show_pointers = suser(curproc, 0) == 0;
FILL_KPROC(ki, strlcpy, p, pr, p->p_cred, p->p_ucred, pr->ps_pgrp,
- p, pr, s, p->p_vmspace, pr->ps_limit, p->p_sigacts, isthread);
+ p, pr, s, p->p_vmspace, pr->ps_limit, p->p_sigacts, isthread,
+ show_pointers);
/* stuff that's too painful to generalize into the macros */
ki->p_pid = pr->ps_pid;
@@ -1539,7 +1554,8 @@ fill_kproc(struct proc *p, struct kinfo_proc *ki, int isthread)
if ((pr->ps_flags & PS_CONTROLT) && (tp = s->s_ttyp)) {
ki->p_tdev = tp->t_dev;
ki->p_tpgid = tp->t_pgrp ? tp->t_pgrp->pg_id : -1;
- ki->p_tsess = PTRTOINT64(tp->t_session);
+ if (show_pointers)
+ ki->p_tsess = PTRTOINT64(tp->t_session);
} else {
ki->p_tdev = NODEV;
ki->p_tpgid = -1;
diff --git a/sys/sys/sysctl.h b/sys/sys/sysctl.h
index 5be3124385d..8c0e8e35ae0 100644
--- a/sys/sys/sysctl.h
+++ b/sys/sys/sysctl.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: sysctl.h,v 1.127 2012/12/18 21:28:45 millert Exp $ */
+/* $OpenBSD: sysctl.h,v 1.128 2013/03/20 03:43:07 deraadt Exp $ */
/* $NetBSD: sysctl.h,v 1.16 1996/04/09 20:55:36 cgd Exp $ */
/*
@@ -462,18 +462,22 @@ struct kinfo_proc {
#define PTRTOINT64(_x) ((u_int64_t)(u_long)(_x))
-#define FILL_KPROC(kp, copy_str, p, pr, pc, uc, pg, paddr, praddr, sess, vm, lim, sa, isthread) \
+#define FILL_KPROC(kp, copy_str, p, pr, pc, uc, pg, paddr, \
+ praddr, sess, vm, lim, sa, isthread, show_addresses) \
do { \
memset((kp), 0, sizeof(*(kp))); \
\
- (kp)->p_paddr = PTRTOINT64(paddr); \
+ if (show_addresses) \
+ (kp)->p_paddr = PTRTOINT64(paddr); \
(kp)->p_fd = PTRTOINT64((p)->p_fd); \
(kp)->p_stats = 0; \
(kp)->p_limit = PTRTOINT64((pr)->ps_limit); \
(kp)->p_vmspace = PTRTOINT64((p)->p_vmspace); \
(kp)->p_sigacts = PTRTOINT64((p)->p_sigacts); \
- (kp)->p_sess = PTRTOINT64((pg)->pg_session); \
- (kp)->p_ru = PTRTOINT64((pr)->ps_ru); \
+ if (show_addresses) \
+ (kp)->p_sess = PTRTOINT64((pg)->pg_session); \
+ if (show_addresses) \
+ (kp)->p_ru = PTRTOINT64((pr)->ps_ru); \
\
(kp)->p_exitsig = (p)->p_exitsig; \
(kp)->p_flag = (p)->p_flag | (pr)->ps_flags | P_INMEM; \
@@ -512,7 +516,8 @@ do { \
(kp)->p_cpticks = (p)->p_cpticks; \
(kp)->p_pctcpu = (p)->p_pctcpu; \
\
- (kp)->p_tracep = PTRTOINT64((pr)->ps_tracevp); \
+ if (show_addresses) \
+ (kp)->p_tracep = PTRTOINT64((pr)->ps_tracevp); \
(kp)->p_traceflag = (pr)->ps_traceflag; \
\
(kp)->p_siglist = (p)->p_siglist; \
@@ -555,7 +560,8 @@ do { \
if ((p)->p_wmesg) \
copy_str((kp)->p_wmesg, (p)->p_wmesg, \
sizeof((kp)->p_wmesg)); \
- (kp)->p_wchan = PTRTOINT64((p)->p_wchan); \
+ if (show_addresses) \
+ (kp)->p_wchan = PTRTOINT64((p)->p_wchan); \
} \
\
if (lim) \