Blame SOURCES/kvm-nbd-server-CVE-2017-15119-Reject-options-larger-than.patch

9bac43
From 0ce164b7410c1c4a75eefaef48896ee245eeba5c Mon Sep 17 00:00:00 2001
9bac43
From: Eric Blake <eblake@redhat.com>
9bac43
Date: Wed, 13 Dec 2017 18:17:29 +0100
9bac43
Subject: [PATCH 4/6] nbd/server: CVE-2017-15119 Reject options larger than 32M
9bac43
9bac43
RH-Author: Eric Blake <eblake@redhat.com>
9bac43
Message-id: <20171213181730.1278-2-eblake@redhat.com>
9bac43
Patchwork-id: 78394
9bac43
O-Subject: [RHEV-7.5 qemu-kvm-rhev PATCH 1/2] nbd/server: CVE-2017-15119 Reject options larger than 32M
9bac43
Bugzilla: 1518529 1518551
9bac43
CVE: CVE-2017-15119/20171128
9bac43
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
9bac43
RH-Acked-by: John Snow <jsnow@redhat.com>
9bac43
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
9bac43
9bac43
The NBD spec gives us permission to abruptly disconnect on clients
9bac43
that send outrageously large option requests, rather than having
9bac43
to spend the time reading to the end of the option.  No real
9bac43
option request requires that much data anyways; and meanwhile, we
9bac43
already have the practice of abruptly dropping the connection on
9bac43
any client that sends NBD_CMD_WRITE with a payload larger than 32M.
9bac43
9bac43
For comparison, nbdkit drops the connection on any request with
9bac43
more than 4096 bytes; however, that limit is probably too low
9bac43
(as the NBD spec states an export name can theoretically be up
9bac43
to 4096 bytes, which means a valid NBD_OPT_INFO could be even
9bac43
longer) - even if qemu doesn't permit exports longer than 256
9bac43
bytes.
9bac43
9bac43
It could be argued that a malicious client trying to get us to
9bac43
read nearly 4G of data on a bad request is a form of denial of
9bac43
service.  In particular, if the server requires TLS, but a client
9bac43
that does not know the TLS credentials sends any option (other
9bac43
than NBD_OPT_STARTTLS or NBD_OPT_EXPORT_NAME) with a stated
9bac43
payload of nearly 4G, then the server was keeping the connection
9bac43
alive trying to read all the payload, tying up resources that it
9bac43
would rather be spending on a client that can get past the TLS
9bac43
handshake.  Hence, this warranted a CVE.
9bac43
9bac43
Present since at least 2.5 when handling known options, and made
9bac43
worse in 2.6 when fixing support for NBD_FLAG_C_FIXED_NEWSTYLE
9bac43
to handle unknown options.
9bac43
9bac43
CC: qemu-stable@nongnu.org
9bac43
Signed-off-by: Eric Blake <eblake@redhat.com>
9bac43
(cherry picked from commit fdad35ef6c5839d50dfc14073364ac893afebc30)
9bac43
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
9bac43
---
9bac43
 nbd/server.c | 6 ++++++
9bac43
 1 file changed, 6 insertions(+)
9bac43
9bac43
diff --git a/nbd/server.c b/nbd/server.c
9bac43
index 993ade3..b93cb88 100644
9bac43
--- a/nbd/server.c
9bac43
+++ b/nbd/server.c
9bac43
@@ -661,6 +661,12 @@ static int nbd_negotiate_options(NBDClient *client, uint16_t myflags,
9bac43
         }
9bac43
         length = be32_to_cpu(length);
9bac43
 
9bac43
+        if (length > NBD_MAX_BUFFER_SIZE) {
9bac43
+            error_setg(errp, "len (%" PRIu32" ) is larger than max len (%u)",
9bac43
+                       length, NBD_MAX_BUFFER_SIZE);
9bac43
+            return -EINVAL;
9bac43
+        }
9bac43
+
9bac43
         trace_nbd_negotiate_options_check_option(option,
9bac43
                                                  nbd_opt_lookup(option));
9bac43
         if (client->tlscreds &&
9bac43
-- 
9bac43
1.8.3.1
9bac43