Subject: Re: Non executable mappings and compatibility options bugs
To: Chuck Silvers <chuq@chuq.com>
From: Emmanuel Dreyfus <manu@netbsd.org>
List: tech-kern
Date: 06/20/2004 21:24:46
Chuck Silvers <chuq@chuq.com> wrote:

> > 2) How does it affect other ports and other COMPAT_* options? As a lot
> > of OSes don't support non executable mappings, so I beleive we break
> > many things by defaulting to non executable mappings for them. I already
> > had to modify linux_exec_setup_stack() to get dynamic Linux/PowerPC
> > binaries linking again. I suspect the problem exists for other ports as
> > well. 
> it would be safest to default to making everything executable for other
> emulations until it can be verified that those binaries work ok with
> non-executable mappings.  this seems fine to me.

IS there a way to check that? If signal delivery is okay, where can it
break?
 
> > 3) How to fix it properly? I'm not sure duplicating the whole
> > elf32_load_psection() is a good idea. The other way would be to flag the
> > exec package as wanting execute bits everywhere, and add a test for that
> > in elf32_load_psection() and exec_setup_stack()  
> let's use a flag in struct emul to enable it (and undo the duplication of
> exec_setup_stack() that you already added).  

I propose P_NOEXECMAP, defined to 1 for native binaries, defaulting to 0
for everything else.

> let's check the flag in
> the vmcmd_* functions instead of in all the emulation code.

We can modify the required protection mask and add an execute bit if
P_NOEXECMAP is no set, in the following functions:
vmcmd_map_pagedvn()
vmcmd_readvn()
vmcmd_map_zero()
exec_setup_stack()   
 
> > If we go that way, it woulds probably make sense to have a sysctl to
> > force non executable mappings for OSes that don't support them: it may
> > break things but you get more security. 
> that would be fine.  do we have support for per-emulation sysctls?

We can do that for the next binary executed by execve and inherit the
property accross forks. That way it would be available on a per-process
basis, and it would even be usable for ill-programmed NetBSD binaries
that non executable mappings broke. What about something like this?

sysctl -w proc.$$.noexecmap=1 

But that would end up with eating one more bit in struct proc, to tell
that the P_NOEXECMAP bit is forced and should not be modified to a
per-emulation default value at execve time.
  
> > 4) Do we want to fix that for 2.0? 
> we'll know better once we see what the diffs look like.
> so far it sounds simple enough that there wouldn't be much risk.
> (we could leave out the sysctl stuff until later, if that helps.)

I have to sort out other trouble with iBook G4 before working on it (not
enough disk space to build two kernels). I hope I'll be able to propose
a patch soon.

-- 
Emmanuel Dreyfus
Il y a 10 sortes de personnes dans le monde: ceux qui comprennent 
le binaire et ceux qui ne le comprennent pas.
manu@netbsd.org