mailing list of musl libc
 help / color / mirror / code / Atom feed
From: orc <orc@sibserver.ru>
To: musl@lists.openwall.com
Subject: Re: noexecstack
Date: Mon, 6 Aug 2012 16:05:32 +0800	[thread overview]
Message-ID: <20120806160532.78e11db5@sibserver.ru> (raw)
In-Reply-To: <CAPLrYERO+Jc31kNAxt5h82U4nMWdxoYsqN414u383raxz1RamQ@mail.gmail.com>

On Mon, 6 Aug 2012 09:16:10 +0200
Daniel Cegiełka <daniel.cegielka@gmail.com> wrote:

> 2012/8/6 orc <orc@sibserver.ru>:
> > On Sun, 5 Aug 2012 23:35:36 +0200
> 
> > Correct me if I'm wrong, but this is ugly stuff.
> >
> > - binutils ld has -z noexecstack command line option.
> > - this (GNU_STACK) is binutils-specific (tinycc, for example, does
> > not generate ELFs with that section, and future direction should be
> > on that plain ELFs without any gnuish extensions IMO)
> > - Kernel sets executable stack by default, kernel can be patched
> > not to do that (that's one line patch per architecture)
> 
> Can you give some example of how to do it? It might be worthwhile to
> introduce it into the main repository of Linux. What do you think?

I used to set it globally for all archs directly in binfmt_elf.c (here
is a patch example):

diff -Naur linux-3.2.12.o/fs/binfmt_elf.c linux-3.2.12/fs/binfmt_elf.c
--- linux-3.2.12.o/fs/binfmt_elf.c	2012-03-20 00:03:17.000000000
+0800 +++ linux-3.2.12/fs/binfmt_elf.c	2012-08-06
15:41:51.774013640 +0800 @@ -571,7 +571,7 @@
 	unsigned long interp_load_addr = 0;
 	unsigned long start_code, end_code, start_data, end_data;
 	unsigned long reloc_func_desc __maybe_unused = 0;
-	int executable_stack = EXSTACK_DEFAULT;
+	int executable_stack = EXSTACK_DISABLE_X;
 	unsigned long def_flags = 0;
 	struct {
 		struct elfhdr elf_ex;

This is a hack, and maybe executable_stack maybe set elsewhere. I did
not tried to trace that code. But it works (of course ELFs marked to be
with execstack will crash).
I think this may have benefits, but it always was controlled in
userspace, kernel defaults to executable stack because there are some
other compilers can be that may rely on this default. I tested tinycc,
it has no any issues (i.e. generates code that does not need executable
stack, and does not generates GNU_STACK extended section)

> 
> > - binutils can be patched to not produce ELFs with executable stack
> > by default
> >
> > While some of options I listed here may harm some GCC or binutils
> > internals (I don't know), I see an utility that comes with
> > grsecurity patches (paxctl) that operates that section (GNU_STACK),
> > converting it into it's own.
> > I tested a system with patched binutils and kernel (but binutils
> > patch here will be enough) without any problems.
> 
> It would be very nice if we could solve this problem in this way. I'm
> currently using this patch, but this is not the best solution in my
> opinion. Ideally if the system (kernel, binutils, libc) enforce
> noexecstack by default... definitely worth look closer at this issue.

Consider this patch as enforcing binutils' noexecstack by default:

diff -Naur binutils-2.17.50.0.17.o/ld/ldmain.c
binutils-2.17.50.0.17/ld/ldmain.c ---
binutils-2.17.50.0.17.o/ld/ldmain.c	2007-06-19
01:31:40.000000000 +0800 +++ binutils-2.17.50.0.17/ld/ldmain.c
2012-08-03 19:59:26.658980680 +0800 @@ -281,6 +281,8 @@
link_info.pei386_auto_import = -1; link_info.spare_dynamic_tags = 5;
   link_info.sharable_sections = FALSE;
+  link_info.execstack = FALSE;
+  link_info.noexecstack = TRUE;
 
   ldfile_add_arch ("");
   emulation = get_emulation (argc, argv);

(this one for binutils 2.17.50.0.17, recent maybe patched with finding
where link_info is initialized and appending this two lines)

GCC generates same .note.GNU-stack section definition in it's asm
output, as seen in your patch, but I don't know when it needs
executable stack and generates another definition.

libc plays no role here at enforcing executable stacks last time I
checked. It does some initialization of memory permissions in dynamic
linker, but better to ask Rich about that code.

Applying kernel patch may render your existing systems unbootable if it
is not glibc system.


If you don't want to patch and rebuild binutils and kernel, then the
best way to enforce noexecstack notes into ELFs is passing this command
line opts:

gcc: gcc -Wl,-z -Wl,noexecstack [the rest here...]
ld: ld -z noexecstack [...]

> Thanks,
> Daniel



  parent reply	other threads:[~2012-08-06  8:05 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-08-05 21:35 noexecstack Daniel Cegiełka
2012-08-05 21:41 ` noexecstack Anthony G. Basile
2012-08-05 21:46 ` noexecstack Rich Felker
2012-08-05 22:01   ` noexecstack Nathan McSween
2012-08-05 22:45     ` noexecstack Rich Felker
2012-08-06  6:43   ` noexecstack Szabolcs Nagy
2012-08-06  9:37     ` noexecstack Rich Felker
2012-08-06 11:19       ` noexecstack Szabolcs Nagy
2012-08-06 11:32         ` noexecstack Rich Felker
2012-08-06 21:11           ` noexecstack Kant
2012-10-03 15:54             ` noexecstack Rich Felker
2012-08-06  6:45 ` noexecstack orc
2012-08-06  7:16   ` noexecstack Daniel Cegiełka
2012-08-06  7:55     ` noexecstack Justin Cormack
2012-08-06  8:05     ` orc [this message]
2012-08-06  8:46       ` noexecstack Daniel Cegiełka
2012-08-06  9:11         ` noexecstack orc
2012-08-06  9:15           ` noexecstack orc
2012-08-07 11:57   ` noexecstack Vasily Kulikov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120806160532.78e11db5@sibserver.ru \
    --to=orc@sibserver.ru \
    --cc=musl@lists.openwall.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

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).