Re: [PATCH] fs: relax mount_setattr() permission checks

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue 06-02-24 11:22:09, Christian Brauner wrote:
> When we added mount_setattr() I added additional checks compared to the
> legacy do_reconfigure_mnt() and do_change_type() helpers used by regular
> mount(2). If that mount had a parent then verify that the caller and the
> mount namespace the mount is attached to match and if not make sure that
> it's an anonymous mount.
> 
> The real rootfs falls into neither category. It is neither an anoymous
> mount because it is obviously attached to the initial mount namespace
> but it also obviously doesn't have a parent mount. So that means legacy
> mount(2) allows changing mount properties on the real rootfs but
> mount_setattr(2) blocks this. I never thought much about this but of
> course someone on this planet of earth changes properties on the real
> rootfs as can be seen in [1].
> 
> Since util-linux finally switched to the new mount api in 2.39 not so
> long ago it also relies on mount_setattr() and that surfaced this issue
> when Fedora 39 finally switched to it. Fix this.
> 
> Link: https://bugzilla.redhat.com/show_bug.cgi?id=2256843
> Reported-by: Karel Zak <kzak@xxxxxxxxxx>
> Cc: stable@xxxxxxxxxxxxxxx # v5.12+
> Signed-off-by: Christian Brauner <brauner@xxxxxxxxxx>

I'm not too confident with subtleties of this code but it looks good to me.
So feel free to add:

Reviewed-by: Jan Kara <jack@xxxxxxx>

								Honza

> ---
>  fs/namespace.c | 11 ++++++++---
>  1 file changed, 8 insertions(+), 3 deletions(-)
> 
> diff --git a/fs/namespace.c b/fs/namespace.c
> index 437f60e96d40..fb0286920bce 100644
> --- a/fs/namespace.c
> +++ b/fs/namespace.c
> @@ -4472,10 +4472,15 @@ static int do_mount_setattr(struct path *path, struct mount_kattr *kattr)
>  	/*
>  	 * If this is an attached mount make sure it's located in the callers
>  	 * mount namespace. If it's not don't let the caller interact with it.
> -	 * If this is a detached mount make sure it has an anonymous mount
> -	 * namespace attached to it, i.e. we've created it via OPEN_TREE_CLONE.
> +	 *
> +	 * If this mount doesn't have a parent it's most often simply a
> +	 * detached mount with an anonymous mount namespace. IOW, something
> +	 * that's simply not attached yet. But there are apparently also users
> +	 * that do change mount properties on the rootfs itself. That obviously
> +	 * neither has a parent nor is it a detached mount so we cannot
> +	 * unconditionally check for detached mounts.
>  	 */
> -	if (!(mnt_has_parent(mnt) ? check_mnt(mnt) : is_anon_ns(mnt->mnt_ns)))
> +	if (mnt_has_parent(mnt) && !check_mnt(mnt))
>  		goto out;
>  
>  	/*
> 
> ---
> base-commit: 2a42e144dd0b62eaf79148394ab057145afbc3c5
> change-id: 20240206-vfs-mount-rootfs-70aff2e3956d
> 
-- 
Jan Kara <jack@xxxxxxxx>
SUSE Labs, CR




[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [NTFS 3]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [NTFS 3]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux