Venkat Yekkirala wrote: >>>+static int selinux_skb_flow_out(struct sk_buff *skb, u32 nf_secid) >>>+{ >>>+ u32 trans_sid; >>>+ int err; >>>+ >>>+ if (selinux_compat_net) >>>+ return 1; >>>+ >>>+ if (!skb->secmark) { >>>+ u32 xfrm_sid; >>>+ >>>+ selinux_skb_xfrm_sid(skb, &xfrm_sid); >>>+ >>>+ if (xfrm_sid) >>>+ skb->secmark = xfrm_sid; >>>+ else if (skb->sk) { >>>+ struct sk_security_struct *sksec = >> >>skb->sk->sk_security; >> >>>+ skb->secmark = sksec->sid; >>>+ } >>>+ } >>>+ >>>+ err = avc_has_perm(skb->secmark, nf_secid, SECCLASS_PACKET, >>>+ PACKET__FLOW_OUT, NULL); >> >>While I don't see any explicit mention of it in the documentation or >>your comments, I assume we would want a flow_out check for >>NetLabel here >>as well? > > I don't believe we do. By this time, the packet is or should already be > carrying the CIPSO/NetLabel option which should already be the right one > (derived from the socket or flow as appropriate), but you would want to > audit the code to make sure. IOW, the label option in the IP header should > already be reflecting the secmark on the skb. But again, you may want to > audit the code to make sure.
In the case above I am concerned about the situation where the skb->secmark == 0 and there is a IPv4 option (i.e. it is NetLabel labeled) on the packet. It would seem that the right/consistent thing to do would be to adjust the secmark accordingly, similar to what we would do on the flow_in case, yes? >>>+static int selinux_ip_postroute_last_compat(struct sock >> >>*sk, struct sk_buff *skb, >> >>>+ struct net_device *dev, >>> struct avc_audit_data *ad, >>> u16 family, char >> >>*addrp, int len) >> >>> { >>>@@ -3710,6 +3777,9 @@ static int selinux_ip_postroute_last_com >>> struct inode *inode; >>> struct inode_security_struct *isec; >>> >>>+ if (!sk) >>>+ goto out; >>>+ >>> sock = sk->sk_socket; >>> if (!sock) >>> goto out; >>>@@ -3768,7 +3838,11 @@ static int selinux_ip_postroute_last_com >>> >>> err = avc_has_perm(isec->sid, port_sid, isec->sclass, >>> send_perm, ad); >>>+ if (err) >>>+ goto out; >>> } >>>+ >>>+ err = selinux_xfrm_postroute_last(isec->sid, skb, ad); >>> out: >>> return err; >>> } >>>@@ -3782,17 +3856,9 @@ static unsigned int selinux_ip_postroute >>> { >>> char *addrp; >>> int len, err = 0; >>>- struct sock *sk; >>> struct sk_buff *skb = *pskb; >>> struct avc_audit_data ad; >>> struct net_device *dev = (struct net_device *)out; >>>- struct sk_security_struct *sksec; >>>- >>>- sk = skb->sk; >>>- if (!sk) >>>- goto out; >>>- >>>- sksec = sk->sk_security; >>> >>> AVC_AUDIT_DATA_INIT(&ad, NET); >>> ad.u.net.netif = dev->name; >>>@@ -3803,16 +3869,25 @@ static unsigned int selinux_ip_postroute >>> goto out; >>> >>> if (selinux_compat_net) >>>- err = selinux_ip_postroute_last_compat(sk, dev, &ad, >>>+ err = selinux_ip_postroute_last_compat(skb->sk, >> >>skb, dev, &ad, >> >>> family, >> >>addrp, len); >> >>>- else >>>- err = avc_has_perm(sksec->sid, skb->secmark, >> >>SECCLASS_PACKET, >> >>>- PACKET__SEND, &ad); >>>+ else { >>>+ if (!skb->secmark) { >>>+ u32 xfrm_sid; >>> >>>- if (err) >>>- goto out; >>>+ selinux_skb_xfrm_sid(skb, &xfrm_sid); >>> >>>- err = selinux_xfrm_postroute_last(sksec->sid, skb, &ad); >>>+ if (xfrm_sid) >>>+ skb->secmark = xfrm_sid; >>>+ else if (skb->sk) { >>>+ struct sk_security_struct *sksec = >>>+ skb->sk->sk_security; >>>+ skb->secmark = sksec->sid; >>>+ } >>>+ } >>>+ err = avc_has_perm(skb->secmark, SECINITSID_UNLABELED, >>>+ SECCLASS_PACKET, >> >>PACKET__FLOW_OUT, &ad); >> >>>+ } >> >>This looks nearly identical to selinux_skb_flow_out() as implemented >>above, the only real differences being two of the args to the >>avc_has_perm() call. Any reason you don't abstract out the >>common parts >>to a separate function? > > May be in the future. > >>Also, the same comment/question about NetLabel support in >>selinux_skb_flow_out() applies here as well I suspect. > > My comments earlier should apply here as well. Mine too :) -- paul moore linux security @ hp - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html