Message ID | 20180710070515eucas1p1dddc12cc44c820971809a242e8cee106~-8AfqiO9s0149301493eucas1p1h@eucas1p1.samsung.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 7/10/2018 12:05 AM, Piotr Sawicki wrote: > A socket which has sk_family set to PF_INET6 is able to receive not > only IPv6 but also IPv4 traffic (IPv4-mapped IPv6 addresses). > > Prior to this patch, the smk_skb_to_addr_ipv6() could have been > called for socket buffers containing IPv4 packets, in result such > traffic was allowed. > > Signed-off-by: Piotr Sawicki <p.sawicki2@partner.samsung.com> Looks fine from here. Do you have a simple test case? > --- > security/smack/smack_lsm.c | 12 ++++++++---- > 1 file changed, 8 insertions(+), 4 deletions(-) > > diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c > index 19de675..1315de4 100644 > --- a/security/smack/smack_lsm.c > +++ b/security/smack/smack_lsm.c > @@ -3924,15 +3924,19 @@ static int smack_socket_sock_rcv_skb(struct sock > *sk, struct sk_buff *skb) > struct smack_known *skp = NULL; > int rc = 0; > struct smk_audit_info ad; > + u16 family = sk->sk_family; > #ifdef CONFIG_AUDIT > struct lsm_network_audit net; > #endif > #if IS_ENABLED(CONFIG_IPV6) > struct sockaddr_in6 sadd; > int proto; > + > + if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP)) > + family = PF_INET; > #endif /* CONFIG_IPV6 */ > > - switch (sk->sk_family) { > + switch (family) { > case PF_INET: > #ifdef CONFIG_SECURITY_SMACK_NETFILTER > /* > @@ -3950,7 +3954,7 @@ static int smack_socket_sock_rcv_skb(struct sock > *sk, struct sk_buff *skb) > */ > netlbl_secattr_init(&secattr); > > - rc = netlbl_skbuff_getattr(skb, sk->sk_family, &secattr); > + rc = netlbl_skbuff_getattr(skb, family, &secattr); > if (rc == 0) > skp = smack_from_secattr(&secattr, ssp); > else > @@ -3963,7 +3967,7 @@ static int smack_socket_sock_rcv_skb(struct sock > *sk, struct sk_buff *skb) > #endif > #ifdef CONFIG_AUDIT > smk_ad_init_net(&ad, __func__, LSM_AUDIT_DATA_NET, &net); > - ad.a.u.net->family = sk->sk_family; > + ad.a.u.net->family = family; > ad.a.u.net->netif = skb->skb_iif; > ipv4_skb_to_auditdata(skb, &ad.a, NULL); > #endif > @@ -3977,7 +3981,7 @@ static int smack_socket_sock_rcv_skb(struct sock > *sk, struct sk_buff *skb) > rc = smk_bu_note("IPv4 delivery", skp, ssp->smk_in, > MAY_WRITE, rc); > if (rc != 0) > - netlbl_skbuff_err(skb, sk->sk_family, rc, 0); > + netlbl_skbuff_err(skb, family, rc, 0); > break; > #if IS_ENABLED(CONFIG_IPV6) > case PF_INET6: -- To unsubscribe from this list: send the line "unsubscribe linux-security-module" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 07/10/2018 05:21 PM, Casey Schaufler wrote: > On 7/10/2018 12:05 AM, Piotr Sawicki wrote: >> A socket which has sk_family set to PF_INET6 is able to receive not >> only IPv6 but also IPv4 traffic (IPv4-mapped IPv6 addresses). >> >> Prior to this patch, the smk_skb_to_addr_ipv6() could have been >> called for socket buffers containing IPv4 packets, in result such >> traffic was allowed. >> >> Signed-off-by: Piotr Sawicki <p.sawicki2@partner.samsung.com> > > Looks fine from here. Do you have a simple test case? Yes, I've tested it on Tizen emulator. Tests are available here https://review.tizen.org/gerrit/#/admin/projects/platform/core/test/security-tests, branch nether. I'm really sorry for this mess with multiple emails. >> --- >> security/smack/smack_lsm.c | 12 ++++++++---- >> 1 file changed, 8 insertions(+), 4 deletions(-) >> >> diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c >> index 19de675..1315de4 100644 >> --- a/security/smack/smack_lsm.c >> +++ b/security/smack/smack_lsm.c >> @@ -3924,15 +3924,19 @@ static int smack_socket_sock_rcv_skb(struct sock >> *sk, struct sk_buff *skb) >> struct smack_known *skp = NULL; >> int rc = 0; >> struct smk_audit_info ad; >> + u16 family = sk->sk_family; >> #ifdef CONFIG_AUDIT >> struct lsm_network_audit net; >> #endif >> #if IS_ENABLED(CONFIG_IPV6) >> struct sockaddr_in6 sadd; >> int proto; >> + >> + if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP)) >> + family = PF_INET; >> #endif /* CONFIG_IPV6 */ >> >> - switch (sk->sk_family) { >> + switch (family) { >> case PF_INET: >> #ifdef CONFIG_SECURITY_SMACK_NETFILTER >> /* >> @@ -3950,7 +3954,7 @@ static int smack_socket_sock_rcv_skb(struct sock >> *sk, struct sk_buff *skb) >> */ >> netlbl_secattr_init(&secattr); >> >> - rc = netlbl_skbuff_getattr(skb, sk->sk_family, &secattr); >> + rc = netlbl_skbuff_getattr(skb, family, &secattr); >> if (rc == 0) >> skp = smack_from_secattr(&secattr, ssp); >> else >> @@ -3963,7 +3967,7 @@ static int smack_socket_sock_rcv_skb(struct sock >> *sk, struct sk_buff *skb) >> #endif >> #ifdef CONFIG_AUDIT >> smk_ad_init_net(&ad, __func__, LSM_AUDIT_DATA_NET, &net); >> - ad.a.u.net->family = sk->sk_family; >> + ad.a.u.net->family = family; >> ad.a.u.net->netif = skb->skb_iif; >> ipv4_skb_to_auditdata(skb, &ad.a, NULL); >> #endif >> @@ -3977,7 +3981,7 @@ static int smack_socket_sock_rcv_skb(struct sock >> *sk, struct sk_buff *skb) >> rc = smk_bu_note("IPv4 delivery", skp, ssp->smk_in, >> MAY_WRITE, rc); >> if (rc != 0) >> - netlbl_skbuff_err(skb, sk->sk_family, rc, 0); >> + netlbl_skbuff_err(skb, family, rc, 0); >> break; >> #if IS_ENABLED(CONFIG_IPV6) >> case PF_INET6: > > -- > To unsubscribe from this list: send the line "unsubscribe linux-security-module" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > > > -- To unsubscribe from this list: send the line "unsubscribe linux-security-module" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 7/10/2018 8:44 AM, Piotr Sawicki wrote: > On 07/10/2018 05:21 PM, Casey Schaufler wrote: >> On 7/10/2018 12:05 AM, Piotr Sawicki wrote: >>> A socket which has sk_family set to PF_INET6 is able to receive not >>> only IPv6 but also IPv4 traffic (IPv4-mapped IPv6 addresses). >>> >>> Prior to this patch, the smk_skb_to_addr_ipv6() could have been >>> called for socket buffers containing IPv4 packets, in result such >>> traffic was allowed. >>> >>> Signed-off-by: Piotr Sawicki <p.sawicki2@partner.samsung.com> >> Looks fine from here. Do you have a simple test case? > > Yes, I've tested it on Tizen emulator. > > Tests are available here > https://review.tizen.org/gerrit/#/admin/projects/platform/core/test/security-tests, > branch nether. Can you identify the specific test? There's quite a bit to look through. Thank you. > > I'm really sorry for this mess with multiple emails. > > >>> --- >>> security/smack/smack_lsm.c | 12 ++++++++---- >>> 1 file changed, 8 insertions(+), 4 deletions(-) >>> >>> diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c >>> index 19de675..1315de4 100644 >>> --- a/security/smack/smack_lsm.c >>> +++ b/security/smack/smack_lsm.c >>> @@ -3924,15 +3924,19 @@ static int smack_socket_sock_rcv_skb(struct sock >>> *sk, struct sk_buff *skb) >>> struct smack_known *skp = NULL; >>> int rc = 0; >>> struct smk_audit_info ad; >>> + u16 family = sk->sk_family; >>> #ifdef CONFIG_AUDIT >>> struct lsm_network_audit net; >>> #endif >>> #if IS_ENABLED(CONFIG_IPV6) >>> struct sockaddr_in6 sadd; >>> int proto; >>> + >>> + if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP)) >>> + family = PF_INET; >>> #endif /* CONFIG_IPV6 */ >>> >>> - switch (sk->sk_family) { >>> + switch (family) { >>> case PF_INET: >>> #ifdef CONFIG_SECURITY_SMACK_NETFILTER >>> /* >>> @@ -3950,7 +3954,7 @@ static int smack_socket_sock_rcv_skb(struct sock >>> *sk, struct sk_buff *skb) >>> */ >>> netlbl_secattr_init(&secattr); >>> >>> - rc = netlbl_skbuff_getattr(skb, sk->sk_family, &secattr); >>> + rc = netlbl_skbuff_getattr(skb, family, &secattr); >>> if (rc == 0) >>> skp = smack_from_secattr(&secattr, ssp); >>> else >>> @@ -3963,7 +3967,7 @@ static int smack_socket_sock_rcv_skb(struct sock >>> *sk, struct sk_buff *skb) >>> #endif >>> #ifdef CONFIG_AUDIT >>> smk_ad_init_net(&ad, __func__, LSM_AUDIT_DATA_NET, &net); >>> - ad.a.u.net->family = sk->sk_family; >>> + ad.a.u.net->family = family; >>> ad.a.u.net->netif = skb->skb_iif; >>> ipv4_skb_to_auditdata(skb, &ad.a, NULL); >>> #endif >>> @@ -3977,7 +3981,7 @@ static int smack_socket_sock_rcv_skb(struct sock >>> *sk, struct sk_buff *skb) >>> rc = smk_bu_note("IPv4 delivery", skp, ssp->smk_in, >>> MAY_WRITE, rc); >>> if (rc != 0) >>> - netlbl_skbuff_err(skb, sk->sk_family, rc, 0); >>> + netlbl_skbuff_err(skb, family, rc, 0); >>> break; >>> #if IS_ENABLED(CONFIG_IPV6) >>> case PF_INET6: >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-security-module" in >> the body of a message to majordomo@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html >> >> >> > -- > To unsubscribe from this list: send the line "unsubscribe linux-security-module" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-security-module" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 07/10/2018 06:16 PM, Casey Schaufler wrote: > On 7/10/2018 8:44 AM, Piotr Sawicki wrote: >> On 07/10/2018 05:21 PM, Casey Schaufler wrote: >>> On 7/10/2018 12:05 AM, Piotr Sawicki wrote: >>>> A socket which has sk_family set to PF_INET6 is able to receive not >>>> only IPv6 but also IPv4 traffic (IPv4-mapped IPv6 addresses). >>>> >>>> Prior to this patch, the smk_skb_to_addr_ipv6() could have been >>>> called for socket buffers containing IPv4 packets, in result such >>>> traffic was allowed. >>>> >>>> Signed-off-by: Piotr Sawicki <p.sawicki2@partner.samsung.com> >>> Looks fine from here. Do you have a simple test case? >> >> Yes, I've tested it on Tizen emulator. >> >> Tests are available here >> https://review.tizen.org/gerrit/#/admin/projects/platform/core/test/security-tests, >> branch nether. > > Can you identify the specific test? There's quite a bit to look through. > Thank you. ID:NETHER_IPV6_IPV4_LOCAL_INTER_APP_CONNECTION:nether_check_ipv6_srv_ipv4_udp_local_inter_app_connection_internet_access_granted ID:NETHER_IPV6_IPV4_LOCAL_INTER_APP_CONNECTION:nether_check_ipv6_srv_ipv4_udp_local_inter_app_connection_internet_access_denied It's a new thing, so tests are still in review: https://review.tizen.org/gerrit/#/c/183458/ To run the tests on the emulator you need to apply also these patches: (Nether) https://review.tizen.org/gerrit/#/c/183464/ and turn on IPv6 connection tracking in the kernel. I've used a kernel downloaded from https://review.tizen.org/gerrit/#/admin/projects/sdk/emulator/emulator-kernel branch tizen. I know that these tests are Tizen specific, and it might be really time consuming to prepare an environment for them. So, I propose to just use the netcat tool and run one of its instances as a UDP server listening on IPv6 address [::] and the second one as a IPV4 client. e.g. server: nc -6 -l -u 20000 client: nc -u 127.0.0.1 20000 In case of TCP connections, access is properly checked in smack_inet_conn_request(). But when IPv4-mapped IPv6 addresses are used and two processes have write access to each other, smack_socket_sock_rcv_skb() will call smk_skb_to_addr_ipv6() function for IPv4 packets. -- To unsubscribe from this list: send the line "unsubscribe linux-security-module" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 7/10/2018 12:05 AM, Piotr Sawicki wrote: > A socket which has sk_family set to PF_INET6 is able to receive not > only IPv6 but also IPv4 traffic (IPv4-mapped IPv6 addresses). > > Prior to this patch, the smk_skb_to_addr_ipv6() could have been > called for socket buffers containing IPv4 packets, in result such > traffic was allowed. > > Signed-off-by: Piotr Sawicki <p.sawicki2@partner.samsung.com> Acked-by: Casey Schaufler <casey@schaufler-ca.com I have added this to git://github.com/cschaufler/next-smack#smack-for-4.19 after doing a little whitespace clean-up and removal of unnecessary braces. > --- > security/smack/smack_lsm.c | 12 ++++++++---- > 1 file changed, 8 insertions(+), 4 deletions(-) > > diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c > index 19de675..1315de4 100644 > --- a/security/smack/smack_lsm.c > +++ b/security/smack/smack_lsm.c > @@ -3924,15 +3924,19 @@ static int smack_socket_sock_rcv_skb(struct sock > *sk, struct sk_buff *skb) > struct smack_known *skp = NULL; > int rc = 0; > struct smk_audit_info ad; > + u16 family = sk->sk_family; > #ifdef CONFIG_AUDIT > struct lsm_network_audit net; > #endif > #if IS_ENABLED(CONFIG_IPV6) > struct sockaddr_in6 sadd; > int proto; > + > + if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP)) > + family = PF_INET; > #endif /* CONFIG_IPV6 */ > > - switch (sk->sk_family) { > + switch (family) { > case PF_INET: > #ifdef CONFIG_SECURITY_SMACK_NETFILTER > /* > @@ -3950,7 +3954,7 @@ static int smack_socket_sock_rcv_skb(struct sock > *sk, struct sk_buff *skb) > */ > netlbl_secattr_init(&secattr); > > - rc = netlbl_skbuff_getattr(skb, sk->sk_family, &secattr); > + rc = netlbl_skbuff_getattr(skb, family, &secattr); > if (rc == 0) > skp = smack_from_secattr(&secattr, ssp); > else > @@ -3963,7 +3967,7 @@ static int smack_socket_sock_rcv_skb(struct sock > *sk, struct sk_buff *skb) > #endif > #ifdef CONFIG_AUDIT > smk_ad_init_net(&ad, __func__, LSM_AUDIT_DATA_NET, &net); > - ad.a.u.net->family = sk->sk_family; > + ad.a.u.net->family = family; > ad.a.u.net->netif = skb->skb_iif; > ipv4_skb_to_auditdata(skb, &ad.a, NULL); > #endif > @@ -3977,7 +3981,7 @@ static int smack_socket_sock_rcv_skb(struct sock > *sk, struct sk_buff *skb) > rc = smk_bu_note("IPv4 delivery", skp, ssp->smk_in, > MAY_WRITE, rc); > if (rc != 0) > - netlbl_skbuff_err(skb, sk->sk_family, rc, 0); > + netlbl_skbuff_err(skb, family, rc, 0); > break; > #if IS_ENABLED(CONFIG_IPV6) > case PF_INET6: -- To unsubscribe from this list: send the line "unsubscribe linux-security-module" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 07/17/2018 01:33 AM, Casey Schaufler wrote: > On 7/10/2018 12:05 AM, Piotr Sawicki wrote: >> A socket which has sk_family set to PF_INET6 is able to receive not >> only IPv6 but also IPv4 traffic (IPv4-mapped IPv6 addresses). >> >> Prior to this patch, the smk_skb_to_addr_ipv6() could have been >> called for socket buffers containing IPv4 packets, in result such >> traffic was allowed. >> >> Signed-off-by: Piotr Sawicki <p.sawicki2@partner.samsung.com> > > Acked-by: Casey Schaufler <casey@schaufler-ca.com > > I have added this to git://github.com/cschaufler/next-smack#smack-for-4.19 > after doing a little whitespace clean-up and removal of unnecessary braces. I see that the wrong version of the patch was applied. It should be a version taken from the email titled "[PATCH RFC] Smack: Fix handling of IPv4 traffic received by PF_INET6 sockets" (10th of July 2018). The family variable should be used also in netlbl_skbuff_getattr(), netlbl_skbuff_err and in audit structure. >> --- >> security/smack/smack_lsm.c | 12 ++++++++---- >> 1 file changed, 8 insertions(+), 4 deletions(-) >> >> diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c >> index 19de675..1315de4 100644 >> --- a/security/smack/smack_lsm.c >> +++ b/security/smack/smack_lsm.c >> @@ -3924,15 +3924,19 @@ static int smack_socket_sock_rcv_skb(struct sock >> *sk, struct sk_buff *skb) >> struct smack_known *skp = NULL; >> int rc = 0; >> struct smk_audit_info ad; >> + u16 family = sk->sk_family; >> #ifdef CONFIG_AUDIT >> struct lsm_network_audit net; >> #endif >> #if IS_ENABLED(CONFIG_IPV6) >> struct sockaddr_in6 sadd; >> int proto; >> + >> + if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP)) >> + family = PF_INET; >> #endif /* CONFIG_IPV6 */ >> >> - switch (sk->sk_family) { >> + switch (family) { >> case PF_INET: >> #ifdef CONFIG_SECURITY_SMACK_NETFILTER >> /* >> @@ -3950,7 +3954,7 @@ static int smack_socket_sock_rcv_skb(struct sock >> *sk, struct sk_buff *skb) >> */ >> netlbl_secattr_init(&secattr); >> >> - rc = netlbl_skbuff_getattr(skb, sk->sk_family, &secattr); >> + rc = netlbl_skbuff_getattr(skb, family, &secattr); >> if (rc == 0) >> skp = smack_from_secattr(&secattr, ssp); >> else >> @@ -3963,7 +3967,7 @@ static int smack_socket_sock_rcv_skb(struct sock >> *sk, struct sk_buff *skb) >> #endif >> #ifdef CONFIG_AUDIT >> smk_ad_init_net(&ad, __func__, LSM_AUDIT_DATA_NET, &net); >> - ad.a.u.net->family = sk->sk_family; >> + ad.a.u.net->family = family; >> ad.a.u.net->netif = skb->skb_iif; >> ipv4_skb_to_auditdata(skb, &ad.a, NULL); >> #endif >> @@ -3977,7 +3981,7 @@ static int smack_socket_sock_rcv_skb(struct sock >> *sk, struct sk_buff *skb) >> rc = smk_bu_note("IPv4 delivery", skp, ssp->smk_in, >> MAY_WRITE, rc); >> if (rc != 0) >> - netlbl_skbuff_err(skb, sk->sk_family, rc, 0); >> + netlbl_skbuff_err(skb, family, rc, 0); >> break; >> #if IS_ENABLED(CONFIG_IPV6) >> case PF_INET6: > > -- > To unsubscribe from this list: send the line "unsubscribe linux-security-module" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > > > -- To unsubscribe from this list: send the line "unsubscribe linux-security-module" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 7/17/2018 3:28 AM, Piotr Sawicki wrote: > > On 07/17/2018 01:33 AM, Casey Schaufler wrote: >> On 7/10/2018 12:05 AM, Piotr Sawicki wrote: >>> A socket which has sk_family set to PF_INET6 is able to receive not >>> only IPv6 but also IPv4 traffic (IPv4-mapped IPv6 addresses). >>> >>> Prior to this patch, the smk_skb_to_addr_ipv6() could have been >>> called for socket buffers containing IPv4 packets, in result such >>> traffic was allowed. >>> >>> Signed-off-by: Piotr Sawicki <p.sawicki2@partner.samsung.com> >> Acked-by: Casey Schaufler <casey@schaufler-ca.com >> >> I have added this to git://github.com/cschaufler/next-smack#smack-for-4.19 >> after doing a little whitespace clean-up and removal of unnecessary braces. > I see that the wrong version of the patch was applied. It should be a > version taken from the email titled "[PATCH RFC] Smack: Fix handling of > IPv4 traffic received by PF_INET6 sockets" (10th of July 2018). The > family variable should be used also in netlbl_skbuff_getattr(), > netlbl_skbuff_err and in audit structure. Please resend the correct version with a "v2". Thank you. > > >>> --- >>> security/smack/smack_lsm.c | 12 ++++++++---- >>> 1 file changed, 8 insertions(+), 4 deletions(-) >>> >>> diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c >>> index 19de675..1315de4 100644 >>> --- a/security/smack/smack_lsm.c >>> +++ b/security/smack/smack_lsm.c >>> @@ -3924,15 +3924,19 @@ static int smack_socket_sock_rcv_skb(struct sock >>> *sk, struct sk_buff *skb) >>> struct smack_known *skp = NULL; >>> int rc = 0; >>> struct smk_audit_info ad; >>> + u16 family = sk->sk_family; >>> #ifdef CONFIG_AUDIT >>> struct lsm_network_audit net; >>> #endif >>> #if IS_ENABLED(CONFIG_IPV6) >>> struct sockaddr_in6 sadd; >>> int proto; >>> + >>> + if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP)) >>> + family = PF_INET; >>> #endif /* CONFIG_IPV6 */ >>> >>> - switch (sk->sk_family) { >>> + switch (family) { >>> case PF_INET: >>> #ifdef CONFIG_SECURITY_SMACK_NETFILTER >>> /* >>> @@ -3950,7 +3954,7 @@ static int smack_socket_sock_rcv_skb(struct sock >>> *sk, struct sk_buff *skb) >>> */ >>> netlbl_secattr_init(&secattr); >>> >>> - rc = netlbl_skbuff_getattr(skb, sk->sk_family, &secattr); >>> + rc = netlbl_skbuff_getattr(skb, family, &secattr); >>> if (rc == 0) >>> skp = smack_from_secattr(&secattr, ssp); >>> else >>> @@ -3963,7 +3967,7 @@ static int smack_socket_sock_rcv_skb(struct sock >>> *sk, struct sk_buff *skb) >>> #endif >>> #ifdef CONFIG_AUDIT >>> smk_ad_init_net(&ad, __func__, LSM_AUDIT_DATA_NET, &net); >>> - ad.a.u.net->family = sk->sk_family; >>> + ad.a.u.net->family = family; >>> ad.a.u.net->netif = skb->skb_iif; >>> ipv4_skb_to_auditdata(skb, &ad.a, NULL); >>> #endif >>> @@ -3977,7 +3981,7 @@ static int smack_socket_sock_rcv_skb(struct sock >>> *sk, struct sk_buff *skb) >>> rc = smk_bu_note("IPv4 delivery", skp, ssp->smk_in, >>> MAY_WRITE, rc); >>> if (rc != 0) >>> - netlbl_skbuff_err(skb, sk->sk_family, rc, 0); >>> + netlbl_skbuff_err(skb, family, rc, 0); >>> break; >>> #if IS_ENABLED(CONFIG_IPV6) >>> case PF_INET6: >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-security-module" in >> the body of a message to majordomo@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html >> >> >> -- To unsubscribe from this list: send the line "unsubscribe linux-security-module" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index 19de675..1315de4 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -3924,15 +3924,19 @@ static int smack_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb) struct smack_known *skp = NULL; int rc = 0; struct smk_audit_info ad; + u16 family = sk->sk_family; #ifdef CONFIG_AUDIT struct lsm_network_audit net; #endif #if IS_ENABLED(CONFIG_IPV6) struct sockaddr_in6 sadd; int proto; + + if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP)) + family = PF_INET; #endif /* CONFIG_IPV6 */ - switch (sk->sk_family) { + switch (family) { case PF_INET: #ifdef CONFIG_SECURITY_SMACK_NETFILTER
A socket which has sk_family set to PF_INET6 is able to receive not only IPv6 but also IPv4 traffic (IPv4-mapped IPv6 addresses). Prior to this patch, the smk_skb_to_addr_ipv6() could have been called for socket buffers containing IPv4 packets, in result such traffic was allowed. Signed-off-by: Piotr Sawicki <p.sawicki2@partner.samsung.com> --- security/smack/smack_lsm.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) /* @@ -3950,7 +3954,7 @@ static int smack_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb) */ netlbl_secattr_init(&secattr); - rc = netlbl_skbuff_getattr(skb, sk->sk_family, &secattr); + rc = netlbl_skbuff_getattr(skb, family, &secattr); if (rc == 0) skp = smack_from_secattr(&secattr, ssp); else @@ -3963,7 +3967,7 @@ static int smack_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb) #endif #ifdef CONFIG_AUDIT smk_ad_init_net(&ad, __func__, LSM_AUDIT_DATA_NET, &net); - ad.a.u.net->family = sk->sk_family; + ad.a.u.net->family = family; ad.a.u.net->netif = skb->skb_iif; ipv4_skb_to_auditdata(skb, &ad.a, NULL); #endif @@ -3977,7 +3981,7 @@ static int smack_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb) rc = smk_bu_note("IPv4 delivery", skp, ssp->smk_in, MAY_WRITE, rc); if (rc != 0) - netlbl_skbuff_err(skb, sk->sk_family, rc, 0); + netlbl_skbuff_err(skb, family, rc, 0); break; #if IS_ENABLED(CONFIG_IPV6) case PF_INET6: