Skip to content

Commit

Permalink
selinux: look for IPsec labels on both inbound and outbound packets
Browse files Browse the repository at this point in the history
Previously selinux_skb_peerlbl_sid() would only check for labeled
IPsec security labels on inbound packets, this patch enables it to
check both inbound and outbound traffic for labeled IPsec security
labels.

Reported-by: Janak Desai <[email protected]>
Cc: [email protected]
Signed-off-by: Paul Moore <[email protected]>
  • Loading branch information
pcmoore committed Dec 12, 2013
1 parent 446b802 commit 817eff7
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 14 deletions.
2 changes: 1 addition & 1 deletion security/selinux/hooks.c
Original file line number Diff line number Diff line change
Expand Up @@ -3829,7 +3829,7 @@ static int selinux_skb_peerlbl_sid(struct sk_buff *skb, u16 family, u32 *sid)
u32 nlbl_sid;
u32 nlbl_type;

err = selinux_skb_xfrm_sid(skb, &xfrm_sid);
err = selinux_xfrm_skb_sid(skb, &xfrm_sid);
if (unlikely(err))
return -EACCES;
err = selinux_netlbl_skbuff_getsid(skb, family, &nlbl_type, &nlbl_sid);
Expand Down
8 changes: 5 additions & 3 deletions security/selinux/include/xfrm.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ int selinux_xfrm_sock_rcv_skb(u32 sk_sid, struct sk_buff *skb,
int selinux_xfrm_postroute_last(u32 sk_sid, struct sk_buff *skb,
struct common_audit_data *ad, u8 proto);
int selinux_xfrm_decode_session(struct sk_buff *skb, u32 *sid, int ckall);
int selinux_xfrm_skb_sid(struct sk_buff *skb, u32 *sid);

static inline void selinux_xfrm_notify_policyload(void)
{
Expand Down Expand Up @@ -79,11 +80,12 @@ static inline int selinux_xfrm_decode_session(struct sk_buff *skb, u32 *sid,
static inline void selinux_xfrm_notify_policyload(void)
{
}
#endif

static inline int selinux_skb_xfrm_sid(struct sk_buff *skb, u32 *sid)
static inline int selinux_xfrm_skb_sid(struct sk_buff *skb, u32 *sid)
{
return selinux_xfrm_decode_session(skb, sid, 0);
*sid = SECSID_NULL;
return 0;
}
#endif

#endif /* _SELINUX_XFRM_H_ */
51 changes: 41 additions & 10 deletions security/selinux/xfrm.c
Original file line number Diff line number Diff line change
Expand Up @@ -209,19 +209,26 @@ int selinux_xfrm_state_pol_flow_match(struct xfrm_state *x,
NULL) ? 0 : 1);
}

/*
* LSM hook implementation that checks and/or returns the xfrm sid for the
* incoming packet.
*/
int selinux_xfrm_decode_session(struct sk_buff *skb, u32 *sid, int ckall)
static u32 selinux_xfrm_skb_sid_egress(struct sk_buff *skb)
{
u32 sid_session = SECSID_NULL;
struct sec_path *sp;
struct dst_entry *dst = skb_dst(skb);
struct xfrm_state *x;

if (skb == NULL)
goto out;
if (dst == NULL)
return SECSID_NULL;
x = dst->xfrm;
if (x == NULL || !selinux_authorizable_xfrm(x))
return SECSID_NULL;

return x->security->ctx_sid;
}

static int selinux_xfrm_skb_sid_ingress(struct sk_buff *skb,
u32 *sid, int ckall)
{
u32 sid_session = SECSID_NULL;
struct sec_path *sp = skb->sp;

sp = skb->sp;
if (sp) {
int i;

Expand All @@ -247,6 +254,30 @@ int selinux_xfrm_decode_session(struct sk_buff *skb, u32 *sid, int ckall)
return 0;
}

/*
* LSM hook implementation that checks and/or returns the xfrm sid for the
* incoming packet.
*/
int selinux_xfrm_decode_session(struct sk_buff *skb, u32 *sid, int ckall)
{
if (skb == NULL) {
*sid = SECSID_NULL;
return 0;
}
return selinux_xfrm_skb_sid_ingress(skb, sid, ckall);
}

int selinux_xfrm_skb_sid(struct sk_buff *skb, u32 *sid)
{
int rc;

rc = selinux_xfrm_skb_sid_ingress(skb, sid, 0);
if (rc == 0 && *sid == SECSID_NULL)
*sid = selinux_xfrm_skb_sid_egress(skb);

return rc;
}

/*
* LSM hook implementation that allocs and transfers uctx spec to xfrm_policy.
*/
Expand Down

0 comments on commit 817eff7

Please sign in to comment.