1. 17 Sep, 2019 3 commits
  2. 13 Sep, 2019 3 commits
  3. 27 Aug, 2019 5 commits
  4. 13 Aug, 2019 26 commits
  5. 12 Aug, 2019 3 commits
    • Jason Wang's avatar
      vhost: scsi: add weight support · 19402747
      Jason Wang authored
      This patch will check the weight and exit the loop if we exceeds the
      weight. This is useful for preventing scsi kthread from hogging cpu
      which is guest triggerable.
      
      This addresses CVE-2019-3900.
      
      Cc: Paolo Bonzini <pbonzini@redhat.com>
      Cc: Stefan Hajnoczi <stefanha@redhat.com>
      Fixes: 057cbf49 ("tcm_vhost: Initial merge for vhost level target fabric driver")
      Signed-off-by: default avatarJason Wang <jasowang@redhat.com>
      Reviewed-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
      Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
      Reviewed-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
      
      CVE-2019-3900
      
      (backported from commit c1ea02f1)
      [tyhicks: Backport to Xenial:
       - Minor context adjustment in local variables
       - Adjust context around the loop in vhost_scsi_handle_vq()
       - No need to modify vhost_scsi_ctl_handle_vq() since it was added later
         in commit 0d02dbd6 ("vhost/scsi: Respond to control queue
         operations")]
      Signed-off-by: default avatarTyler Hicks <tyhicks@canonical.com>
      Acked-by: default avatarStefan Bader <stefan.bader@canonical.com>
      Acked-by: default avatarConnor Kuehl <connor.kuehl@canonical.com>
      Signed-off-by: default avatarKhalid Elmously <khalid.elmously@canonical.com>
      19402747
    • Jason Wang's avatar
      vhost_net: fix possible infinite loop · 5479b12b
      Jason Wang authored
      When the rx buffer is too small for a packet, we will discard the vq
      descriptor and retry it for the next packet:
      
      while ((sock_len = vhost_net_rx_peek_head_len(net, sock->sk,
      					      &busyloop_intr))) {
      ...
      	/* On overrun, truncate and discard */
      	if (unlikely(headcount > UIO_MAXIOV)) {
      		iov_iter_init(&msg.msg_iter, READ, vq->iov, 1, 1);
      		err = sock->ops->recvmsg(sock, &msg,
      					 1, MSG_DONTWAIT | MSG_TRUNC);
      		pr_debug("Discarded rx packet: len %zd\n", sock_len);
      		continue;
      	}
      ...
      }
      
      This makes it possible to trigger a infinite while..continue loop
      through the co-opreation of two VMs like:
      
      1) Malicious VM1 allocate 1 byte rx buffer and try to slow down the
         vhost process as much as possible e.g using indirect descriptors or
         other.
      2) Malicious VM2 generate packets to VM1 as fast as possible
      
      Fixing this by checking against weight at the end of RX and TX
      loop. This also eliminate other similar cases when:
      
      - userspace is consuming the packets in the meanwhile
      - theoretical TOCTOU attack if guest moving avail index back and forth
        to hit the continue after vhost find guest just add new buffers
      
      This addresses CVE-2019-3900.
      
      Fixes: d8316f39 ("vhost: fix total length when packets are too short")
      Fixes: 3a4d5c94 ("vhost_net: a kernel-level virtio server")
      Signed-off-by: default avatarJason Wang <jasowang@redhat.com>
      Reviewed-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
      Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
      
      CVE-2019-3900
      
      (backported from commit e2412c07)
      [tyhicks: Backport to Xenial:
       - Adjust handle_tx() instead of handle_tx_{copy,zerocopy}() due to
         missing commit 0d20bdf3 ("vhost_net: split out datacopy logic")
       - Minor context adjustments due to a lack of missing the iov_limit
         member of the vhost_dev struct which was added later in commit
         b46a0bf7 ("vhost: fix OOB in get_rx_bufs()")
       - handle_rx() still uses peek_head_len() due to missing and unneeded commit
         03088137 ("vhost_net: basic polling support")
       - Context adjustment in call to vhost_log_write() in hunk #3 of net.c due to
         missing and unneeded commit cc5e7107 ("vhost: log dirty page correctly")
       - Context adjustment in hunk #4 due to using break instead of goto out
       - Context adjustment in hunk #5 due to missing and unneeded commit
         c67df11f ("vhost_net: try batch dequing from skb array")]
      Signed-off-by: default avatarTyler Hicks <tyhicks@canonical.com>
      Acked-by: default avatarStefan Bader <stefan.bader@canonical.com>
      Acked-by: default avatarConnor Kuehl <connor.kuehl@canonical.com>
      Signed-off-by: default avatarKhalid Elmously <khalid.elmously@canonical.com>
      5479b12b
    • Jason Wang's avatar
      vhost: introduce vhost_exceeds_weight() · 1801314e
      Jason Wang authored
      We used to have vhost_exceeds_weight() for vhost-net to:
      
      - prevent vhost kthread from hogging the cpu
      - balance the time spent between TX and RX
      
      This function could be useful for vsock and scsi as well. So move it
      to vhost.c. Device must specify a weight which counts the number of
      requests, or it can also specific a byte_weight which counts the
      number of bytes that has been processed.
      Signed-off-by: default avatarJason Wang <jasowang@redhat.com>
      Reviewed-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
      Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
      
      CVE-2019-3900
      
      (backported from commit e82b9b07)
      [tyhicks: Backport to Xenial:
       - Adjust handle_tx() instead of handle_tx_{copy,zerocopy}() due to
         missing commit 0d20bdf3 ("vhost_net: split out datacopy logic")
       - Considerable context adjustments throughout the patch due to a lack
         of missing the iov_limit member of the vhost_dev struct which was
         added later in commit b46a0bf7 ("vhost: fix OOB in get_rx_bufs()")
       - Context adjustment in call to vhost_log_write() in hunk #3 of net.c due to
         missing and unneeded commit cc5e7107 ("vhost: log dirty page correctly")
       - Context adjustment in hunk #3 of net.c due to using break instead of goto
         out
       - Context adjustment in hunk #4 of net.c due to missing and unneeded commit
         c67df11f ("vhost_net: try batch dequing from skb array")
       - Don't patch vsock.c since Xenial doesn't have vhost vsock support
       - Adjust context in vhost_dev_init() to account for different local variables
       - Adjust context in struct vhost_dev to account for different struct members]
      Signed-off-by: default avatarTyler Hicks <tyhicks@canonical.com>
      Acked-by: default avatarStefan Bader <stefan.bader@canonical.com>
      Acked-by: default avatarConnor Kuehl <connor.kuehl@canonical.com>
      Signed-off-by: default avatarKhalid Elmously <khalid.elmously@canonical.com>
      1801314e