Skip to content

Commit

Permalink
netfilter: xt_owner: Add supplementary groups option
Browse files Browse the repository at this point in the history
The XT_OWNER_SUPPL_GROUPS flag causes GIDs specified with XT_OWNER_GID
to be also checked in the supplementary groups of a process.

f_cred->group_info cannot be modified during its lifetime and f_cred
holds a reference to it so it's safe to use.

Signed-off-by: Lukasz Pawelczyk <l.pawelczyk@samsung.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
  • Loading branch information
Lukasz Pawelczyk authored and Pablo Neira Ayuso committed May 31, 2019
1 parent 508f744 commit ea6cc2f
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 6 deletions.
7 changes: 4 additions & 3 deletions include/uapi/linux/netfilter/xt_owner.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@
#include <linux/types.h>

enum {
XT_OWNER_UID = 1 << 0,
XT_OWNER_GID = 1 << 1,
XT_OWNER_SOCKET = 1 << 2,
XT_OWNER_UID = 1 << 0,
XT_OWNER_GID = 1 << 1,
XT_OWNER_SOCKET = 1 << 2,
XT_OWNER_SUPPL_GROUPS = 1 << 3,
};

struct xt_owner_match_info {
Expand Down
23 changes: 20 additions & 3 deletions net/netfilter/xt_owner.c
Original file line number Diff line number Diff line change
Expand Up @@ -91,11 +91,28 @@ owner_mt(const struct sk_buff *skb, struct xt_action_param *par)
}

if (info->match & XT_OWNER_GID) {
unsigned int i, match = false;
kgid_t gid_min = make_kgid(net->user_ns, info->gid_min);
kgid_t gid_max = make_kgid(net->user_ns, info->gid_max);
if ((gid_gte(filp->f_cred->fsgid, gid_min) &&
gid_lte(filp->f_cred->fsgid, gid_max)) ^
!(info->invert & XT_OWNER_GID))
struct group_info *gi = filp->f_cred->group_info;

if (gid_gte(filp->f_cred->fsgid, gid_min) &&
gid_lte(filp->f_cred->fsgid, gid_max))
match = true;

if (!match && (info->match & XT_OWNER_SUPPL_GROUPS) && gi) {
for (i = 0; i < gi->ngroups; ++i) {
kgid_t group = gi->gid[i];

if (gid_gte(group, gid_min) &&
gid_lte(group, gid_max)) {
match = true;
break;
}
}
}

if (match ^ !(info->invert & XT_OWNER_GID))
return false;
}

Expand Down

0 comments on commit ea6cc2f

Please sign in to comment.