提交 acc57dde 编写于 作者: M Miklos Szeredi 提交者: Yu Changchun

ovl: verify permissions in ovl_path_open()

mainline inclusion
from mainline-v5.8-rc1
commit 56230d956739b9cb1cbde439d76227d77979a04d
category: bugfix
bugzilla: NA
CVE: CVE-2020-16120

--------------------------------

Check permission before opening a real file.

ovl_path_open() is used by readdir and copy-up routines.

ovl_permission() theoretically already checked copy up permissions, but it
doesn't hurt to re-do these checks during the actual copy-up.

For directory reading ovl_permission() only checks access to topmost
underlying layer.  Readdir on a merged directory accesses layers below the
topmost one as well.  Permission wasn't checked for these layers.

Note: modifying ovl_permission() to perform this check would be far more
complex and hence more bug prone.  The result is less precise permissions
returned in access(2).  If this turns out to be an issue, we can revisit
this bug.
Signed-off-by: NMiklos Szeredi <mszeredi@redhat.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
Reviewed-by: Nzhangyi (F) <yi.zhang@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
Signed-off-by: NYu Changchun <yuchangchun1@huawei.com>
上级 020ab6e0
...@@ -479,7 +479,32 @@ bool ovl_is_whiteout(struct dentry *dentry) ...@@ -479,7 +479,32 @@ bool ovl_is_whiteout(struct dentry *dentry)
struct file *ovl_path_open(struct path *path, int flags) struct file *ovl_path_open(struct path *path, int flags)
{ {
return dentry_open(path, flags | O_NOATIME, current_cred()); struct inode *inode = d_inode(path->dentry);
int err, acc_mode;
if (flags & ~(O_ACCMODE | O_LARGEFILE))
BUG();
switch (flags & O_ACCMODE) {
case O_RDONLY:
acc_mode = MAY_READ;
break;
case O_WRONLY:
acc_mode = MAY_WRITE;
break;
default:
BUG();
}
err = inode_permission(inode, acc_mode | MAY_OPEN);
if (err)
return ERR_PTR(err);
/* O_NOATIME is an optimization, don't fail if not permitted */
if (inode_owner_or_capable(inode))
flags |= O_NOATIME;
return dentry_open(path, flags, current_cred());
} }
/* Caller should hold ovl_inode->lock */ /* Caller should hold ovl_inode->lock */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册