netlabel: Prevent setsockopt() from changing the hop-by-hop option.
If a socket has a netlabel in place then don't let setsockopt() alter the socket's IPv6 hop-by-hop option. This is in the same spirit as the existing check for IPv4. Signed-off-by: Huw Davies <huw@codeweavers.com> Signed-off-by: Paul Moore <paul@paul-moore.com>
This commit is contained in:
parent
ceba1832b1
commit
1f440c99d3
|
@ -409,6 +409,21 @@ int selinux_netlbl_sock_rcv_skb(struct sk_security_struct *sksec,
|
|||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* selinux_netlbl_option - Is this a NetLabel option
|
||||
* @level: the socket level or protocol
|
||||
* @optname: the socket option name
|
||||
*
|
||||
* Description:
|
||||
* Returns true if @level and @optname refer to a NetLabel option.
|
||||
* Helper for selinux_netlbl_socket_setsockopt().
|
||||
*/
|
||||
static inline int selinux_netlbl_option(int level, int optname)
|
||||
{
|
||||
return (level == IPPROTO_IP && optname == IP_OPTIONS) ||
|
||||
(level == IPPROTO_IPV6 && optname == IPV6_HOPOPTS);
|
||||
}
|
||||
|
||||
/**
|
||||
* selinux_netlbl_socket_setsockopt - Do not allow users to remove a NetLabel
|
||||
* @sock: the socket
|
||||
|
@ -431,7 +446,7 @@ int selinux_netlbl_socket_setsockopt(struct socket *sock,
|
|||
struct sk_security_struct *sksec = sk->sk_security;
|
||||
struct netlbl_lsm_secattr secattr;
|
||||
|
||||
if (level == IPPROTO_IP && optname == IP_OPTIONS &&
|
||||
if (selinux_netlbl_option(level, optname) &&
|
||||
(sksec->nlbl_state == NLBL_LABELED ||
|
||||
sksec->nlbl_state == NLBL_CONNLABELED)) {
|
||||
netlbl_secattr_init(&secattr);
|
||||
|
|
Loading…
Reference in New Issue