lkml.org 
[lkml]   [2021]   [Mar]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.11 305/775] capabilities: Dont allow writing ambiguous v3 file capabilities
    Date
    From: Eric W. Biederman <ebiederm@xmission.com>

    [ Upstream commit 95ebabde382c371572297915b104e55403674e73 ]

    The v3 file capabilities have a uid field that records the filesystem
    uid of the root user of the user namespace the file capabilities are
    valid in.

    When someone is silly enough to have the same underlying uid as the
    root uid of multiple nested containers a v3 filesystem capability can
    be ambiguous.

    In the spirit of don't do that then, forbid writing a v3 filesystem
    capability if it is ambiguous.

    Fixes: 8db6c34f1dbc ("Introduce v3 namespaced file capabilities")
    Reviewed-by: Andrew G. Morgan <morgan@kernel.org>
    Reviewed-by: Serge Hallyn <serge@hallyn.com>
    Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    security/commoncap.c | 12 +++++++++++-
    1 file changed, 11 insertions(+), 1 deletion(-)

    diff --git a/security/commoncap.c b/security/commoncap.c
    index 26c1cb725dcbe..78598be45f101 100644
    --- a/security/commoncap.c
    +++ b/security/commoncap.c
    @@ -500,7 +500,8 @@ int cap_convert_nscap(struct dentry *dentry, const void **ivalue, size_t size)
    __u32 magic, nsmagic;
    struct inode *inode = d_backing_inode(dentry);
    struct user_namespace *task_ns = current_user_ns(),
    - *fs_ns = inode->i_sb->s_user_ns;
    + *fs_ns = inode->i_sb->s_user_ns,
    + *ancestor;
    kuid_t rootid;
    size_t newsize;

    @@ -523,6 +524,15 @@ int cap_convert_nscap(struct dentry *dentry, const void **ivalue, size_t size)
    if (nsrootid == -1)
    return -EINVAL;

    + /*
    + * Do not allow allow adding a v3 filesystem capability xattr
    + * if the rootid field is ambiguous.
    + */
    + for (ancestor = task_ns->parent; ancestor; ancestor = ancestor->parent) {
    + if (from_kuid(ancestor, rootid) == 0)
    + return -EINVAL;
    + }
    +
    newsize = sizeof(struct vfs_ns_cap_data);
    nscap = kmalloc(newsize, GFP_ATOMIC);
    if (!nscap)
    --
    2.27.0


    \
     
     \ /
      Last update: 2021-03-02 03:10    [W:4.508 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site