]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
NFS/sunrpc: don't use a credential with extra groups.
authorNeilBrown <neilb@suse.de>
Mon, 24 Oct 2011 23:25:49 +0000 (10:25 +1100)
committerPaul Gortmaker <paul.gortmaker@windriver.com>
Fri, 17 Aug 2012 19:35:51 +0000 (15:35 -0400)
commit dc6f55e9f8dac4b6479be67c5c9128ad37bb491f upstream.

The sunrpc layer keeps a cache of recently used credentials and
'unx_match' is used to find the credential which matches the current
process.

However unx_match allows a match when the cached credential has extra
groups at the end of uc_gids list which are not in the process group list.

So if a process with a list of (say) 4 group accesses a file and gains
access because of the last group in the list, then another process
with the same uid and gid, and a gid list being the first tree of the
gids of the original process tries to access the file, it will be
granted access even though it shouldn't as the wrong rpc credential
will be used.

Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
net/sunrpc/auth_unix.c

index aac2f8b4ee214290796bf76c97aae6051b4fed47..c16f25d6b54755bb6e8080f675c2b82dfbf20cb0 100644 (file)
@@ -130,6 +130,9 @@ unx_match(struct auth_cred *acred, struct rpc_cred *rcred, int flags)
        for (i = 0; i < groups ; i++)
                if (cred->uc_gids[i] != GROUP_AT(acred->group_info, i))
                        return 0;
+       if (groups < NFS_NGROUPS &&
+           cred->uc_gids[groups] != NOGROUP)
+               return 0;
        return 1;
 }