Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
linux-user: Prohibit brk() to to shrink below initial heap address
Since commit 86f0473 ("linux-user: Fix brk() to release pages") it's
possible for userspace applications to reduce their memory footprint by
calling brk() with a lower address and free up memory. Before that commit
guest heap memory was never unmapped.

But the Linux kernel prohibits to reduce brk() below the initial memory
address which is set at startup by the set_brk() function in binfmt_elf.c.
Such a range check was missed in commit 86f0473.

This patch adds the missing check by storing the initial brk value in
initial_target_brk and verify any new brk addresses against that value.

Tested with the i386 upx binary from
https://github.com/upx/upx/releases/download/v4.0.2/upx-4.0.2-i386_linux.tar.xz

Signed-off-by: Helge Deller <deller@gmx.de>
Tested-by: "Markus F.X.J. Oberhumer" <markus@oberhumer.com>
Fixes: 86f0473 ("linux-user: Fix brk() to release pages")
Cc: qemu-stable@nongnu.org
Buglink: upx/upx#683
(cherry picked from commit dfe4986)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
  • Loading branch information
hdeller authored and Michael Tokarev committed Jul 21, 2023
1 parent 1f96532 commit 6e4bf15
Showing 1 changed file with 7 additions and 1 deletion.
8 changes: 7 additions & 1 deletion linux-user/syscall.c
Expand Up @@ -801,12 +801,13 @@ static inline int host_to_target_sock_type(int host_type)
return target_type;
}

static abi_ulong target_brk;
static abi_ulong target_brk, initial_target_brk;
static abi_ulong brk_page;

void target_set_brk(abi_ulong new_brk)
{
target_brk = TARGET_PAGE_ALIGN(new_brk);
initial_target_brk = target_brk;
brk_page = HOST_PAGE_ALIGN(target_brk);
}

Expand All @@ -824,6 +825,11 @@ abi_long do_brk(abi_ulong brk_val)
return target_brk;
}

/* do not allow to shrink below initial brk value */
if (brk_val < initial_target_brk) {
brk_val = initial_target_brk;
}

new_brk = TARGET_PAGE_ALIGN(brk_val);
new_host_brk_page = HOST_PAGE_ALIGN(brk_val);

Expand Down

0 comments on commit 6e4bf15

Please sign in to comment.