diff options
author | Jens Wiklander <jens.wiklander@linaro.org> | 2021-10-28 08:37:04 +0200 |
---|---|---|
committer | Jérôme Forissier <jerome@forissier.org> | 2021-11-03 11:07:37 +0100 |
commit | 16dfecc2a143d08f2b271cbf3eadeb68d6dfeca5 (patch) | |
tree | af957adf6870feef90a16ce3a82de344f4efce6d /core | |
parent | a7474d1d0b780fc4f8a93883ae3f21320b155998 (diff) |
core: fix ASLR problem with short-descriptor table mappings
With short-descriptor table mappings, that is without LPAE, the user va
range is defined at the lowest addresses. Depending on the seed supplied
this could conflict with chosen base address for core mappings. Add a
check early in assign_mem_va() to avoid such conflicts.
Without this patch there's a risk of occasional panics like:
E/TC:0 0 Panic 'issue in linear address space' at core/arch/arm/mm/core_mmu.c:2147 <check_pa_matches_va>
E/TC:0 0 TEE load address @ 0xa34000
E/TC:0 0 Call stack:
E/TC:0 0 0x00a3a901
Reviewed-by: Etienne Carriere <etienne.carriere@linaro.org>
Acked-by: Jerome Forissier <jerome@forissier.org>
Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
Diffstat (limited to 'core')
-rw-r--r-- | core/arch/arm/mm/core_mmu.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/core/arch/arm/mm/core_mmu.c b/core/arch/arm/mm/core_mmu.c index 4db639ef..330edf35 100644 --- a/core/arch/arm/mm/core_mmu.c +++ b/core/arch/arm/mm/core_mmu.c @@ -916,6 +916,25 @@ static bool assign_mem_va(vaddr_t tee_ram_va, vaddr_t va = tee_ram_va; bool va_is_secure = true; + /* + * Check that we're not overlapping with the user VA range. + */ + if (IS_ENABLED(CFG_WITH_LPAE)) { + /* + * User VA range is supposed to be defined after these + * mappings have been established. + */ + assert(!core_mmu_user_va_range_is_defined()); + } else { + vaddr_t user_va_base = 0; + size_t user_va_size = 0; + + assert(core_mmu_user_va_range_is_defined()); + core_mmu_get_user_va_range(&user_va_base, &user_va_size); + if (tee_ram_va < (user_va_base + user_va_size)) + return false; + } + /* Clear eventual previous assignments */ for (map = memory_map; !core_mmap_is_end_of_table(map); map++) map->va = 0; |