[PATCH 1/1] overlayfs, xattr: allow unprivileged users to whiteout

Stefan Bader stefan.bader at canonical.com
Mon Feb 17 10:19:38 UTC 2014


On 13.02.2014 22:44, Serge Hallyn wrote:
> To mark a file which exists in the lower layer as deleted,
> it creates a symbolic link to a file called "(overlay-whiteout)"
> in the writeable mount, and sets a "trusted.overlay" xattr
> on that link.
> 

> 1. When the create the symbolic link as container root, not
> as the global root

Have my problems parsing this. Guess it says: "When the symbolic link is
created, it is done as container root, not as the global root."

> 
> 2. Allow root in a container to edit "trusted.overlay*"
> xattrs.  Generally only global root is allowed to edit
> "trusted.*"
> 
> With this patch, I'm able to delete files and directories in a
> user-namespace-based overlayfs-backed container.  The overlay
> writeable layer after "rm ab/ab; rmdir ab; mv xxx yyy;" ends up
> looking like:
> 
> ls -l .local/share/lxc/u11/delta0/home/ubuntu/
> total 0
> lrwxrwxrwx 1 150000 150000 18 Feb 13 22:30 ab -> (overlay-whiteout)
> lrwxrwxrwx 1 150000 150000 18 Feb 13 22:30 xxx -> (overlay-whiteout)
> -rw-rw-r-- 1 151000 151000  0 Feb 13 03:53 yyy
> 

Hm, am I missing something here? I see access rights changed, but would the
whiteout link creation not also be in overlayfs code ... somewhere?

-Stefan

> (with 150000 being the mapped container root)
> 
> (note - the fs/xattr.c hunk could presumably be dropped if we
> switched to using "user.overlay".  This could however cause
> problems with pre-existing overlay deltas.)
> 
> Signed-off-by: Serge Hallyn <serge.hallyn at ubuntu.com>
> ---
>  fs/overlayfs/dir.c | 9 +++++++--
>  fs/xattr.c         | 5 ++++-
>  2 files changed, 11 insertions(+), 3 deletions(-)
> 
> diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c
> index a209409..3c4657b 100644
> --- a/fs/overlayfs/dir.c
> +++ b/fs/overlayfs/dir.c
> @@ -12,6 +12,7 @@
>  #include <linux/xattr.h>
>  #include <linux/security.h>
>  #include <linux/cred.h>
> +#include <linux/sched.h>
>  #include "overlayfs.h"
>  
>  static const char *ovl_whiteout_symlink = "(overlay-whiteout)";
> @@ -38,8 +39,12 @@ static int ovl_whiteout(struct dentry *upperdir, struct dentry *dentry)
>  	cap_raise(override_cred->cap_effective, CAP_SYS_ADMIN);
>  	cap_raise(override_cred->cap_effective, CAP_DAC_OVERRIDE);
>  	cap_raise(override_cred->cap_effective, CAP_FOWNER);
> -	override_cred->fsuid = GLOBAL_ROOT_UID;
> -	override_cred->fsgid = GLOBAL_ROOT_GID;
> +	override_cred->fsuid = make_kuid(current_user_ns(), 0);
> +	if (!uid_valid(override_cred->fsuid))
> +		override_cred->fsuid = GLOBAL_ROOT_UID;
> +	override_cred->fsgid = make_kgid(current_user_ns(), 0);
> +	if (!gid_valid(override_cred->fsgid))
> +		override_cred->fsgid = GLOBAL_ROOT_GID;
>  	old_cred = override_creds(override_cred);
>  
>  	newdentry = lookup_one_len(dentry->d_name.name, upperdir,
> diff --git a/fs/xattr.c b/fs/xattr.c
> index 3377dff..edd826c 100644
> --- a/fs/xattr.c
> +++ b/fs/xattr.c
> @@ -52,7 +52,10 @@ xattr_permission(struct inode *inode, const char *name, int mask)
>  	 * The trusted.* namespace can only be accessed by privileged users.
>  	 */
>  	if (!strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN)) {
> -		if (!capable(CAP_SYS_ADMIN))
> +		if (strncmp(name, "trusted.overlay", 15) == 0) {
> +			if (!inode_capable(inode, CAP_SYS_ADMIN))
> +				return (mask & MAY_WRITE) ? -EPERM : -ENODATA;
> +		} else if (!capable(CAP_SYS_ADMIN))
>  			return (mask & MAY_WRITE) ? -EPERM : -ENODATA;
>  		return 0;
>  	}
> 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 901 bytes
Desc: OpenPGP digital signature
URL: <https://lists.ubuntu.com/archives/kernel-team/attachments/20140217/741faeb0/attachment.sig>


More information about the kernel-team mailing list