OpenBSD is increasingly mandating W^X.  What does that mean?  Memory
can either be mapped writable, or it can be executable, but not
both (Write xor eXecute).  This is a security concern.  Without
W^X, an attacker can load their own code into memory and then execute
it.  W^X protects against this.

Unfortunately there is important third-party code, such as just-in-time
compilers, that still uses mmap(2) to make memory both writable and
executable, so for the time being, we have to arrange ourselves
with it.

For a binary to be allowed to violate W^X, it must
(1) reside on a filesystem that is mounted with the "wxallowed"
    flag (the installer enables this for /usr/local);
(2) be annotated with PT_OPENBSD_WXNEEDED at the ELF level.

So far, only (1) is strictly enforced and any program in violation
is terminated at once.

For (2), the W^X violation is logged (dmesg, syslog).  In recent
snapshots, the offending mmap() call has also begun to return an
error.  Alas, many programs don't handle this failure gracefully
and crash.

Now, obviously getting rid of W^X violations has to be the end goal,
but that will take time and effort.  In the meantime, offenders
*MUST* be marked wxneeded.  This is done by linking the executable
with "ld -z wxneeded".  When linking is performed through cc, which
is the usual case, you add "-Wl,-z,wxneeded" to the linking command
line.  That's it.

Currently only four affected ports are marked wxneeded.  More will
need this.  Please, when you see a port throwing "foo(4711): W^X
violation" log messages, look into adding wxneeded.

We can draw up a list of affected ports, but it isn't exactly hard
to notice.  Some ports already need wxneeded to build.  Presumably
there are a few others where it will only show up at run time.

This is important.  The W^X hammer is coming down and without
wxneeded annotations you will find that a number of your favorite
programs (e.g. everything Mozilla) will no longer run.

-- 
Christian "naddy" Weisgerber                          na...@mips.inka.de

Reply via email to