Subject: Re: mount(2) on kauth(9)
To: YAMAMOTO Takashi <yamt@mwd.biglobe.ne.jp>
From: Elad Efrat <elad@NetBSD.org>
List: tech-kern
Date: 12/30/2006 23:34:08
YAMAMOTO Takashi wrote:

>> yeah. we'll have to keep the kauth_cred_t of the mounter in struct
>> mount (note: this will have to be a copy, not a reference), then we
>> could use these credentials in requests to whether respect or not
>> suid bit, devices, etc.
>>
>> I think it's ugly. :)
>>
>> -e.
> 
> what's the benefit to defer the decision, rather than having
> additional two kauth calls in mount-time?
> 
> YAMAMOTO Takashi

for my reply, I'll assume you mean something like this:

	/* check if can mount */
	error = kauth_authorize_system(...);
	if (error)
		return;

	/* check if can keep priv'd flags */
	if (!(flags & (MOUNT_NOFOO|MOUNT_NOBAR))) {
		error = kauth_authorize_system(...);
		if (error) {
			flags |= (MOUNT_NOFOO|MOUNT_NOBAR);
			/* for update, keep MNT_NOEXEC... */
		}
	}

the biggest problem I see with it is that we issue two kauth
calls, where there's only one request. this second call is really
introduced because of a design flaw in the 4.4bsd secmodel: if the
original code did something like:

	if (dovfsusermount && uid != 0 && (flags & MOUNT_PRIV_FLAGS))
		return (EPERM);

then we would not have a problem. but the current design dictated
the second call ("can keep these flags") -- which is, I believe, not
something we should do. (and I'm not yet sure we want to piggyback it
for the MNT_NOEXEC part)

by passing the flags as a pointer, we give a change to the bsd44
secmodel to change them silently, but other secmodels will use it
(hopefully) normally. I think that although kind-of unpleasant, this
is the best we can do. :/

-e.