public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Ingo Molnar <mingo@elte.hu>
To: Linus Torvalds <torvalds@osdl.org>
Cc: Andy Lutomirski <luto@myrealbox.com>, Andi Kleen <ak@suse.de>,
	Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andrew Morton <akpm@osdl.org>,
	arjanv@redhat.com, suresh.b.siddha@intel.com,
	jun.nakajima@intel.com
Subject: Re: [announce] [patch] NX (No eXecute) support for x86,   2.6.7-rc2-bk2
Date: Fri, 4 Jun 2004 19:20:08 +0200	[thread overview]
Message-ID: <20040604172008.GA4993@elte.hu> (raw)
In-Reply-To: <20040604160628.GA32375@elte.hu>


correction to the table:

>  PT_GNU_STACK not present: legacy app, stack and heap executable
>  PT_GNU_STACK present but X: heap non-executable, stack executable
>  PT_GNU_STACK present and !X: both heap and stack are non-executable.
> 
> this method is what is used in Fedora and it works pretty well.

the patch below implements this simple and pretty robust logic ontop of
the -AF NX patch.

in fact it's more conservative than what we have in Fedora because it
will turn on executability even for data mmap()s. (in theory there could
be third party apps that expect a data mmap to be executable on x86 even
if it's not PROT_EXEC.)

I've test-booted it on an athlon64 box running FC2 and have tested an
old PT_GNU_STACK-less binary and it indeed has all data mappings
executable, explicitly. (I've also test-booted it on an x86 box with an
older distribution installed - works as expected.)

newly-compiled applications that have the PT_GNU_STACK flag (either as X
or NX) will have the heap non-executable, and the stack executable
depending on the value of the flag.

hm?

	Ingo

--- linux/fs/binfmt_elf.c	
+++ linux/fs/binfmt_elf.c	
@@ -491,6 +491,7 @@ static int load_elf_binary(struct linux_
 	char passed_fileno[6];
 	struct files_struct *files;
 	int executable_stack = EXSTACK_DEFAULT;
+	unsigned long def_flags = 0;
 	
 	/* Get the exec-header */
 	elf_ex = *((struct elfhdr *) bprm->buf);
@@ -622,7 +623,10 @@ static int load_elf_binary(struct linux_
 				executable_stack = EXSTACK_ENABLE_X;
 			else
 				executable_stack = EXSTACK_DISABLE_X;
+			break;
 		}
+	if (i == elf_ex.e_phnum)
+		def_flags |= VM_EXEC | VM_MAYEXEC;
 
 	/* Some simple consistency checks for the interpreter */
 	if (elf_interpreter) {
@@ -690,6 +694,7 @@ static int load_elf_binary(struct linux_
 	current->mm->end_code = 0;
 	current->mm->mmap = NULL;
 	current->flags &= ~PF_FORKNOEXEC;
+	current->mm->def_flags = def_flags;
 
 	/* Do this immediately, since STACK_TOP as used in setup_arg_pages
 	   may depend on the personality.  */
--- linux/fs/exec.c	
+++ linux/fs/exec.c	
@@ -431,6 +431,7 @@ int setup_arg_pages(struct linux_binprm 
 			mpnt->vm_flags = VM_STACK_FLAGS & ~VM_EXEC;
 		else
 			mpnt->vm_flags = VM_STACK_FLAGS;
+		mpnt->vm_flags |= mm->def_flags;
 		mpnt->vm_page_prot = protection_map[mpnt->vm_flags & 0x7];
 		insert_vm_struct(mm, mpnt);
 		mm->total_vm = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT;
--- linux/include/asm-i386/page.h	
+++ linux/include/asm-i386/page.h	
@@ -138,7 +138,7 @@ static __inline__ int get_order(unsigned
 
 #define virt_addr_valid(kaddr)	pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
 
-#define VM_DATA_DEFAULT_FLAGS	(VM_READ | VM_WRITE | VM_EXEC | \
+#define VM_DATA_DEFAULT_FLAGS	(VM_READ | VM_WRITE | \
 				 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
 
 #endif /* __KERNEL__ */

  reply	other threads:[~2004-06-04 17:19 UTC|newest]

Thread overview: 66+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-06-02 20:50 [announce] [patch] NX (No eXecute) support for x86, 2.6.7-rc2-bk2 Ingo Molnar
2004-06-02 21:00 ` Christoph Hellwig
2004-06-02 21:07   ` Ingo Molnar
2004-06-02 21:13 ` Linus Torvalds
2004-06-02 21:17   ` Arjan van de Ven
2004-06-02 21:31     ` Doug McNaught
2004-06-08  8:46       ` Jakub Jelinek
2004-06-03  1:12     ` Joel Becker
2004-06-03  1:27       ` Andi Kleen
2004-06-03  6:24       ` Arjan van de Ven
2004-06-03 20:37     ` jlnance
2004-06-03  7:21   ` Ingo Molnar
2004-06-03 12:44     ` Ingo Molnar
2004-06-03 15:54       ` Andi Kleen
2004-06-03 23:01         ` Andy Lutomirski
2004-06-03 23:08           ` Andi Kleen
2004-06-03 23:54             ` Andy Lutomirski
2004-06-04  0:05               ` Andy Lutomirski
2004-06-04  9:25             ` Ingo Molnar
2004-06-04 15:26               ` Andy Lutomirski
2004-06-04 15:36                 ` Linus Torvalds
2004-06-04 15:41                   ` Arjan van de Ven
2004-06-04 15:47                     ` Linus Torvalds
2004-06-04 15:51                       ` Arjan van de Ven
2004-06-04 16:02                         ` Linus Torvalds
2004-06-04 16:13                           ` Andi Kleen
2004-06-04 16:37                             ` Arjan van de Ven
2004-06-04 16:40                               ` Christoph Hellwig
2004-06-04 17:27                                 ` David Mosberger
2004-06-04 17:30                                 ` Andi Kleen
2004-06-08  9:07                             ` Jakub Jelinek
2004-06-08  9:14                               ` Andi Kleen
2004-06-08  9:19                                 ` Arjan van de Ven
2004-06-04 16:51                           ` Ulrich Drepper
2004-06-08 17:15                             ` Bill Davidsen
2004-06-04 18:11                         ` Gerhard Mack
2004-06-04 18:12                           ` Arjan van de Ven
2004-06-04 16:06                   ` Ingo Molnar
2004-06-04 17:20                     ` Ingo Molnar [this message]
2004-06-04 17:22                       ` Ingo Molnar
2004-06-04 17:32                         ` Ingo Molnar
2004-06-03 19:24       ` Suresh Siddha
2004-06-03 20:37         ` Andi Kleen
2004-06-03 22:58           ` Suresh Siddha
2004-06-03 23:06             ` Andi Kleen
2004-06-04  9:30             ` Ingo Molnar
2004-06-03 12:57     ` Brian Gerst
2004-06-04  9:39       ` Ingo Molnar
2004-06-04 10:41         ` Christoph Hellwig
2004-06-04 10:48           ` William Lee Irwin III
2004-06-03 16:21     ` Ulrich Drepper
2004-06-03 19:30   ` Kurt Garloff
2004-06-02 21:43 ` Andi Kleen
2004-06-03  0:11 ` Rusty Russell
2004-06-03  0:17   ` Jeff Garzik
2004-06-03  7:24   ` Ingo Molnar
2004-06-03  8:47   ` Ingo Molnar
2004-06-03  8:53   ` Ingo Molnar
2004-06-04  0:04     ` Rusty Russell
2004-06-03  9:07 ` Ingo Molnar
2004-06-03 14:36 ` Gerhard Mack
2004-06-03 16:22   ` Arjan van de Ven
2004-06-04  9:36   ` Ingo Molnar
2004-06-04 11:59     ` Stephen Wille Padnos
     [not found] <22L0f-5Ci-11@gated-at.bofh.it>
     [not found] ` <22O7J-8dw-11@gated-at.bofh.it>
     [not found]   ` <22Wf4-5Xv-23@gated-at.bofh.it>
2004-06-03  9:43     ` Andi Kleen
  -- strict thread matches above, loose matches on Subject: below --
2004-06-04 18:01 Nakajima, Jun

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=20040604172008.GA4993@elte.hu \
    --to=mingo@elte.hu \
    --cc=ak@suse.de \
    --cc=akpm@osdl.org \
    --cc=arjanv@redhat.com \
    --cc=jun.nakajima@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@myrealbox.com \
    --cc=suresh.b.siddha@intel.com \
    --cc=torvalds@osdl.org \
    /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.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox