diff options
author | Miklos Szeredi <mszeredi@redhat.com> | 2017-05-29 15:15:27 +0200 |
---|---|---|
committer | Miklos Szeredi <mszeredi@redhat.com> | 2017-05-29 15:15:27 +0200 |
commit | a082c6f680da298cf075886ff032f32ccb7c5e1a (patch) | |
tree | 48a876fd1a7b738f978f5abbfc1e59bcbe288d43 /fs | |
parent | f3a1568582cc207663a4d5e37da790334372855b (diff) | |
download | op-kernel-dev-a082c6f680da298cf075886ff032f32ccb7c5e1a.zip op-kernel-dev-a082c6f680da298cf075886ff032f32ccb7c5e1a.tar.gz |
ovl: filter trusted xattr for non-admin
Filesystems filter out extended attributes in the "trusted." domain for
unprivlieged callers.
Overlay calls underlying filesystem's method with elevated privs, so need
to do the filtering in overlayfs too.
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/overlayfs/inode.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c index ad9547f..d613e2c 100644 --- a/fs/overlayfs/inode.c +++ b/fs/overlayfs/inode.c @@ -240,6 +240,16 @@ int ovl_xattr_get(struct dentry *dentry, const char *name, return res; } +static bool ovl_can_list(const char *s) +{ + /* List all non-trusted xatts */ + if (strncmp(s, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN) != 0) + return true; + + /* Never list trusted.overlay, list other trusted for superuser only */ + return !ovl_is_private_xattr(s) && capable(CAP_SYS_ADMIN); +} + ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size) { struct dentry *realdentry = ovl_dentry_real(dentry); @@ -263,7 +273,7 @@ ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size) return -EIO; len -= slen; - if (ovl_is_private_xattr(s)) { + if (!ovl_can_list(s)) { res -= slen; memmove(s, s + slen, len); } else { |