Date: Sat, 19 Dec 1998 14:21:14 -0800 From: Mike Smith <mike@smith.net.au> To: Don Lewis <Don.Lewis@tsc.tdk.com> Cc: current@FreeBSD.ORG Subject: Re: adding policy tuning knobs to my F_SETOWN/SIGIO/SIGURG enhancements Message-ID: <199812192221.OAA00695@dingo.cdrom.com> In-Reply-To: Your message of "Sat, 19 Dec 1998 00:56:19 PST." <199812190856.AAA11948@salsa.gv.tsc.tdk.com>
next in thread | previous in thread | raw e-mail | index | archive | help
I'm not sure that we want to open something like this to general
manipulation - it provides one more way for someone to make assumptions
about the behaviour of the system. If the "secure" mode isn't
ridiculously onerous, I think that it's perhaps better to leave that
the only mode that's supported, ie. if someone wants to change its
behaviour they need to be aware of the consequences.
> I'm still looking for comments on this. Eivind was the only one who
> spoke up when I posted it to -hackers. He was in favor of leaving
> the policy compiled in.
>
> I'd like to commit this or something like it in the next couple of days.
>
> The questions still stand.
>
>
> ===== Forwarded from -hackers ==============
>
> My previous security enhancements to the F_SETOWN/SIGIO/SIGURG in the 3.0
> kernel code made some policy decisions that were hard-wired into the code
> but were commented in case someone needed to change them. I've decided
> that would be good to allow the security policy to be tuned using some
> sysctl knobs. The attached patch adds two policy adjustments,
> kern.security.setown_restrict, and kern.security.async_io_cred_check,
> which can be used to limit the process or process group that can be
> specified to F_SETOWN, and whether credentials should be checked before
> delivering the signals.
>
> Questions:
>
> Should these variables live under kern.security, directly under
> kern, or elsewhere?
>
> I also want to add some other security related tunables in other
> parts of the kernel. Assuming they should also live under
> kern.security, where should
> "SYSCTL_NODE(_kern, OID_AUTO, security, ...)" live? I've already
> got kern.security sysctl variables in two different files ...
>
> Any other comments on this patch are welcome.
>
>
> --- kern_descrip.c.orig Wed Nov 11 03:08:32 1998
> +++ kern_descrip.c Sat Dec 12 23:39:50 1998
> @@ -392,7 +392,24 @@
> *
> * After permission checking, add a sigio structure to the sigio list for
> * the process or process group.
> + *
> + * The setown_restrict variable sets a policy which may restrict the allowable
> + * process/group argument for F_SETOWN/FIOSETOWN. An argument of 0 is
> + * always allowed.
> + * 0 - There are no restrictions, any existing process or process group
> + * may be specified.
> + * 1 - Any process or process group specified must belong to the same
> + * session as the current process.
> + * 2 - Only the current process group or a process in the current process
> + * group may be specified. This is the default.
> + * 3 - Only the current process may be specified.
> + *
> */
> +static int setown_restrict = 2;
> +SYSCTL_NODE(_kern, OID_AUTO, security, CTLFLAG_RW, 0, "");
> +SYSCTL_INT(_kern_security, OID_AUTO, setown_restrict,
> + CTLFLAG_RW|CTLFLAG_SECURE, &setown_restrict, 0, "");
> +
> int
> fsetown(pgid, sigiop)
> pid_t pgid;
> @@ -411,30 +428,20 @@
> proc = pfind(pgid);
> if (proc == NULL)
> return (ESRCH);
> - /*
> - * Policy - Don't allow a process to FSETOWN a process
> - * in another session.
> - *
> - * Remove this test to allow maximum flexibility or
> - * restrict FSETOWN to the current process or process
> - * group for maximum safety.
> - */
> - else if (proc->p_session != curproc->p_session)
> + if (setown_restrict > 2 && proc != curproc ||
> + setown_restrict > 1 && proc->p_pgrp != curproc->p_pgrp ||
> + setown_restrict > 0 &&
> + proc->p_session != curproc->p_session)
> return (EPERM);
> pgrp = NULL;
> } else /* if (pgid < 0) */ {
> pgrp = pgfind(-pgid);
> if (pgrp == NULL)
> return (ESRCH);
> - /*
> - * Policy - Don't allow a process to FSETOWN a process
> - * in another session.
> - *
> - * Remove this test to allow maximum flexibility or
> - * restrict FSETOWN to the current process or process
> - * group for maximum safety.
> - */
> - else if (pgrp->pg_session != curproc->p_session)
> + if (setown_restrict > 2 ||
> + setown_restrict > 1 && pgrp != curproc->p_pgrp ||
> + setown_restrict > 0 &&
> + pgrp->pg_session != curproc->p_session)
> return (EPERM);
> proc = NULL;
> }
> --- kern_sig.c.orig Tue Dec 8 20:40:50 1998
> +++ kern_sig.c Sun Dec 13 00:10:50 1998
> @@ -1358,9 +1358,16 @@
> }
>
> /*
> - * Send a signal to a SIGIO or SIGURG to a process or process group using
> - * stored credentials rather than those of the current process.
> + * Send a SIGIO or SIGURG signal to a process or process group in
> + * response to an I/O event.
> + *
> + * If async_io_cred_check is nonzero, the stored credentials from
> + * the process that did the F_SETOWN/FIOSETOWN are first checked
> + * to see if it is permissible to send the signal.
> */
> +static int async_io_cred_check = 1;
> +SYSCTL_INT(_kern_security, OID_AUTO, async_io_cred_check,
> + CTLFLAG_RW|CTLFLAG_SECURE, &async_io_cred_check, 0, "");
> void
> pgsigio(sigio, signum, checkctty)
> struct sigio *sigio;
> @@ -1370,15 +1377,17 @@
> return;
>
> if (sigio->sio_pgid > 0) {
> - if (CANSIGIO(sigio->sio_ruid, sigio->sio_ucred,
> - sigio->sio_proc))
> + if (!async_io_cred_check ||
> + CANSIGIO(sigio->sio_ruid, sigio->sio_ucred,
> + sigio->sio_proc))
> psignal(sigio->sio_proc, signum);
> } else if (sigio->sio_pgid < 0) {
> struct proc *p;
>
> for (p = sigio->sio_pgrp->pg_members.lh_first; p != NULL;
> p = p->p_pglist.le_next)
> - if (CANSIGIO(sigio->sio_ruid, sigio->sio_ucred, p) &&
> + if ((!async_io_cred_check ||
> + CANSIGIO(sigio->sio_ruid, sigio->sio_ucred, p)) &&
> (checkctty == 0 || (p->p_flag & P_CONTROLT)))
> psignal(p, signum);
> }
>
> ===========================================
>
> To Unsubscribe: send mail to majordomo@FreeBSD.org
> with "unsubscribe freebsd-current" in the body of the message
>
--
\\ Sometimes you're ahead, \\ Mike Smith
\\ sometimes you're behind. \\ mike@smith.net.au
\\ The race is long, and in the \\ msmith@freebsd.org
\\ end it's only with yourself. \\ msmith@cdrom.com
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199812192221.OAA00695>
