Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 31 Oct 2006 15:40:50 +0100
From:      Pawel Jakub Dawidek <pjd@FreeBSD.org>
To:        Robert Watson <rwatson@FreeBSD.org>
Cc:        arch@FreeBSD.org
Subject:   Re: New in-kernel privilege API: priv(9)
Message-ID:  <20061031144050.GC13359@garage.freebsd.pl>
In-Reply-To: <20061031092122.D96078@fledge.watson.org>
References:  <20061031092122.D96078@fledge.watson.org>

next in thread | previous in thread | raw e-mail | index | archive | help

--Km1U/tdNT/EmXiR1
Content-Type: text/plain; charset=iso-8859-2
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Tue, Oct 31, 2006 at 09:43:45AM +0000, Robert Watson wrote:
> Among other things, I'd like to be able to add some additional names to t=
he "Reviewed by:" list. :-)  This is, of course, a set of highly sensitive =
security-related=20
> changes, and having detailed reviews is very important.
[...]

Here are few nits I found:

> Index: sys/fs/hpfs/hpfs_vnops.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /zoo/cvsup/FreeBSD-CVS/src/sys/fs/hpfs/hpfs_vnops.c,v
> retrieving revision 1.68
> diff -u -r1.68 hpfs_vnops.c
> --- sys/fs/hpfs/hpfs_vnops.c	17 Jan 2006 17:29:01 -0000	1.68
> +++ sys/fs/hpfs/hpfs_vnops.c	30 Oct 2006 17:07:55 -0000
> @@ -501,11 +501,12 @@
>  	if (vap->va_atime.tv_sec !=3D VNOVAL || vap->va_mtime.tv_sec !=3D VNOVA=
L) {
>  		if (vp->v_mount->mnt_flag & MNT_RDONLY)
>  			return (EROFS);
> -		if (cred->cr_uid !=3D hp->h_uid &&
> -		    (error =3D suser_cred(cred, SUSER_ALLOWJAIL)) &&
> -		    ((vap->va_vaflags & VA_UTIMES_NULL) =3D=3D 0 ||
> -		    (error =3D VOP_ACCESS(vp, VWRITE, cred, td))))
> -			return (error);
> +		if (vap->va_vaflags & VA_UTIMES_NULL) {
> +			error =3D VOP_ACCESS(vp, VADMIN, cred, td);
> +			if (error)
> +				error =3D VOP_ACCESS(vp, VWRITE, cred, td);
> +		} else
> +			error =3D VOP_ACCESS(vp, VADMIN, cred, td);

Eliminating privilege check here was intentional? Doesn't it change
functionality? I found the same check in few other places, so it's
probably intentional, but worth checking still.

> --- sys/fs/msdosfs/msdosfs_vfsops.c	26 Sep 2006 04:12:45 -0000	1.153
> +++ sys/fs/msdosfs/msdosfs_vfsops.c	30 Oct 2006 17:07:55 -0000
[...]
> @@ -293,17 +294,17 @@
>  			 * If upgrade to read-write by non-root, then verify
>  			 * that user has necessary permissions on the device.
>  			 */
> -			if (suser(td)) {
> -				devvp =3D pmp->pm_devvp;
> -				vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td);
> -				error =3D VOP_ACCESS(devvp, VREAD | VWRITE,
> -						   td->td_ucred, td);
> -				if (error) {
> -					VOP_UNLOCK(devvp, 0, td);
> -					return (error);
> -				}
> +			devvp =3D pmp->pm_devvp;
> +			vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td);
> +			error =3D VOP_ACCESS(devvp, VREAD | VWRITE,
> +			   td->td_ucred, td);
> +			if (error)
> +				error =3D priv_check(td, PRIV_VFS_MOUNT_PERM);
> +			if (error) {
>  				VOP_UNLOCK(devvp, 0, td);
> +				return (error);
>  			}
> +			VOP_UNLOCK(devvp, 0, td);

This doesn't seem right to me. If VOP_ACCESS() returns an error if call
priv_check(), I think you wanted to call it when it return success, no?

I'd change it to:

			devvp =3D pmp->pm_devvp;
			vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td);
			error =3D VOP_ACCESS(devvp, VREAD | VWRITE,
			   td->td_ucred, td);
			VOP_UNLOCK(devvp, 0, td);
			if (!error)
				error =3D priv_check(td, PRIV_VFS_MOUNT_PERM);
			if (error)
				return (error);

> @@ -353,15 +354,15 @@
>  	 * If mount by non-root, then verify that user has necessary
>  	 * permissions on the device.
>  	 */
> -	if (suser(td)) {
> -		accessmode =3D VREAD;
> -		if ((mp->mnt_flag & MNT_RDONLY) =3D=3D 0)
> -			accessmode |=3D VWRITE;
> -		error =3D VOP_ACCESS(devvp, accessmode, td->td_ucred, td);
> -		if (error) {
> -			vput(devvp);
> -			return (error);
> -		}
> +	accessmode =3D VREAD;
> +	if ((mp->mnt_flag & MNT_RDONLY) =3D=3D 0)
> +		accessmode |=3D VWRITE;
> +	error =3D VOP_ACCESS(devvp, accessmode, td->td_ucred, td);
> +	if (error)
> +		error =3D priv_check(td, PRIV_VFS_MOUNT_PERM);
> +	if (error) {
> +		vput(devvp);
> +		return (error);

Same here.

> --- sys/fs/umapfs/umap_vfsops.c	26 Sep 2006 04:12:46 -0000	1.65
> +++ sys/fs/umapfs/umap_vfsops.c	30 Oct 2006 17:07:55 -0000
> @@ -88,8 +88,9 @@
>  	/*
>  	 * Only for root
>  	 */
> -	if ((error =3D suser(td)) !=3D 0)
> -		return (error);
> +	error =3D priv_check(td, PRIV_VFS_MOUNT);
> +	if (error)
> +		return (ERROR);

s/ERROR/error/

> --- sys/gnu/fs/ext2fs/ext2_vfsops.c	26 Sep 2006 04:12:47 -0000	1.158
> +++ sys/gnu/fs/ext2fs/ext2_vfsops.c	30 Oct 2006 17:07:55 -0000
[...]
> @@ -197,15 +198,16 @@
>  			 * If upgrade to read-write by non-root, then verify
>  			 * that user has necessary permissions on the device.
>  			 */
> -			if (suser(td)) {
> -				vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td);
> -				if ((error =3D VOP_ACCESS(devvp, VREAD | VWRITE,
> -				    td->td_ucred, td)) !=3D 0) {
> -					VOP_UNLOCK(devvp, 0, td);
> -					return (error);
> -				}
> +			vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td);
> +			error =3D VOP_ACCESS(devvp, VREAD | VWRITE,
> +			    td->td_ucred, td);
> +			if (error)
> +				error =3D priv_check(td, PRIV_VFS_MOUNT_PERM);

Another s/if (error)/if (!error)/

> @@ -259,15 +261,18 @@
>  	/*
>  	 * If mount by non-root, then verify that user has necessary
>  	 * permissions on the device.
> +	 *
> +	 * XXXRW: VOP_ACCESS() enough?
>  	 */
> -	if (suser(td)) {
> -		accessmode =3D VREAD;
> -		if ((mp->mnt_flag & MNT_RDONLY) =3D=3D 0)
> -			accessmode |=3D VWRITE;
> -		if ((error =3D VOP_ACCESS(devvp, accessmode, td->td_ucred, td)) !=3D 0=
) {
> -			vput(devvp);
> -			return (error);
> -		}
> +	accessmode =3D VREAD;
> +	if ((mp->mnt_flag & MNT_RDONLY) =3D=3D 0)
> +		accessmode |=3D VWRITE;
> +	error =3D VOP_ACCESS(devvp, accessmode, td->td_ucred, td);
> +	if (error)
> +		error =3D priv_check(td, PRIV_VFS_MOUNT_PERM);

And again.

> --- sys/gnu/fs/reiserfs/reiserfs_vfsops.c	26 Sep 2006 04:12:47 -0000	1.6
> +++ sys/gnu/fs/reiserfs/reiserfs_vfsops.c	30 Oct 2006 17:07:55 -0000
> @@ -125,15 +125,15 @@
>=20
>  	/* If mount by non-root, then verify that user has necessary
>  	 * permissions on the device. */
> -	if (suser(td)) {
> -		accessmode =3D VREAD;
> -		if ((mp->mnt_flag & MNT_RDONLY) =3D=3D 0)
> -			accessmode |=3D VWRITE;
> -		if ((error =3D VOP_ACCESS(devvp,
> -		    accessmode, td->td_ucred, td)) !=3D 0) {
> -			vput(devvp);
> -			return (error);
> -		}
> +	accessmode =3D VREAD;
> +	if ((mp->mnt_flag & MNT_RDONLY) =3D=3D 0)
> +		accessmode |=3D VWRITE;
> +	error =3D VOP_ACCESS(devvp, accessmode, td->td_ucred, td);
> +	if (error)
> +		error =3D priv_check(td, PRIV_VFS_MOUNT_PERM);

One more.

> --- sys/gnu/fs/xfs/FreeBSD/xfs_super.c	10 Jun 2006 19:02:13 -0000	1.4
> +++ sys/gnu/fs/xfs/FreeBSD/xfs_super.c	30 Oct 2006 17:07:55 -0000
[...]
> @@ -149,14 +151,15 @@
>  	vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td);
>=20
>  	ronly =3D ((XFS_MTOVFS(mp)->vfs_flag & VFS_RDONLY) !=3D 0);
> -	if (suser(td)) {
> -		accessmode =3D VREAD;
> -		if (!ronly)
> -			accessmode |=3D VWRITE;
> -		if ((error =3D VOP_ACCESS(devvp, accessmode, td->td_ucred, td))!=3D 0){
> -			vput(devvp);
> -			return (error);
> -		}
> +	accessmode =3D VREAD;
> +	if (!ronly)
> +		accessmode |=3D VWRITE;
> +	error =3D VOP_ACCESS(devvp, accessmode, td->td_ucred, td);
> +	if (error)
> +		error =3D priv_check(td, PRIV_VFS_MOUNT_PERM);

Another one.

> --- sys/kern/kern_jail.c	22 Oct 2006 11:52:13 -0000	1.53
> +++ sys/kern/kern_jail.c	30 Oct 2006 17:07:55 -0000
[...]
> @@ -523,6 +524,172 @@
>  	}
>  }
>=20
> +/*
> + * Check with permission for a specific privilege is granted within jail=
=2E  We
> + * have a specific list of accepted privileges; the rest are denied.
> + */
> +int
> +prison_priv_check(struct ucred *cred, int priv)
> +{
> +
> +	if (!(jailed(cred)))
> +		return (0);

Style: if (!jailed(cred))

> --- sys/netatm/atm_usrreq.c	21 Jul 2006 17:11:13 -0000	1.27
> +++ sys/netatm/atm_usrreq.c	30 Oct 2006 17:07:55 -0000
> -		if (td && (suser(td) !=3D 0))
> -			ATM_RETERR(EPERM);
> +		if (td !=3D 0) {

Style: s/0/NULL/

> --- sys/netinet6/udp6_usrreq.c	7 Sep 2006 18:44:54 -0000	1.68
> +++ sys/netinet6/udp6_usrreq.c	30 Oct 2006 17:07:56 -0000
[...]
> @@ -434,7 +435,8 @@
>  	struct inpcb *inp;
>  	int error;
>=20
> -	error =3D suser(req->td);
> +	error =3D priv_check_cred(req->td->td_ucred, PRIV_NETINET_GETCRED,
> +	    SUSER_ALLOWJAIL);

Change from not allowing jailed root to allowing jailed root was
intentional?

> --- sys/ufs/ffs/ffs_vfsops.c	22 Oct 2006 11:52:19 -0000	1.321
> +++ sys/ufs/ffs/ffs_vfsops.c	30 Oct 2006 17:07:56 -0000
[...]
> @@ -257,15 +258,16 @@
>  			 * If upgrade to read-write by non-root, then verify
>  			 * that user has necessary permissions on the device.
>  			 */
> -			if (suser(td)) {
> -				vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td);
> -				if ((error =3D VOP_ACCESS(devvp, VREAD | VWRITE,
> -				    td->td_ucred, td)) !=3D 0) {
> -					VOP_UNLOCK(devvp, 0, td);
> -					return (error);
> -				}
> +			vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td);
> +			error =3D VOP_ACCESS(devvp, VREAD | VWRITE,
> +			    td->td_ucred, td);
> +			if (error)
> +				error =3D priv_check(td, PRIV_VFS_MOUNT_PERM);

s/if (error)/if (!error)/

> @@ -364,14 +366,15 @@
>  	 * If mount by non-root, then verify that user has necessary
>  	 * permissions on the device.
>  	 */
> -	if (suser(td)) {
> -		accessmode =3D VREAD;
> -		if ((mp->mnt_flag & MNT_RDONLY) =3D=3D 0)
> -			accessmode |=3D VWRITE;
> -		if ((error =3D VOP_ACCESS(devvp, accessmode, td->td_ucred, td))!=3D 0){
> -			vput(devvp);
> -			return (error);
> -		}
> +	accessmode =3D VREAD;
> +	if ((mp->mnt_flag & MNT_RDONLY) =3D=3D 0)
> +		accessmode |=3D VWRITE;
> +	error =3D VOP_ACCESS(devvp, accessmode, td->td_ucred, td);
> +	if (error)
> +		error =3D priv_check(td, PRIV_VFS_MOUNT_PERM);

s/if (error)/if (!error)/

--=20
Pawel Jakub Dawidek                       http://www.wheel.pl
pjd@FreeBSD.org                           http://www.FreeBSD.org
FreeBSD committer                         Am I Evil? Yes, I Am!

--Km1U/tdNT/EmXiR1
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.4 (FreeBSD)

iD8DBQFFR2ByForvXbEpPzQRAvBrAJ9u+xKNpzsGRMrg85XSsT8wP+v0CgCgtPRk
h3KCt3DFXZfzw2awaUx1B/Y=
=sXNL
-----END PGP SIGNATURE-----

--Km1U/tdNT/EmXiR1--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20061031144050.GC13359>