|
|
05ad79 |
From 55540ea3dfdc707dc998333fd0715549522464fb Mon Sep 17 00:00:00 2001
|
|
|
05ad79 |
From: Sebastian Krahmer <krahmer@suse.de>
|
|
|
05ad79 |
Date: Fri, 5 Dec 2014 10:06:42 +0100
|
|
|
05ad79 |
Subject: [PATCH 095/116] libblkid: fix potential bufer overflows
|
|
|
05ad79 |
|
|
|
05ad79 |
While digging deeper into libblk probing, I found that some
|
|
|
05ad79 |
computations might wrap and allocate too few buffer space which then
|
|
|
05ad79 |
overflows. In particular on 32bit systems (chromebook) where size_t is
|
|
|
05ad79 |
32bit, this is problematic (for 64bit the result fits into the calloc
|
|
|
05ad79 |
size_t).
|
|
|
05ad79 |
|
|
|
05ad79 |
Upstream: Upstream: https://github.com/karelzak/util-linux/commit/109df14fad4e9570e26950913ebace6c79289400
|
|
|
05ad79 |
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1392656
|
|
|
05ad79 |
Signed-off-by: Karel Zak <kzak@redhat.com>
|
|
|
05ad79 |
---
|
|
|
05ad79 |
libblkid/src/partitions/gpt.c | 12 ++++++++----
|
|
|
05ad79 |
libblkid/src/probe.c | 7 +++++++
|
|
|
05ad79 |
libblkid/src/superblocks/zfs.c | 3 +++
|
|
|
05ad79 |
3 files changed, 18 insertions(+), 4 deletions(-)
|
|
|
05ad79 |
|
|
|
05ad79 |
diff --git a/libblkid/src/partitions/gpt.c b/libblkid/src/partitions/gpt.c
|
|
|
05ad79 |
index 6ab0dc6..e801ea3 100644
|
|
|
05ad79 |
--- a/libblkid/src/partitions/gpt.c
|
|
|
05ad79 |
+++ b/libblkid/src/partitions/gpt.c
|
|
|
05ad79 |
@@ -17,6 +17,7 @@
|
|
|
05ad79 |
#include <stdlib.h>
|
|
|
05ad79 |
#include <stdint.h>
|
|
|
05ad79 |
#include <stddef.h>
|
|
|
05ad79 |
+#include <limits.h>
|
|
|
05ad79 |
|
|
|
05ad79 |
#include "partitions.h"
|
|
|
05ad79 |
#include "crc32.h"
|
|
|
05ad79 |
@@ -266,14 +267,17 @@ static struct gpt_header *get_gpt_header(
|
|
|
05ad79 |
return NULL;
|
|
|
05ad79 |
}
|
|
|
05ad79 |
|
|
|
05ad79 |
- /* Size of blocks with GPT entries */
|
|
|
05ad79 |
- esz = le32_to_cpu(h->num_partition_entries) *
|
|
|
05ad79 |
- le32_to_cpu(h->sizeof_partition_entry);
|
|
|
05ad79 |
- if (!esz) {
|
|
|
05ad79 |
+ if (le32_to_cpu(h->num_partition_entries) == 0 ||
|
|
|
05ad79 |
+ le32_to_cpu(h->sizeof_partition_entry) == 0 ||
|
|
|
05ad79 |
+ ULONG_MAX / le32_to_cpu(h->num_partition_entries) < le32_to_cpu(h->sizeof_partition_entry)) {
|
|
|
05ad79 |
DBG(LOWPROBE, blkid_debug("GPT entries undefined"));
|
|
|
05ad79 |
return NULL;
|
|
|
05ad79 |
}
|
|
|
05ad79 |
|
|
|
05ad79 |
+ /* Size of blocks with GPT entries */
|
|
|
05ad79 |
+ esz = le32_to_cpu(h->num_partition_entries) *
|
|
|
05ad79 |
+ le32_to_cpu(h->sizeof_partition_entry);
|
|
|
05ad79 |
+
|
|
|
05ad79 |
/* The header seems valid, save it
|
|
|
05ad79 |
* (we don't care about zeros in hdr->reserved2 area) */
|
|
|
05ad79 |
memcpy(hdr, h, sizeof(*h));
|
|
|
05ad79 |
diff --git a/libblkid/src/probe.c b/libblkid/src/probe.c
|
|
|
05ad79 |
index f9fab5b..9cf099a 100644
|
|
|
05ad79 |
--- a/libblkid/src/probe.c
|
|
|
05ad79 |
+++ b/libblkid/src/probe.c
|
|
|
05ad79 |
@@ -103,6 +103,7 @@
|
|
|
05ad79 |
#include <inttypes.h>
|
|
|
05ad79 |
#include <stdint.h>
|
|
|
05ad79 |
#include <stdarg.h>
|
|
|
05ad79 |
+#include <limits.h>
|
|
|
05ad79 |
|
|
|
05ad79 |
#ifdef HAVE_LIBUUID
|
|
|
05ad79 |
# include <uuid.h>
|
|
|
05ad79 |
@@ -565,6 +566,12 @@ unsigned char *blkid_probe_get_buffer(blkid_probe pr,
|
|
|
05ad79 |
return NULL;
|
|
|
05ad79 |
}
|
|
|
05ad79 |
|
|
|
05ad79 |
+ /* someone trying to overflow some buffers? */
|
|
|
05ad79 |
+ if (len > ULONG_MAX - sizeof(struct blkid_bufinfo)) {
|
|
|
05ad79 |
+ errno = ENOMEM;
|
|
|
05ad79 |
+ return NULL;
|
|
|
05ad79 |
+ }
|
|
|
05ad79 |
+
|
|
|
05ad79 |
/* allocate info and space for data by why call */
|
|
|
05ad79 |
bf = calloc(1, sizeof(struct blkid_bufinfo) + len);
|
|
|
05ad79 |
if (!bf) {
|
|
|
05ad79 |
diff --git a/libblkid/src/superblocks/zfs.c b/libblkid/src/superblocks/zfs.c
|
|
|
05ad79 |
index 406ba2b..56ee472 100644
|
|
|
05ad79 |
--- a/libblkid/src/superblocks/zfs.c
|
|
|
05ad79 |
+++ b/libblkid/src/superblocks/zfs.c
|
|
|
05ad79 |
@@ -12,6 +12,7 @@
|
|
|
05ad79 |
#include <errno.h>
|
|
|
05ad79 |
#include <ctype.h>
|
|
|
05ad79 |
#include <inttypes.h>
|
|
|
05ad79 |
+#include <limits.h>
|
|
|
05ad79 |
|
|
|
05ad79 |
#include "superblocks.h"
|
|
|
05ad79 |
|
|
|
05ad79 |
@@ -108,6 +109,8 @@ static void zfs_extract_guid_name(blkid_probe pr, loff_t offset)
|
|
|
05ad79 |
|
|
|
05ad79 |
nvs->nvs_type = be32_to_cpu(nvs->nvs_type);
|
|
|
05ad79 |
nvs->nvs_strlen = be32_to_cpu(nvs->nvs_strlen);
|
|
|
05ad79 |
+ if (nvs->nvs_strlen > UINT_MAX - sizeof(*nvs))
|
|
|
05ad79 |
+ break;
|
|
|
05ad79 |
avail -= nvs->nvs_strlen + sizeof(*nvs);
|
|
|
05ad79 |
nvdebug("nvstring: type %u string %*s\n", nvs->nvs_type,
|
|
|
05ad79 |
nvs->nvs_strlen, nvs->nvs_string);
|
|
|
05ad79 |
--
|
|
|
05ad79 |
2.9.3
|
|
|
05ad79 |
|