077c9d
commit 30a17d8c95fbfb15c52d1115803b63aaa73a285c
077c9d
Author: Pochang Chen <johnchen902@gmail.com>
077c9d
Date:   Thu Aug 16 15:24:24 2018 -0400
077c9d
077c9d
    malloc: Verify size of top chunk.
077c9d
    
077c9d
    The House of Force is a well-known technique to exploit heap
077c9d
    overflow. In essence, this exploit takes three steps:
077c9d
    1. Overwrite the size of top chunk with very large value (e.g. -1).
077c9d
    2. Request x bytes from top chunk. As the size of top chunk
077c9d
       is corrupted, x can be arbitrarily large and top chunk will
077c9d
       still be offset by x.
077c9d
    3. The next allocation from top chunk will thus be controllable.
077c9d
    
077c9d
    If we verify the size of top chunk at step 2, we can stop such attack.
077c9d
077c9d
diff --git a/malloc/malloc.c b/malloc/malloc.c
077c9d
index e450597e2e527fb7..d8d4581a9dcea80a 100644
077c9d
--- a/malloc/malloc.c
077c9d
+++ b/malloc/malloc.c
077c9d
@@ -4084,6 +4084,9 @@ _int_malloc (mstate av, size_t bytes)
077c9d
       victim = av->top;
077c9d
       size = chunksize (victim);
077c9d
 
077c9d
+      if (__glibc_unlikely (size > av->system_mem))
077c9d
+        malloc_printerr ("malloc(): corrupted top size");
077c9d
+
077c9d
       if ((unsigned long) (size) >= (unsigned long) (nb + MINSIZE))
077c9d
         {
077c9d
           remainder_size = size - nb;