[RFC PATCH 0/3] Improved ALSR
Topi Miettinen
toiwoton@gmail.com
Mon Nov 23 16:06:01 GMT 2020
On 4.10.2020 16.09, Topi Miettinen wrote:
> Problem with using sbrk() for allocations is that the location of the
> memory is relatively predicatable since it's always located next to
> data segment. This series makes malloc() and TCB use mmap() instead.
No comments at all? I see several implementation options here:
1. Always use mmap() instead of sbrk(), delete any uses of sbrk()
I have hard time thinking why sbrk() would ever be the preferred choice
over mmap(), especially considering security. There may be some bytes
wasted, so embedded systems could want to save those and also MMU-less
systems can't map pages anywhere, but then those probably won't use glibc.
2. Conditionally use mmap() instead of sbrk()
Something like `#define USE_SBRK`, enabled by `configure` or a header
file. Sub-options:
2.1. Default to sbrk(), use mmap() only for Linux
This is of course safer if some obscure system needs sbrk(). It would be
even safer to limit mmap() only to Linux/x86_64 (which is all I care).
2.2. Default to mmap() but don't enable sbrk() anywhere
This is pretty much like #1 but after breakage is noticed for some
obscure systems, it's easy to `#define USE_SBRK` somewhere.
I've been using a patched glibc for a month without seeing problems. I
enabled audit logging for the brk() system call and installed a global
seccomp filter (in initrd) which returns ENOSYS to catch any uses. So
far I've only noticed that cpp (used by X11 startup in addition to
compiling) calls sbrk() to check memory usage. Perhaps it should use
official malloc statistics interface instead, since malloc() may use
mmap() for other reasons and then sbrk() won't return true data.
It's easy to check that sbrk() has not been used with the command `grep
'\[heap\]' /proc/*/maps` (as root), which should print nothing since
there are no heaps (as in "extended data segment") anymore.
-Topi
> Topi Miettinen (3):
> csu: randomize location of TCB
> malloc: always use mmap() to improve ASLR
> dl-sysdep: disable remaining calls to sbrk()
>
> csu/libc-tls.c | 20 ++++++++++++++------
> elf/dl-sysdep.c | 2 ++
> malloc/arena.c | 5 ++++-
> malloc/malloc.c | 16 +++++++++++++---
> malloc/morecore.c | 2 ++
> sysdeps/unix/sysv/linux/dl-sysdep.c | 2 ++
> sysdeps/unix/sysv/linux/mmap64.c | 19 +++++++++++++++++++
> sysdeps/unix/sysv/linux/mmap_internal.h | 3 +++
> 8 files changed, 59 insertions(+), 10 deletions(-)
>
More information about the Libc-alpha
mailing list