aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPochang Chen <johnchen902@gmail.com>2018-08-16 15:24:24 -0400
committerAndreas K. Hüttel <dilfridge@gentoo.org>2018-12-11 23:33:03 +0100
commit1b91bfec99824b33ab6990a5a881a72643ff051f (patch)
treeaaef771222552167b25ed5f1b002b7dc41c0a926
parentUpdate syscall-names.list for Linux 4.18. (diff)
downloadglibc-1b91bfec99824b33ab6990a5a881a72643ff051f.tar.gz
glibc-1b91bfec99824b33ab6990a5a881a72643ff051f.tar.bz2
glibc-1b91bfec99824b33ab6990a5a881a72643ff051f.zip
malloc: Verify size of top chunk.
The House of Force is a well-known technique to exploit heap overflow. In essence, this exploit takes three steps: 1. Overwrite the size of top chunk with very large value (e.g. -1). 2. Request x bytes from top chunk. As the size of top chunk is corrupted, x can be arbitrarily large and top chunk will still be offset by x. 3. The next allocation from top chunk will thus be controllable. If we verify the size of top chunk at step 2, we can stop such attack. (cherry picked from commit 30a17d8c95fbfb15c52d1115803b63aaa73a285c) (cherry picked from commit 510a25f2d208e3b0c86f54b053f61c5b647e4b9b) Signed-off-by: Andreas K. Hüttel <dilfridge@gentoo.org>
-rw-r--r--ChangeLog4
-rw-r--r--malloc/malloc.c3
2 files changed, 7 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 88814e6947..44795b2e61 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2018-08-16 Pochang Chen <johnchen902@gmail.com>
+
+ * malloc/malloc.c (_int_malloc.c): Verify size of top chunk.
+
2018-08-13 Joseph Myers <joseph@codesourcery.com>
* sysdeps/unix/sysv/linux/syscall-names.list: Update kernel
diff --git a/malloc/malloc.c b/malloc/malloc.c
index e247c77b7d..9431108626 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -4076,6 +4076,9 @@ _int_malloc (mstate av, size_t bytes)
victim = av->top;
size = chunksize (victim);
+ if (__glibc_unlikely (size > av->system_mem))
+ malloc_printerr ("malloc(): corrupted top size");
+
if ((unsigned long) (size) >= (unsigned long) (nb + MINSIZE))
{
remainder_size = size - nb;