svn commit: r261266 - in head: sys/dev/drm sys/kern sys/sys usr.sbin/jail

Robert Watson rwatson at FreeBSD.org
Fri Jan 31 12:28:57 UTC 2014


Hi Jamie:

As these privileges basically allows root processes in jail to break out of 
jail, I think this needs a much more clear signpost that this is a very unsafe 
thing to turn on.  I can imagine scenarios where this might be useful, but 
can't really imagine any where it is 'safe' with respect to the jail model.

Can we put a very large and very clear warning in the jail(8) man page, as 
well as a comment in the kernel source code about this?

Robert

On Wed, 29 Jan 2014, Jamie Gritton wrote:

> Author: jamie
> Date: Wed Jan 29 13:41:13 2014
> New Revision: 261266
> URL: http://svnweb.freebsd.org/changeset/base/261266
>
> Log:
>  Add a jail parameter, allow.kmem, which lets jailed processes access
>  /dev/kmem and related devices (i.e. grants PRIV_IO and PRIV_KMEM_WRITE).
>  This in conjunction with changing the drm driver's permission check from
>  PRIV_DRIVER to PRIV_KMEM_WRITE will allow a jailed Xorg server.
>
>  Submitted by:	netchild
>  MFC after:	1 week
>
> Modified:
>  head/sys/dev/drm/drmP.h
>  head/sys/kern/kern_jail.c
>  head/sys/sys/jail.h
>  head/usr.sbin/jail/jail.8
>
> Modified: head/sys/dev/drm/drmP.h
> ==============================================================================
> --- head/sys/dev/drm/drmP.h	Wed Jan 29 13:35:12 2014	(r261265)
> +++ head/sys/dev/drm/drmP.h	Wed Jan 29 13:41:13 2014	(r261266)
> @@ -227,7 +227,9 @@ enum {
>
> #define PAGE_ALIGN(addr) round_page(addr)
> /* DRM_SUSER returns true if the user is superuser */
> -#if __FreeBSD_version >= 700000
> +#if __FreeBSD_version >= 1000000
> +#define DRM_SUSER(p)		(priv_check(p, PRIV_KMEM_WRITE) == 0)
> +#elif __FreeBSD_version >= 700000
> #define DRM_SUSER(p)		(priv_check(p, PRIV_DRIVER) == 0)
> #else
> #define DRM_SUSER(p)		(suser(p) == 0)
>
> Modified: head/sys/kern/kern_jail.c
> ==============================================================================
> --- head/sys/kern/kern_jail.c	Wed Jan 29 13:35:12 2014	(r261265)
> +++ head/sys/kern/kern_jail.c	Wed Jan 29 13:41:13 2014	(r261266)
> @@ -208,6 +208,7 @@ static char *pr_allow_names[] = {
> 	"allow.mount.zfs",
> 	"allow.mount.procfs",
> 	"allow.mount.tmpfs",
> +	"allow.kmem",
> };
> const size_t pr_allow_names_size = sizeof(pr_allow_names);
>
> @@ -224,6 +225,7 @@ static char *pr_allow_nonames[] = {
> 	"allow.mount.nozfs",
> 	"allow.mount.noprocfs",
> 	"allow.mount.notmpfs",
> +	"allow.nokmem",
> };
> const size_t pr_allow_nonames_size = sizeof(pr_allow_nonames);
>
> @@ -3951,6 +3953,27 @@ prison_priv_check(struct ucred *cred, in
> 		return (0);
>
> 		/*
> +		 * Allow access to /dev/io in a jail if the non-jailed admin
> +		 * requests this and if /dev/io exists in the jail. This
> +		 * allows Xorg to probe a card.
> +		 */
> +	case PRIV_IO:
> +		if (cred->cr_prison->pr_allow & PR_ALLOW_KMEM)
> +			return (0);
> +		else
> +			return (EPERM);
> +
> +		/*
> +		 * Allow low level access to KMEM-like devices (e.g. to
> +		 * allow Xorg to use DRI).
> +		 */
> +	case PRIV_KMEM_WRITE:
> +		if (cred->cr_prison->pr_allow & PR_ALLOW_KMEM)
> +			return (0);
> +		else
> +			return (EPERM);
> +
> +		/*
> 		 * Allow jailed root to set loginclass.
> 		 */
> 	case PRIV_PROC_SETLOGINCLASS:
> @@ -4384,6 +4407,8 @@ SYSCTL_JAIL_PARAM(_allow, quotas, CTLTYP
>     "B", "Jail may set file quotas");
> SYSCTL_JAIL_PARAM(_allow, socket_af, CTLTYPE_INT | CTLFLAG_RW,
>     "B", "Jail may create sockets other than just UNIX/IPv4/IPv6/route");
> +SYSCTL_JAIL_PARAM(_allow, kmem, CTLTYPE_INT | CTLFLAG_RW,
> +    "B", "Jail may access kmem-like devices (io, dri) if they exist");
>
> SYSCTL_JAIL_PARAM_SUBNODE(allow, mount, "Jail mount/unmount permission flags");
> SYSCTL_JAIL_PARAM(_allow_mount, , CTLTYPE_INT | CTLFLAG_RW,
>
> Modified: head/sys/sys/jail.h
> ==============================================================================
> --- head/sys/sys/jail.h	Wed Jan 29 13:35:12 2014	(r261265)
> +++ head/sys/sys/jail.h	Wed Jan 29 13:41:13 2014	(r261266)
> @@ -228,7 +228,8 @@ struct prison_racct {
> #define	PR_ALLOW_MOUNT_ZFS		0x0200
> #define	PR_ALLOW_MOUNT_PROCFS		0x0400
> #define	PR_ALLOW_MOUNT_TMPFS		0x0800
> -#define	PR_ALLOW_ALL			0x0fff
> +#define	PR_ALLOW_KMEM			0x1000
> +#define	PR_ALLOW_ALL			0x1fff
>
> /*
>  * OSD methods
>
> Modified: head/usr.sbin/jail/jail.8
> ==============================================================================
> --- head/usr.sbin/jail/jail.8	Wed Jan 29 13:35:12 2014	(r261265)
> +++ head/usr.sbin/jail/jail.8	Wed Jan 29 13:41:13 2014	(r261266)
> @@ -573,6 +573,17 @@ with non-jailed parts of the system.
> Sockets within a jail are normally restricted to IPv4, IPv6, local
> (UNIX), and route.  This allows access to other protocol stacks that
> have not had jail functionality added to them.
> +.It Va allow.kmem
> +Jailed processes may access
> +.Pa /dev/kmem
> +and similar devices (e.g. io, dri) if they have sufficient permission
> +(via the usual file permissions).
> +Note that the device files must exist within the jail for this parameter
> +to be of any use;
> +the default devfs ruleset for jails does not include any such devices.
> +Giving a jail access to kernel memory obviates much of the security that
> +jails offer, but can still be useful for other purposes.
> +For example, this would allow the Xorg server to run inside a jail.
> .El
> .El
> .Pp
>


More information about the svn-src-all mailing list