forked from mirrors/linux
		
	security: implement sctp_assoc_established hook in selinux
Different from selinux_inet_conn_established(), it also gives the
secid to asoc->peer_secid in selinux_sctp_assoc_established(),
as one UDP-type socket may have more than one asocs.
Note that peer_secid in asoc will save the peer secid for this
asoc connection, and peer_sid in sksec will just keep the peer
secid for the latest connection. So the right use should be do
peeloff for UDP-type socket if there will be multiple asocs in
one socket, so that the peeloff socket has the right label for
its asoc.
v1->v2:
  - call selinux_inet_conn_established() to reduce some code
    duplication in selinux_sctp_assoc_established(), as Ondrej
    suggested.
  - when doing peeloff, it calls sock_create() where it actually
    gets secid for socket from socket_sockcreate_sid(). So reuse
    SECSID_WILD to ensure the peeloff socket keeps using that
    secid after calling selinux_sctp_sk_clone() for client side.
Fixes: 72e89f5008 ("security: Add support for SCTP security hooks")
Reported-by: Prashanth Prahlad <pprahlad@redhat.com>
Reviewed-by: Richard Haines <richard_c_haines@btinternet.com>
Tested-by: Richard Haines <richard_c_haines@btinternet.com>
Signed-off-by: Xin Long <lucien.xin@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
			
			
This commit is contained in:
		
							parent
							
								
									7c2ef0240e
								
							
						
					
					
						commit
						e7310c9402
					
				
					 1 changed files with 13 additions and 1 deletions
				
			
		|  | @ -5502,7 +5502,8 @@ static void selinux_sctp_sk_clone(struct sctp_association *asoc, struct sock *sk | ||||||
| 	if (!selinux_policycap_extsockclass()) | 	if (!selinux_policycap_extsockclass()) | ||||||
| 		return selinux_sk_clone_security(sk, newsk); | 		return selinux_sk_clone_security(sk, newsk); | ||||||
| 
 | 
 | ||||||
| 	newsksec->sid = asoc->secid; | 	if (asoc->secid != SECSID_WILD) | ||||||
|  | 		newsksec->sid = asoc->secid; | ||||||
| 	newsksec->peer_sid = asoc->peer_secid; | 	newsksec->peer_sid = asoc->peer_secid; | ||||||
| 	newsksec->sclass = sksec->sclass; | 	newsksec->sclass = sksec->sclass; | ||||||
| 	selinux_netlbl_sctp_sk_clone(sk, newsk); | 	selinux_netlbl_sctp_sk_clone(sk, newsk); | ||||||
|  | @ -5558,6 +5559,16 @@ static void selinux_inet_conn_established(struct sock *sk, struct sk_buff *skb) | ||||||
| 	selinux_skb_peerlbl_sid(skb, family, &sksec->peer_sid); | 	selinux_skb_peerlbl_sid(skb, family, &sksec->peer_sid); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static void selinux_sctp_assoc_established(struct sctp_association *asoc, | ||||||
|  | 					   struct sk_buff *skb) | ||||||
|  | { | ||||||
|  | 	struct sk_security_struct *sksec = asoc->base.sk->sk_security; | ||||||
|  | 
 | ||||||
|  | 	selinux_inet_conn_established(asoc->base.sk, skb); | ||||||
|  | 	asoc->peer_secid = sksec->peer_sid; | ||||||
|  | 	asoc->secid = SECSID_WILD; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static int selinux_secmark_relabel_packet(u32 sid) | static int selinux_secmark_relabel_packet(u32 sid) | ||||||
| { | { | ||||||
| 	const struct task_security_struct *__tsec; | 	const struct task_security_struct *__tsec; | ||||||
|  | @ -7228,6 +7239,7 @@ static struct security_hook_list selinux_hooks[] __lsm_ro_after_init = { | ||||||
| 	LSM_HOOK_INIT(sctp_assoc_request, selinux_sctp_assoc_request), | 	LSM_HOOK_INIT(sctp_assoc_request, selinux_sctp_assoc_request), | ||||||
| 	LSM_HOOK_INIT(sctp_sk_clone, selinux_sctp_sk_clone), | 	LSM_HOOK_INIT(sctp_sk_clone, selinux_sctp_sk_clone), | ||||||
| 	LSM_HOOK_INIT(sctp_bind_connect, selinux_sctp_bind_connect), | 	LSM_HOOK_INIT(sctp_bind_connect, selinux_sctp_bind_connect), | ||||||
|  | 	LSM_HOOK_INIT(sctp_assoc_established, selinux_sctp_assoc_established), | ||||||
| 	LSM_HOOK_INIT(inet_conn_request, selinux_inet_conn_request), | 	LSM_HOOK_INIT(inet_conn_request, selinux_inet_conn_request), | ||||||
| 	LSM_HOOK_INIT(inet_csk_clone, selinux_inet_csk_clone), | 	LSM_HOOK_INIT(inet_csk_clone, selinux_inet_csk_clone), | ||||||
| 	LSM_HOOK_INIT(inet_conn_established, selinux_inet_conn_established), | 	LSM_HOOK_INIT(inet_conn_established, selinux_inet_conn_established), | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Xin Long
						Xin Long