Kernel patch to go along with the Reference Policy patches
cover Kernel patch to go along with the Reference Policy patches
This is the latest revision of the netmsg initial SID patch for the kernel. I am reposting this patch for reference only at this point in time so that people looking at the reference policy patches have some idea of what the corresponding kernel changes look like without digging through their favorite mailing list archive.
Once Chris has accepted the policy patches I will be reposting this patch for inclusion into the next kernel release.
Signature · 7 lines
paul moore linux security @ hp -- This message was distributed to subscribers of the selinux mailing list. If you no longer wish to subscribe, send mail to [email protected] with the words "unsubscribe selinux" without quotes as the message.
PATCH 1/1 SELinux: use SECINITSID_NETMSG instead of SECINITSID_UNLABELED for NetLabel
These changes will make NetLabel behave like labeled IPsec where there is an access check for both labeled and unlabeled packets as well as providing the ability to restrict domains to receiving only labeled packets when NetLabel is in use. The changes to the policy are straight forward with the following necessary to receive labeled traffic (assuming SECINITSID_NETMSG is defined to use "netlabel_peer_t"):
allow mydomain_t netlabel_peer_t:{tcp_socket udp_socket rawip_socket} recvfrom;
The policy for unlabeled traffic would be:
allow mydomain_t unlabeled_t:{tcp_socket udp_socket rawip_socket} recvfrom;
--- security/selinux/hooks.c | 21 +++++++++++---------- security/selinux/netlabel.c | 25 ++++++++++--------------- 2 files changed, 21 insertions(+), 25 deletions(-)
security/selinux/hooks.c +11 -10
@@ -3124,17 +3124,19 @@ static int selinux_parse_skb(struct sk_b/** * selinux_skb_extlbl_sid - Determine the external label of a packet * @skb: the packet -* @base_sid: the SELinux SID to use as a context for MLS only external labels * @sid: the packet's SID * * Description: * Check the various different forms of external packet labeling and determine -* the external SID for the packet. +* the external SID for the packet. If only one form of external labeling is +* present then it is used, if both labeled IPsec and NetLabel labels are +* present then the SELinux type information is taken from the labeled IPsec +* SA and the MLS sensitivity label information is taken from the NetLabel +* security attributes. This bit of "magic" is done in the call to +* selinux_netlbl_skbuff_getsid(). * */ -static void selinux_skb_extlbl_sid (struct sk_buff *skb, -u32 base_sid, -u32 *sid) +static void selinux_skb_extlbl_sid (struct sk_buff *skb,u32 *sid) {u32 xfrm_sid;u32 nlbl_sid;
@@ -3142,10 +3144,9 @@ static void selinux_skb_extlbl_sid(strucselinux_skb_xfrm_sid (skb, &xfrm_sid);if (selinux_netlbl_skbuff_getsid (skb, (xfrm_sid ==SECSID_NULL ? - base_sid : xfrm_sid), +SECINITSID_NETMSG : xfrm_sid), &nlbl_sid) !=0 ) nlbl_sid =SECSID_NULL ; - *sid = (nlbl_sid ==SECSID_NULL ? xfrm_sid : nlbl_sid); }
@@ -3690,7 +3691,7 @@ static int selinux_socket_getpeersec_dgrif (sock && sock->sk->sk_family ==PF_UNIX )selinux_get_inode_sid (SOCK_INODE (sock), &peer_secid);else if (skb) -selinux_skb_extlbl_sid (skb,SECINITSID_UNLABELED , &peer_secid); +selinux_skb_extlbl_sid (skb, &peer_secid);if (peer_secid ==SECSID_NULL ) err = -EINVAL ;
@@ -3751,7 +3752,7 @@ static int selinux_inet_conn_request(stru32 newsid;u32 peersid; -selinux_skb_extlbl_sid (skb,SECINITSID_UNLABELED , &peersid); +selinux_skb_extlbl_sid (skb, &peersid);if (peersid ==SECSID_NULL ) { req->secid = sksec->sid; req->peer_secid =SECSID_NULL ;
@@ -3789,7 +3790,7 @@ static void selinux_inet_conn_establishe {struct sk_security_struct *sksec = sk->sk_security; -selinux_skb_extlbl_sid (skb,SECINITSID_UNLABELED , &sksec->peer_sid); +selinux_skb_extlbl_sid (skb, &sksec->peer_sid); } static void selinux_req_classify_flow(const struct request_sock *req,
security/selinux/netlabel.c +10 -15
@@ -198,7 +198,7 @@ void selinux_netlbl_sock_graft(struct soif (netlbl_sock_getattr (sk, &secattr) ==0 && secattr.flags !=NETLBL_SECATTR_NONE &&security_netlbl_secattr_to_sid (&secattr, -SECINITSID_UNLABELED , +SECINITSID_NETMSG , &nlbl_peer_sid) ==0 ) sksec->peer_sid = nlbl_peer_sid;netlbl_secattr_destroy (&secattr);
@@ -293,37 +293,32 @@ int selinux_netlbl_sock_rcv_skb(struct s {int rc;u32 netlbl_sid; -u32 recv_perm; +u32 perm; - rc =selinux_netlbl_skbuff_getsid (skb, -SECINITSID_UNLABELED , - &netlbl_sid); + rc =selinux_netlbl_skbuff_getsid (skb,SECINITSID_NETMSG , &netlbl_sid);if (rc !=0 )return rc;if (netlbl_sid ==SECSID_NULL ) -return 0 ; + netlbl_sid =SECINITSID_UNLABELED ;switch (sksec->sclass) {case SECCLASS_UDP_SOCKET : - recv_perm =UDP_SOCKET__RECVFROM ; + perm =UDP_SOCKET__RECVFROM ;break ;case SECCLASS_TCP_SOCKET : - recv_perm =TCP_SOCKET__RECVFROM ; + perm =TCP_SOCKET__RECVFROM ;break ;default : - recv_perm =RAWIP_SOCKET__RECVFROM ; + perm =RAWIP_SOCKET__RECVFROM ; } - rc =avc_has_perm (sksec->sid, - netlbl_sid, - sksec->sclass, - recv_perm, - ad); + rc =avc_has_perm (sksec->sid, netlbl_sid, sksec->sclass, perm, ad);if (rc ==0 )return 0 ; -netlbl_skbuff_err (skb, rc); +if (netlbl_sid !=SECSID_NULL ) +netlbl_skbuff_err (skb, rc);return rc; }
Signature · 7 lines
paul moore linux security @ hp -- This message was distributed to subscribers of the selinux mailing list. If you no longer wish to subscribe, send mail to [email protected] with the words "unsubscribe selinux" without quotes as the message.