From: Pochang Chen Date: Thu, 16 Aug 2018 19:24:24 +0000 (-0400) Subject: malloc: Verify size of top chunk. X-Git-Tag: glibc-2.29~525 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=30a17d8c95fbfb15c52d1115803b63aaa73a285c;p=thirdparty%2Fglibc.git 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. --- diff --git a/ChangeLog b/ChangeLog index cd60ef8399b..dc72e54f003 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2018-08-16 Pochang Chen + + * malloc/malloc.c (_int_malloc.c): Verify size of top chunk. + 2018-08-16 Siddhesh Poyarekar * benchtests/bench-strlen.c (do_test): Allocate buffers before diff --git a/malloc/malloc.c b/malloc/malloc.c index e247c77b7d4..9431108626c 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;