]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.14-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 5 Oct 2020 13:44:06 +0000 (15:44 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 5 Oct 2020 13:44:06 +0000 (15:44 +0200)
added patches:
net-packet-fix-overflow-in-tpacket_rcv.patch

queue-4.14/net-packet-fix-overflow-in-tpacket_rcv.patch [new file with mode: 0644]
queue-4.14/series

diff --git a/queue-4.14/net-packet-fix-overflow-in-tpacket_rcv.patch b/queue-4.14/net-packet-fix-overflow-in-tpacket_rcv.patch
new file mode 100644 (file)
index 0000000..0afb2e4
--- /dev/null
@@ -0,0 +1,61 @@
+From acf69c946233259ab4d64f8869d4037a198c7f06 Mon Sep 17 00:00:00 2001
+From: Or Cohen <orcohen@paloaltonetworks.com>
+Date: Thu, 3 Sep 2020 21:05:28 -0700
+Subject: net/packet: fix overflow in tpacket_rcv
+
+From: Or Cohen <orcohen@paloaltonetworks.com>
+
+commit acf69c946233259ab4d64f8869d4037a198c7f06 upstream.
+
+Using tp_reserve to calculate netoff can overflow as
+tp_reserve is unsigned int and netoff is unsigned short.
+
+This may lead to macoff receving a smaller value then
+sizeof(struct virtio_net_hdr), and if po->has_vnet_hdr
+is set, an out-of-bounds write will occur when
+calling virtio_net_hdr_from_skb.
+
+The bug is fixed by converting netoff to unsigned int
+and checking if it exceeds USHRT_MAX.
+
+This addresses CVE-2020-14386
+
+Fixes: 8913336a7e8d ("packet: add PACKET_RESERVE sockopt")
+Signed-off-by: Or Cohen <orcohen@paloaltonetworks.com>
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+[ snu: backported to pre-5.3, changed tp_drops counting/locking ]
+Signed-off-by: Stefan Nuernberger <snu@amazon.com>
+CC: David Woodhouse <dwmw@amazon.co.uk>
+CC: Amit Shah <aams@amazon.com>
+CC: stable@vger.kernel.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/packet/af_packet.c |    9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+--- a/net/packet/af_packet.c
++++ b/net/packet/af_packet.c
+@@ -2201,7 +2201,8 @@ static int tpacket_rcv(struct sk_buff *s
+       int skb_len = skb->len;
+       unsigned int snaplen, res;
+       unsigned long status = TP_STATUS_USER;
+-      unsigned short macoff, netoff, hdrlen;
++      unsigned short macoff, hdrlen;
++      unsigned int netoff;
+       struct sk_buff *copy_skb = NULL;
+       struct timespec ts;
+       __u32 ts_status;
+@@ -2264,6 +2265,12 @@ static int tpacket_rcv(struct sk_buff *s
+               }
+               macoff = netoff - maclen;
+       }
++      if (netoff > USHRT_MAX) {
++              spin_lock(&sk->sk_receive_queue.lock);
++              po->stats.stats1.tp_drops++;
++              spin_unlock(&sk->sk_receive_queue.lock);
++              goto drop_n_restore;
++      }
+       if (po->tp_version <= TPACKET_V2) {
+               if (macoff + snaplen > po->rx_ring.frame_size) {
+                       if (po->copy_thresh &&
index 7a36f5f20341ef403109288992b42ee5b86aa670..896c60a0da29aac404838b3ff7aff9172f44565c 100644 (file)
@@ -22,3 +22,4 @@ iommu-exynos-add-missing-put_device-call-in-exynos_i.patch
 i2c-cpm-fix-i2c_ram-structure.patch
 input-trackpoint-enable-synaptics-trackpoints.patch
 random32-restore-__latent_entropy-attribute-on-net_r.patch
+net-packet-fix-overflow-in-tpacket_rcv.patch