fixes an assertion failure in qemu network packet processing, which can lead to DOS'ing the qemu process on the host. this affects 'e1000e' and 'vmxnet3' network devices. patch is cherry-picked from the commit mentioned in the oss-security email. more info on oss-security [0] [0]: https://www.openwall.com/lists/oss-security/2020/08/10/1 Signed-off-by: Oguz Bektas <o.bektas@proxmox.com>
		
			
				
	
	
		
			43 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 | 
						|
From: Mauro Matteo Cascella <mcascell@redhat.com>
 | 
						|
Date: Sat, 1 Aug 2020 18:42:38 +0200
 | 
						|
Subject: [PATCH] hw/net/net_tx_pkt: fix assertion failure in
 | 
						|
 net_tx_pkt_add_raw_fragment()
 | 
						|
 | 
						|
An assertion failure issue was found in the code that processes network packets
 | 
						|
while adding data fragments into the packet context. It could be abused by a
 | 
						|
malicious guest to abort the QEMU process on the host. This patch replaces the
 | 
						|
affected assert() with a conditional statement, returning false if the current
 | 
						|
data fragment exceeds max_raw_frags.
 | 
						|
 | 
						|
Reported-by: Alexander Bulekov <alxndr@bu.edu>
 | 
						|
Reported-by: Ziming Zhang <ezrakiez@gmail.com>
 | 
						|
Reviewed-by: Dmitry Fleytman <dmitry.fleytman@gmail.com>
 | 
						|
Signed-off-by: Mauro Matteo Cascella <mcascell@redhat.com>
 | 
						|
Signed-off-by: Jason Wang <jasowang@redhat.com>
 | 
						|
(cherry picked from commit 035e69b063835a5fd23cacabd63690a3d84532a8)
 | 
						|
Signed-off-by: Oguz Bektas <o.bektas@proxmox.com>
 | 
						|
---
 | 
						|
 hw/net/net_tx_pkt.c | 5 ++++-
 | 
						|
 1 file changed, 4 insertions(+), 1 deletion(-)
 | 
						|
 | 
						|
diff --git a/hw/net/net_tx_pkt.c b/hw/net/net_tx_pkt.c
 | 
						|
index 162f802dd7..54d4c3bbd0 100644
 | 
						|
--- a/hw/net/net_tx_pkt.c
 | 
						|
+++ b/hw/net/net_tx_pkt.c
 | 
						|
@@ -379,7 +379,10 @@ bool net_tx_pkt_add_raw_fragment(struct NetTxPkt *pkt, hwaddr pa,
 | 
						|
     hwaddr mapped_len = 0;
 | 
						|
     struct iovec *ventry;
 | 
						|
     assert(pkt);
 | 
						|
-    assert(pkt->max_raw_frags > pkt->raw_frags);
 | 
						|
+
 | 
						|
+    if (pkt->raw_frags >= pkt->max_raw_frags) {
 | 
						|
+        return false;
 | 
						|
+    }
 | 
						|
 
 | 
						|
     if (!len) {
 | 
						|
         return true;
 | 
						|
-- 
 | 
						|
2.20.1
 | 
						|
 |