1. 25 Jun, 2019 36 commits
  2. 11 Jun, 2019 2 commits
  3. 05 Jun, 2019 2 commits
    • Eric Dumazet's avatar
      UBUNTU: SAUCE: tcp: tcp_fragment() should apply sane memory limits · 9094a474
      Eric Dumazet authored
      Jonathan Looney reported that a malicious peer can force a sender
      to fragment its retransmit queue into tiny skbs, inflating memory
      usage and/or overflow 32bit counters.
      
      TCP allows an application to queue up to sk_sndbuf bytes,
      so we need to give some allowance for non malicious splitting
      of retransmit queue.
      
      A new SNMP counter is added to monitor how many times TCP
      did not allow to split an skb if the allowance was exceeded.
      Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
      Reported-by: default avatarJonathan Looney <jtl@netflix.com>
      Cc: Bruce Curtis <brucec@netflix.com>
      Cc: Neal Cardwell <ncardwell@google.com>
      CC: Yuchung Cheng <ycheng@google.com>
      
      BugLink: https://bugs.launchpad.net/bugs/1831638 (Remote denial of service (resource exhaustion) caused by TCP SACK scoreboard manipulation (LP: #1831638))
      
      [tyhicks: Adjust context of SNMP enums]
      Signed-off-by: default avatarTyler Hicks <tyhicks@canonical.com>
      Signed-off-by: default avatarStefan Bader <stefan.bader@canonical.com>
      9094a474
    • 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