• Eric Dumazet's avatar
    UBUNTU: SAUCE: tcp: limit payload size of sacked skbs · db455250
    Eric Dumazet authored
    Jonathan Looney reported that TCP can trigger the following crash
    in tcp_shifted_skb() :
    
    	BUG_ON(tcp_skb_pcount(skb) < pcount);
    
    This can happen if the remote peer has advertized the smallest
    MSS that linux TCP accepts : 48
    
    An skb can hold 17 fragments, and each fragment can hold 32KB
    on x86, or 64KB on PowerPC.
    
    This means that the 16bit witdh of TCP_SKB_CB(skb)->tcp_gso_segs
    can overflow.
    
    Note that tcp_sendmsg() builds skbs with less than 64KB
    of payload, so this problem needs SACK to be enabled.
    SACK blocks allow TCP to coalesce multiple skbs in the retransmit
    queue, thus filling the 17 fragments to maximal capacity.
    
    Fixes: 832d11c5 ("tcp: Try to restore large SKBs while SACK processing")
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Reported-by: default avatarJonathan Looney <jtl@netflix.com>
    Acked-by: default avatarNeal Cardwell <ncardwell@google.com>
    Cc: Yuchung Cheng <ycheng@google.com>
    Cc: Bruce Curtis <brucec@netflix.com>
    
    BugLink: https://bugs.launchpad.net/bugs/1831637 (Remote denial of service (system crash) caused by integer overflow in TCP SACK handling (LP: #1831637))
    
    [tyhicks: Backport to Xenial:
     - Adjust context in linux/tcp.h and tcp.c
     - tcp_shifted_skb() doesn't take the prev skb as a parameter
     - tcp_collapse_retrans() doesn't do frag shifting since commit
       f8071cde ("tcp: enhance tcp_collapse_retrans() with skb_shift()")
       isn't present so no changes are needed to that function]
    Signed-off-by: default avatarTyler Hicks <tyhicks@canonical.com>
    Signed-off-by: default avatarStefan Bader <stefan.bader@canonical.com>
    db455250
tcp.h 54.3 KB