Blame 0103-qcow1-Validate-L2-table-size-CVE-2014-0222.patch

12cd54
From 71ae37ec9806ab76afcdb40cf5f080af378848ac Mon Sep 17 00:00:00 2001
12cd54
From: Kevin Wolf <kwolf@redhat.com>
12cd54
Date: Thu, 15 May 2014 16:10:11 +0200
12cd54
Subject: [PATCH] qcow1: Validate L2 table size (CVE-2014-0222)
12cd54
12cd54
Too large L2 table sizes cause unbounded allocations. Images actually
12cd54
created by qemu-img only have 512 byte or 4k L2 tables.
12cd54
12cd54
To keep things consistent with cluster sizes, allow ranges between 512
12cd54
bytes and 64k (in fact, down to 1 entry = 8 bytes is technically
12cd54
working, but L2 table sizes smaller than a cluster don't make a lot of
12cd54
sense).
12cd54
12cd54
This also means that the number of bytes on the virtual disk that are
12cd54
described by the same L2 table is limited to at most 8k * 64k or 2^29,
12cd54
preventively avoiding any integer overflows.
12cd54
12cd54
Cc: qemu-stable@nongnu.org
12cd54
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
12cd54
Reviewed-by: Benoit Canet <benoit@irqsave.net>
12cd54
(cherry picked from commit 42eb58179b3b215bb507da3262b682b8a2ec10b5)
12cd54
12cd54
Conflicts:
12cd54
	tests/qemu-iotests/092
12cd54
	tests/qemu-iotests/092.out
12cd54
---
12cd54
 block/qcow.c | 8 ++++++++
12cd54
 1 file changed, 8 insertions(+)
12cd54
12cd54
diff --git a/block/qcow.c b/block/qcow.c
12cd54
index 26bb923..8718ca5 100644
12cd54
--- a/block/qcow.c
12cd54
+++ b/block/qcow.c
12cd54
@@ -138,6 +138,14 @@ static int qcow_open(BlockDriverState *bs, QDict *options, int flags,
12cd54
         goto fail;
12cd54
     }
12cd54
 
12cd54
+    /* l2_bits specifies number of entries; storing a uint64_t in each entry,
12cd54
+     * so bytes = num_entries << 3. */
12cd54
+    if (header.l2_bits < 9 - 3 || header.l2_bits > 16 - 3) {
12cd54
+        error_setg(errp, "L2 table size must be between 512 and 64k");
12cd54
+        ret = -EINVAL;
12cd54
+        goto fail;
12cd54
+    }
12cd54
+
12cd54
     if (header.crypt_method > QCOW_CRYPT_AES) {
12cd54
         error_setg(errp, "invalid encryption method in qcow header");
12cd54
         ret = -EINVAL;