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 }, \
> }
>
> /*
>