mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-31 16:57:10 +00:00
Allow file system owner to modify system flags if securelevel permits.
MFC after: 3 days
This commit is contained in:
parent
68c53ef849
commit
c217b20ef6
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=197861
@ -358,8 +358,11 @@ secpolicy_fs_mount_clearopts(cred_t *cr, struct mount *vfsp)
|
||||
* Check privileges for setting xvattr attributes
|
||||
*/
|
||||
int
|
||||
secpolicy_xvattr(xvattr_t *xvap, uid_t owner, cred_t *cr, vtype_t vtype)
|
||||
secpolicy_xvattr(struct vnode *vp, xvattr_t *xvap, uid_t owner, cred_t *cr,
|
||||
vtype_t vtype)
|
||||
{
|
||||
|
||||
if (secpolicy_fs_owner(vp->v_mount, cr) == 0)
|
||||
return (0);
|
||||
return (priv_check_cred(cr, PRIV_VFS_SYSFLAGS, 0));
|
||||
}
|
||||
|
@ -70,7 +70,8 @@ int secpolicy_setid_setsticky_clear(struct vnode *vp, struct vattr *vap,
|
||||
int secpolicy_fs_owner(struct mount *vfsp, struct ucred *cred);
|
||||
int secpolicy_fs_mount(cred_t *cr, vnode_t *mvp, struct mount *vfsp);
|
||||
void secpolicy_fs_mount_clearopts(cred_t *cr, struct mount *vfsp);
|
||||
int secpolicy_xvattr(xvattr_t *xvap, uid_t owner, cred_t *cr, vtype_t vtype);
|
||||
int secpolicy_xvattr(struct vnode *vp, xvattr_t *xvap, uid_t owner,
|
||||
cred_t *cr, vtype_t vtype);
|
||||
|
||||
#endif /* _KERNEL */
|
||||
|
||||
|
@ -1306,7 +1306,7 @@ zfs_create(vnode_t *dvp, char *name, vattr_t *vap, int excl, int mode,
|
||||
}
|
||||
|
||||
if (vap->va_mask & AT_XVATTR) {
|
||||
if ((error = secpolicy_xvattr((xvattr_t *)vap,
|
||||
if ((error = secpolicy_xvattr(dvp, (xvattr_t *)vap,
|
||||
crgetuid(cr), cr, vap->va_type)) != 0) {
|
||||
ZFS_EXIT(zfsvfs);
|
||||
return (error);
|
||||
@ -1758,7 +1758,7 @@ zfs_mkdir(vnode_t *dvp, char *dirname, vattr_t *vap, vnode_t **vpp, cred_t *cr,
|
||||
zf |= ZCILOOK;
|
||||
|
||||
if (vap->va_mask & AT_XVATTR)
|
||||
if ((error = secpolicy_xvattr((xvattr_t *)vap,
|
||||
if ((error = secpolicy_xvattr(dvp, (xvattr_t *)vap,
|
||||
crgetuid(cr), cr, vap->va_type)) != 0) {
|
||||
ZFS_EXIT(zfsvfs);
|
||||
return (error);
|
||||
@ -4205,12 +4205,6 @@ zfs_freebsd_setattr(ap)
|
||||
fflags = vap->va_flags;
|
||||
if ((fflags & ~(SF_IMMUTABLE|SF_APPEND|SF_NOUNLINK|UF_NODUMP)) != 0)
|
||||
return (EOPNOTSUPP);
|
||||
/*
|
||||
* Callers may only modify the file flags on objects they
|
||||
* have VADMIN rights for.
|
||||
*/
|
||||
if ((error = VOP_ACCESS(vp, VADMIN, cred, curthread)) != 0)
|
||||
return (error);
|
||||
/*
|
||||
* Unprivileged processes are not permitted to unset system
|
||||
* flags, or modify flags if any system flags are set.
|
||||
@ -4221,14 +4215,21 @@ zfs_freebsd_setattr(ap)
|
||||
* is non-zero; otherwise, they behave like unprivileged
|
||||
* processes.
|
||||
*/
|
||||
if (priv_check_cred(cred, PRIV_VFS_SYSFLAGS, 0) == 0) {
|
||||
if (secpolicy_fs_owner(vp->v_mount, cred) == 0 ||
|
||||
priv_check_cred(cred, PRIV_VFS_SYSFLAGS, 0) == 0) {
|
||||
if (zflags &
|
||||
(ZFS_IMMUTABLE | ZFS_APPENDONLY | ZFS_NOUNLINK)) {
|
||||
error = securelevel_gt(cred, 0);
|
||||
if (error)
|
||||
if (error != 0)
|
||||
return (error);
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* Callers may only modify the file flags on objects they
|
||||
* have VADMIN rights for.
|
||||
*/
|
||||
if ((error = VOP_ACCESS(vp, VADMIN, cred, curthread)) != 0)
|
||||
return (error);
|
||||
if (zflags &
|
||||
(ZFS_IMMUTABLE | ZFS_APPENDONLY | ZFS_NOUNLINK)) {
|
||||
return (EPERM);
|
||||
|
Loading…
Reference in New Issue
Block a user