From a8cf3fef2aa2201014c35c3487da222ccfedfc1c Mon Sep 17 00:00:00 2001 From: Evgenii Stepanov Date: Mon, 8 Jun 2020 16:21:35 -0700 Subject: Add randomized padding around shared library mappings. Improve ASLR by increasing the randomly sized gaps between shared library mappings, and keep them mapped PROT_NONE. Bug: 158113540 Test: look at /proc/$$/maps Change-Id: Ie72c84047fb624fe2ac8b7744b2a2d0d255ea974 --- linker/linker.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'linker/linker.cpp') diff --git a/linker/linker.cpp b/linker/linker.cpp index edf0329c9..9301f8cb5 100644 --- a/linker/linker.cpp +++ b/linker/linker.cpp @@ -301,13 +301,14 @@ static void soinfo_free(soinfo* si) { return; } - if (si->base != 0 && si->size != 0) { + void* start = reinterpret_cast(si->has_min_version(6) ? si->get_map_start() : si->base); + size_t size = si->has_min_version(6) ? si->get_map_size() : si->size; + if (start != nullptr && size != 0) { if (!si->is_mapped_by_caller()) { - munmap(reinterpret_cast(si->base), si->size); + munmap(start, size); } else { // remap the region as PROT_NONE, MAP_ANONYMOUS | MAP_NORESERVE - mmap(reinterpret_cast(si->base), si->size, PROT_NONE, - MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); + mmap(start, size, PROT_NONE, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); } } @@ -599,6 +600,8 @@ class LoadTask { si_->load_bias = elf_reader.load_bias(); si_->phnum = elf_reader.phdr_count(); si_->phdr = elf_reader.loaded_phdr(); + si_->set_map_start(elf_reader.map_start()); + si_->set_map_size(elf_reader.map_size()); return true; } -- cgit v1.2.3