Thanks, Michael. Leave it to me to forget to update the documentation..
Here's the patch with the manpage change:
Index: sys/kern/kern_sysctl.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_sysctl.c,v
retrieving revision 1.320
diff -u -p -u -r1.320 kern_sysctl.c
--- sys/kern/kern_sysctl.c 11 Nov 2016 18:59:09 -0000 1.320
+++ sys/kern/kern_sysctl.c 4 Dec 2016 20:43:53 -0000
@@ -263,6 +263,7 @@ size_t disknameslen;
struct diskstats *diskstats = NULL;
size_t diskstatslen;
int securelevel;
+int seeotheruids = 1; /* on by default */
/*
* kernel related system variables.
@@ -632,6 +633,13 @@ kern_sysctl(int *name, u_int namelen, vo
dnsjackport = port;
return 0;
}
+ case KERN_SEEOTHERUIDS: {
+ if (securelevel > 0)
+ return (sysctl_rdint(oldp, oldlenp, newp,
+ seeotheruids));
+ return (sysctl_int(oldp, oldlenp, newp, newlen,
+ &seeotheruids));
+ }
default:
return (EOPNOTSUPP);
}
@@ -1427,7 +1435,8 @@ sysctl_doproc(int *name, u_int namelen,
int arg, buflen, doingzomb, elem_size, elem_count;
int error, needed, op;
int dothreads = 0;
- int show_pointers;
+ int is_suser, show_pointers, show_otheruids;
+ uid_t euid;
dp = where;
buflen = where != NULL ? *sizep : 0;
@@ -1444,7 +1453,10 @@ sysctl_doproc(int *name, u_int namelen,
dothreads = op & KERN_PROC_SHOW_THREADS;
op &= ~KERN_PROC_SHOW_THREADS;
- show_pointers = suser(curproc, 0) == 0;
+ is_suser = suser(curproc, 0) == 0;
+ show_pointers = is_suser;
+ show_otheruids = seeotheruids || is_suser;
+ euid = curproc->p_ucred->cr_uid;
if (where != NULL)
kproc = malloc(sizeof(*kproc), M_TEMP, M_WAITOK);
@@ -1461,6 +1473,9 @@ again:
* Skip embryonic processes.
*/
if (pr->ps_flags & PS_EMBRYO)
+ continue;
+
+ if (!show_otheruids && pr->ps_ucred->cr_uid != euid)
continue;
/*
Index: sys/sys/sysctl.h
===================================================================
RCS file: /cvs/src/sys/sys/sysctl.h,v
retrieving revision 1.170
diff -u -p -u -r1.170 sysctl.h
--- sys/sys/sysctl.h 7 Nov 2016 00:26:32 -0000 1.170
+++ sys/sys/sysctl.h 4 Dec 2016 20:43:55 -0000
@@ -184,7 +184,8 @@ struct ctlname {
#define KERN_GLOBAL_PTRACE 81 /* allow ptrace globally */
#define KERN_CONSBUFSIZE 82 /* int: console message buffer
size */
#define KERN_CONSBUF 83 /* console message buffer */
-#define KERN_MAXID 84 /* number of valid kern ids */
+#define KERN_SEEOTHERUIDS 84 /* see other users' proceesses
*/
+#define KERN_MAXID 85 /* number of valid kern ids */
#define CTL_KERN_NAMES { \
{ 0, 0 }, \
@@ -269,6 +270,9 @@ struct ctlname {
{ "proc_nobroadcastkill", CTLTYPE_NODE }, \
{ "proc_vmmap", CTLTYPE_NODE }, \
{ "global_ptrace", CTLTYPE_INT }, \
+ { "gap", 0 }, \
+ { "gap", 0 }, \
+ { "see_other_uids", CTLTYPE_INT }, \
}
/*
Index: sbin/sysctl/sysctl.8
===================================================================
RCS file: /cvs/src/sbin/sysctl/sysctl.8,v
retrieving revision 1.208
diff -u -p -u -r1.208 sysctl.8
--- sbin/sysctl/sysctl.8 15 Oct 2016 14:43:53 -0000 1.208
+++ sbin/sysctl/sysctl.8 5 Dec 2016 02:04:52 -0000
@@ -194,6 +194,7 @@ and a few require a kernel compiled with
.It kern.wxabort Ta integer Ta yes
.It kern.consdev Ta string Ta no
.It kern.global_ptrace Ta integer Ta yes
+.It kern.see_other_uids Ta integer Ta yes
.It vm.vmmeter Ta struct Ta no
.It vm.loadavg Ta struct Ta no
.It vm.psstrings Ta struct Ta no
On Mon, Dec 05, 2016 at 08:55:19AM +0800, Michael W. Bombardieri wrote:
> Should this patch also add see_other_uids in sysctl(8) manual?
>
> On Sun, Dec 04, 2016 at 07:49:12PM -0500, Ian Walker wrote:
> > (( Resending my last from a client that (hopefully) won't mangle the email.
> > Sorry about the noise, folks. ))
> >
> >
> > Hello OpenBSD Community -
> >
> > OpenBSD should have the ability to prevent users from seeing each other's
> > processes even if this ability is disabled by default.
> > In addition to the small security benefit this provides, it also affords
> > each user a much greater amount of privacy. Linux and
> > FreeBSD already support similar features (
> > https://www.cyberciti.biz/faq/linux-hide-processes-from-other-users/ &&
> > https://www.cyberciti.biz/faq/freebsd-disable-ps-sockstat-command-information-leakage/
> > ) and the implementation itself is fairly
> > trivial.
> >
> > Below is a patch which implements basic process hiding for non-superusers
> > and is activated with a sysctl knob. Similar to that of
> > FreeBSD it is called "kern.see_other_uids¨. The idea is that if process
> > spying is a security or privacy concern for you, you
> > would add "kern.see_other_uids=0" to sysctl.conf and reboot (assuming
> > securelevel > 0).
> >
> > I look forward to your comments.
> >
> > Thanks and cheers all -
> > Ian Walker
> >
> >
> >
> > Index: sys/kern/kern_sysctl.c
> > ===================================================================
> > RCS file: /cvs/src/sys/kern/kern_sysctl.c,v
> > retrieving revision 1.320
> > diff -u -p -u -r1.320 kern_sysctl.c
> > --- sys/kern/kern_sysctl.c 11 Nov 2016 18:59:09 -0000 1.320
> > +++ sys/kern/kern_sysctl.c 4 Dec 2016 20:43:53 -0000
> > @@ -263,6 +263,7 @@ size_t disknameslen;
> > struct diskstats *diskstats = NULL;
> > size_t diskstatslen;
> > int securelevel;
> > +int seeotheruids = 1; /* on by default */
> >
> > /*
> > * kernel related system variables.
> > @@ -632,6 +633,13 @@ kern_sysctl(int *name, u_int namelen, vo
> > dnsjackport = port;
> > return 0;
> > }
> > + case KERN_SEEOTHERUIDS: {
> > + if (securelevel > 0)
> > + return (sysctl_rdint(oldp, oldlenp, newp,
> > + seeotheruids));
> > + return (sysctl_int(oldp, oldlenp, newp, newlen,
> > + &seeotheruids));
> > + }
> > default:
> > return (EOPNOTSUPP);
> > }
> > @@ -1427,7 +1435,8 @@ sysctl_doproc(int *name, u_int namelen,
> > int arg, buflen, doingzomb, elem_size, elem_count;
> > int error, needed, op;
> > int dothreads = 0;
> > - int show_pointers;
> > + int is_suser, show_pointers, show_otheruids;
> > + uid_t euid;
> >
> > dp = where;
> > buflen = where != NULL ? *sizep : 0;
> > @@ -1444,7 +1453,10 @@ sysctl_doproc(int *name, u_int namelen,
> > dothreads = op & KERN_PROC_SHOW_THREADS;
> > op &= ~KERN_PROC_SHOW_THREADS;
> >
> > - show_pointers = suser(curproc, 0) == 0;
> > + is_suser = suser(curproc, 0) == 0;
> > + show_pointers = is_suser;
> > + show_otheruids = seeotheruids || is_suser;
> > + euid = curproc->p_ucred->cr_uid;
> >
> > if (where != NULL)
> > kproc = malloc(sizeof(*kproc), M_TEMP, M_WAITOK);
> > @@ -1461,6 +1473,9 @@ again:
> > * Skip embryonic processes.
> > */
> > if (pr->ps_flags & PS_EMBRYO)
> > + continue;
> > +
> > + if (!show_otheruids && pr->ps_ucred->cr_uid != euid)
> > continue;
> >
> > /*
> > Index: sys/sys/sysctl.h
> > ===================================================================
> > RCS file: /cvs/src/sys/sys/sysctl.h,v
> > retrieving revision 1.170
> > diff -u -p -u -r1.170 sysctl.h
> > --- sys/sys/sysctl.h 7 Nov 2016 00:26:32 -0000 1.170
> > +++ sys/sys/sysctl.h 4 Dec 2016 20:43:55 -0000
> > @@ -184,7 +184,8 @@ struct ctlname {
> > #define KERN_GLOBAL_PTRACE 81 /* allow ptrace globally */
> > #define KERN_CONSBUFSIZE 82 /* int: console message buffer size */
> > #define KERN_CONSBUF 83 /* console message buffer */
> > -#define KERN_MAXID 84 /* number of valid kern ids */
> > +#define KERN_SEEOTHERUIDS 84 /* see other users' proceesses */
> > +#define KERN_MAXID 85 /* number of valid kern ids */
> >
> > #define CTL_KERN_NAMES { \
> > { 0, 0 }, \
> > @@ -269,6 +270,9 @@ struct ctlname {
> > { "proc_nobroadcastkill", CTLTYPE_NODE }, \
> > { "proc_vmmap", CTLTYPE_NODE }, \
> > { "global_ptrace", CTLTYPE_INT }, \
> > + { "gap", 0 }, \
> > + { "gap", 0 }, \
> > + { "see_other_uids", CTLTYPE_INT }, \
> > }
> >
> > /*
> >
>