ACK: [Z/Y/X/T SRU] Fix CVE-2017-9242

Colin Ian King colin.king at canonical.com
Wed Jun 7 10:56:37 UTC 2017


On 07/06/17 11:52, Stefan Bader wrote:
> Patch applies as cherry-pick to all releases. Build-tested on Trusty
> amd64.
> 
> -Stefan
> 
> ---
> 
> From 232cd35d0804cc241eb887bb8d4d9b3b9881c64a Mon Sep 17 00:00:00 2001
> From: Eric Dumazet <edumazet at google.com>
> Date: Fri, 19 May 2017 14:17:48 -0700
> Subject: [PATCH] ipv6: fix out of bound writes in __ip6_append_data()
> 
> Andrey Konovalov and idaifish at gmail.com reported crashes caused by
> one skb shared_info being overwritten from __ip6_append_data()
> 
> Andrey program lead to following state :
> 
> copy -4200 datalen 2000 fraglen 2040
> maxfraglen 2040 alloclen 2048 transhdrlen 0 offset 0 fraggap 6200
> 
> The skb_copy_and_csum_bits(skb_prev, maxfraglen, data + transhdrlen,
> fraggap, 0); is overwriting skb->head and skb_shared_info
> 
> Since we apparently detect this rare condition too late, move the
> code earlier to even avoid allocating skb and risking crashes.
> 
> Once again, many thanks to Andrey and syzkaller team.
> 
> Signed-off-by: Eric Dumazet <edumazet at google.com>
> Reported-by: Andrey Konovalov <andreyknvl at google.com>
> Tested-by: Andrey Konovalov <andreyknvl at google.com>
> Reported-by: <idaifish at gmail.com>
> Signed-off-by: David S. Miller <davem at davemloft.net>
> 
> CVE-2017-9242
> 
> (cherry-picked from  232cd35d0804cc241eb887bb8d4d9b3b9881c64a)
> Signed-off-by: Stefan Bader <stefan.bader at canonical.com>
> ---
>  net/ipv6/ip6_output.c | 15 ++++++++-------
>  1 file changed, 8 insertions(+), 7 deletions(-)
> 
> diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
> index d4a31be..bf8a58a 100644
> --- a/net/ipv6/ip6_output.c
> +++ b/net/ipv6/ip6_output.c
> @@ -1466,6 +1466,11 @@ static int __ip6_append_data(struct sock *sk,
>  			 */
>  			alloclen += sizeof(struct frag_hdr);
>  
> +			copy = datalen - transhdrlen - fraggap;
> +			if (copy < 0) {
> +				err = -EINVAL;
> +				goto error;
> +			}
>  			if (transhdrlen) {
>  				skb = sock_alloc_send_skb(sk,
>  						alloclen + hh_len,
> @@ -1515,13 +1520,9 @@ static int __ip6_append_data(struct sock *sk,
>  				data += fraggap;
>  				pskb_trim_unique(skb_prev, maxfraglen);
>  			}
> -			copy = datalen - transhdrlen - fraggap;
> -
> -			if (copy < 0) {
> -				err = -EINVAL;
> -				kfree_skb(skb);
> -				goto error;
> -			} else if (copy > 0 && getfrag(from, data + transhdrlen, offset, copy, fraggap, skb) < 0) {
> +			if (copy > 0 &&
> +			    getfrag(from, data + transhdrlen, offset,
> +				    copy, fraggap, skb) < 0) {
>  				err = -EFAULT;
>  				kfree_skb(skb);
>  				goto error;
> 
Clean cherry pick, looks good to me. Thanks Stefan

Acked-by: Colin Ian King <colin.king at canonical.com>




More information about the kernel-team mailing list