linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: [PATCH] binfmt_elf: Fix bug in loading of PIE binaries
@ 2015-07-16 19:57 Sebastian Parschauer
  2015-07-16 20:34 ` Kees Cook
  0 siblings, 1 reply; 6+ messages in thread
From: Sebastian Parschauer @ 2015-07-16 19:57 UTC (permalink / raw)
  To: Michael Davidson
  Cc: Alexander Viro, Jiri Kosina, Kees Cook, linux-fsdevel,
	Sebastian Parschauer

Hi,

I'm a professional Linux game cheater and the co-maintainer of scanmem.
With scanmem we determine the load addresses for PIC and PIE binaries to
be able to support static memory cheating with ASLR. At the moment
ugtrain is the only universal game trainer able to determine the PIE
load address as well and to re-add it to the found match offset from
scanmem.

I'd like to complain a bit about this patch as it makes the address
space layout for the executable really ugly by loading unrelated stuff
between .text and .rodata.

Is it really required on top of 3.13 or 3.16 where Ubuntu has put it?

I've also checked v4.2-rc1. There everything is beautiful again.
Thank you very much for that!

References:
https://github.com/scanmem/scanmem/issues/122
https://github.com/ugtrain/ugtrain

Thanks,
Sebastian

^ permalink raw reply	[flat|nested] 6+ messages in thread
* [PATCH] binfmt_elf: Fix bug in loading of PIE binaries.
@ 2015-04-13 22:49 Michael Davidson
  2015-05-19 15:01 ` James Hogan
  0 siblings, 1 reply; 6+ messages in thread
From: Michael Davidson @ 2015-04-13 22:49 UTC (permalink / raw)
  To: Alexander Viro, Jiri Kosina, Andrew Morton
  Cc: linux-fsdevel, linux-kernel, Michael Davidson

With CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE enabled, and a normal
top-down address allocation strategy, load_elf_binary() will
attempt to map a PIE binary into an address range immediately
below mm->mmap_base.

Unfortunately, load_elf_ binary() does not take account of the
need to allocate sufficient space for the entire binary which
means that, while the first PT_LOAD segment is mapped below
mm->mmap_base, the subsequent PT_LOAD segment(s) end up being
mapped above mm->mmap_base into the are that is supposed to
be the "gap" between the stack and the binary.

Since the size of the "gap" on x86_64 is only guaranteed to be
128MB this means that binaries with large data segments > 128MB
can end up mapping part of their data segment over their stack
resulting in corruption of the stack (and the data segment once
the binary starts to run).

Any PIE binary with a data segment > 128MB is vulnerable to this
although address randomization means that the actual gap between
the stack and the end of the binary is normally greater than 128MB.
The larger the data segment of the binary the higher the probability
of failure.

Fix this by calculating the total size of the binary in the same
way as load_elf_interp().

Signed-off-by: Michael Davidson <md@google.com>
---
 fs/binfmt_elf.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
index 995986b..d925f55 100644
--- a/fs/binfmt_elf.c
+++ b/fs/binfmt_elf.c
@@ -862,6 +862,7 @@ static int load_elf_binary(struct linux_binprm *bprm)
 	    i < loc->elf_ex.e_phnum; i++, elf_ppnt++) {
 		int elf_prot = 0, elf_flags;
 		unsigned long k, vaddr;
+		unsigned long total_size = 0;
 
 		if (elf_ppnt->p_type != PT_LOAD)
 			continue;
@@ -924,10 +925,16 @@ static int load_elf_binary(struct linux_binprm *bprm)
 #else
 			load_bias = ELF_PAGESTART(ELF_ET_DYN_BASE - vaddr);
 #endif
+			total_size = total_mapping_size(elf_phdata,
+							loc->elf_ex.e_phnum);
+			if (!total_size) {
+				error = -EINVAL;
+				goto out_free_dentry;
+			}
 		}
 
 		error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt,
-				elf_prot, elf_flags, 0);
+				elf_prot, elf_flags, total_size);
 		if (BAD_ADDR(error)) {
 			retval = IS_ERR((void *)error) ?
 				PTR_ERR((void*)error) : -EINVAL;
-- 
2.2.0.rc0.207.ga3a616c


^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2015-08-08 21:36 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-07-16 19:57 [PATCH] binfmt_elf: Fix bug in loading of PIE binaries Sebastian Parschauer
2015-07-16 20:34 ` Kees Cook
2015-07-19 20:28   ` Sebastian Parschauer
2015-08-08 21:36   ` Greg KH
  -- strict thread matches above, loose matches on Subject: below --
2015-04-13 22:49 Michael Davidson
2015-05-19 15:01 ` James Hogan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).